/******************************************************** Xpress-BCL C Example Problems ============================= file folioenumsol.c ``````````````````` Modeling a MIP problem to perform portfolio optimization. Same model as in foliomip3.c. -- Using the solution enumerator -- (c) 2009 Fair Isaac Corporation author: S.Heipcke, May 2009, rev. Jul. 2014 ********************************************************/ #include #include #include #include #include "xprb.h" #include "xprs.h" #include "xprs_mse_defaulthandler.h" #define MAXNUM 7 /* Max. number of different assets */ #define MAXRISK 1/3 /* Max. investment into high-risk values */ #define MINREG 0,2 /* Min. investment per geogr. region */ #define MAXREG 0,5 /* Max. investment per geogr. region */ #define MAXSEC 0,25 /* Max. investment per ind. sector */ #define MAXVAL 0,2 /* Max. investment per share */ #define MINVAL 0,1 /* Min. investment per share */ #define DATAFILE "folio10.cdat" /* File with problem data */ #define MAXENTRIES 10000 int NSHARES; /* Number of shares */ int NRISK; /* Number of high-risk shares */ int NREGIONS; /* Number of geographical regions */ int NTYPES; /* Number of share types */ double *RET; /* Estimated return in investment */ int *RISK; /* High-risk values among shares */ char **LOC; /* Geogr. region of shares */ char **SEC; /* Industry sector of shares */ char **SHARES_n; char **REGIONS_n; char **TYPES_n; XPRBprob prob; XPRBvar *frac; /* Fraction of capital used per share */ XPRBvar *buy; /* 1 if asset is in portfolio, 0 otherwise */ #include "readfoliodata.c_" void print_sol(int num); int main(int argc, char **argv) { int s,r,t, nMaxSols, nSols, nCols, i; XPRBctr Risk,Return,Cap,Num; XPRBctr *MinReg, *MaxReg, *LimSec, LinkL, LinkU; XPRSmipsolpool msp; XPRSmipsolenum mse; double *xsol; int *solIDs; readdata(DATAFILE); /* Data input from file */ prob = XPRBnewprob("FolioMIP3"); /* Initialize a new problem in BCL */ /* Create the decision variables (including upper bounds for `frac') */ frac = (XPRBvar*)malloc(NSHARES*sizeof(XPRBvar)); buy = (XPRBvar*)malloc(NSHARES*sizeof(XPRBvar)); for(s=0;s0) { XPRBaddterm(MinReg[r], frac[s], 1); XPRBaddterm(MaxReg[r], frac[s], 1); } XPRBaddterm(MinReg[r], NULL, MINREG); XPRBaddterm(MaxReg[r], NULL, MAXREG); } /* Diversification across industry sectors */ LimSec = (XPRBctr*)malloc(NTYPES*sizeof(XPRBctr)); for(t=0;t0) XPRBaddterm(LimSec[t], frac[s], 1); XPRBaddterm(LimSec[t], NULL, MAXSEC); } /* Spend all the capital */ Cap = XPRBnewctr(prob, "Cap", XPRB_E); for(s=0;s0,5) printf(" %s : %g%% (%g)\n", SHARES_n[s], XPRBgetsol(frac[s])*100, XPRBgetsol(buy[s])); }