(!******************************************************
Mosel Example Problems
======================
file runfoliodistr.mos
``````````````````````
Main model running portfolio optimization model as submodel
on a remote Mosel instance.
Runs model foliomemio.mos.
*** ATTENTION: This model will return an error if ***
*** no more than one Xpress licence is available. ***
(c) 2010 Fair Isaac Corporation
author: S.Heipcke, July 2010
*******************************************************!)
model "Run portfolio optimization model remotely"
uses "mmjobs" ! Use multiple model handling
uses "mmsystem", "mmxprs"
parameters
MODELFILE = "foliomemio" ! Optimization model
INPUTFILE = "folio10.dat" ! File with problem data
OUTPUTFILE = "solout.dat" ! File for solution output
MAXRISK = 1/3 ! Max. investment into high-risk values
MINREG = 0.2 ! Min. investment per geogr. region
MAXREG = 0.5 ! Max. investment per geogr. region
MAXSEC = 0.25 ! Max. investment per ind. sector
MAXVAL = 0.2 ! Max. investment per share
MINVAL = 0.1 ! Min. investment per share
MAXNUM = 15 ! Max. number of different assets
end-parameters
forward procedure write_html_results
declarations
SHARES: set of string ! Set of shares
returnsol: real ! Solution values
numsharessol,status: integer
fracsol: dynamic array(SHARES) of real ! Fraction of capital used per share
buysol: dynamic array(SHARES) of real ! 1 if asset is in portfolio, 0 otherwise
foliomod: Model ! Mosel model
moselinst: Mosel ! Mosel instance
end-declarations
! Compile the optimization model locally
if compile(MODELFILE+".mos") <> 0 then
writeln("Error during model compilation")
exit(1)
end-if
! Start a remote Mosel instance:
! "" stands for the node running this model; try IP addresses or host names
if connect(moselinst, "")<>0 then exit(2); end-if
! Load the optimization model into the remote instance
load(moselinst, foliomod, "rmt:"+MODELFILE+".bim")
fdelete(MODELFILE+".bim")
run(foliomod, "MAXRISK=" + MAXRISK + ",MINREG=" + MINREG +
",MAXREG=" + MAXREG + ",MAXSEC=" + MAXSEC +
",MAXVAL=" + MAXVAL + ",MINVAL=" + MINVAL +
",MAXNUM=" + MAXNUM + ",DATAFILE='rmt:" + INPUTFILE +
"',OUTPUTFILE='rmt:" + OUTPUTFILE + "'")
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
initializations from OUTPUTFILE
returnsol as 'RETSOL'
numsharessol as 'NUMSHARES'
fracsol as 'FRAC'
buysol as 'BUY'
status as 'SOLSTATUS'
end-initializations
case status of
XPRS_OPT: writeln("Problem solved to optimality")
XPRS_UNF: writeln("Problem solving unfinished")
XPRS_INF: writeln("Problem is infeasible")
XPRS_UNB,XPRS_OTH: writeln("No solution available")
end-case
! Solution printing
writeln("Total return: ", returnsol)
writeln("Number of shares: ", numsharessol)
forall(s in SHARES | fracsol(s)>0)
writeln(s, ": ", fracsol(s)*100, "% (", buysol(s), ")")
write_html_results
! *********** Writing an HTML result file ***********
procedure write_html_results
setparam("datetimefmt", "%0d-%N-%y, %0H:%0M:%0S")
HTMLFILE:= INPUTFILE + "_sol.html"
fopen(HTMLFILE, F_OUTPUT)
writeln("")
writeln("
")
writeln("")
writeln("")
writeln("")
writeln("Portfolio Optimization Results
")
writeln("")
writeln("Total return: ",
returnsol, " | Problem instance: ",
INPUTFILE," |
")
writeln("Number of shares: ", numsharessol, " | Date: ", datetime(SYS_NOW)," |
")
writeln(" |
")
writeln("
")
writeln("")
writeln("Value | Percentage |
")
forall(s in SHARES | fracsol(s)>0)
writeln("", s, " | ", strfmt(fracsol(s)*100,4,2),
"% |
")
writeln("
")
writeln("")
writeln("")
fclose(F_OUTPUT)
end-procedure
end-model