(!****************************************************** 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("") writeln("") writeln("") writeln("
Total return: ", returnsol, "Problem instance: ", INPUTFILE,"
Number of shares: ", numsharessol, "Date: ", datetime(SYS_NOW),"
 
") writeln("") writeln("") forall(s in SHARES | fracsol(s)>0) writeln("") writeln("
ValuePercentage
", s, "", strfmt(fracsol(s)*100,4,2), "%
") writeln("") writeln("") fclose(F_OUTPUT) end-procedure end-model