(!****************************************************** Mosel Example Problems ====================== file foliolptune.mos ```````````````````` Modeling a small LP problem to perform portfolio optimization. -- Added Tuner flags -- (c) 2008 Fair Isaac Corporation author: S.Heipcke, Aug. 2003 *******************************************************!) model "Portfolio optimization with LP" uses "mmxprs" ! Use Xpress Optimizer uses "mmsystem" public declarations SHARES = 1..10 ! Set of shares RISK = {2,3,4,9,10} ! Set of high-risk values among shares NA = {1,2,3,4} ! Set of shares issued in N.-America RET: array(SHARES) of real ! Estimated return in investment frac: array(SHARES) of mpvar ! Fraction of capital used per share end-declarations RET:: [5,17,26,12,8,9,7,6,31,21] ! Objective: total return Return:= sum(s in SHARES) RET(s)*frac(s) ! Limit the percentage of high-risk values sum(s in RISK) frac(s) <= 1/3 ! Minimum amount of North-American values sum(s in NA) frac(s) >= 0.5 ! Spend all the capital sum(s in SHARES) frac(s) = 1 ! Upper bounds on the investment per share forall(s in SHARES) frac(s) <= 0.3 (! Problem output from Mosel (to check problem definition, not for tuning): exportprob(EP_MAX,'foliomos.lp', Return); exportprob(EP_MPS,'foliomos.mat', Return); ! Problem output from the solver (for tuning): setparam('XPRS_LOADNAMES',true) loadprob(Return); writeprob('folioopt.mat', 'x'); !) ! Display progress log setparam('XPRS_VERBOSE',true) ! Solve the problem setparam("XPRS_TUNERMAXTIME", 60) setparam("XPRS_TUNEROUTPUTPATH", string(expandpath("TuneOut"))) maximize(XPRS_TUNE, Return) (! declarations status:array({XPRS_OPT,XPRS_UNF,XPRS_INF,XPRS_UNB,XPRS_OTH}) of string end-declarations status::([XPRS_OPT,XPRS_UNF,XPRS_INF,XPRS_UNB,XPRS_OTH])[ "Optimum found","Unfinished","Infeasible","Unbounded","Failed"] writeln("Problem status: ", status(getprobstat)) !) ! Solution printing writeln("Total return: ", getobjval) forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%") end-model