/******************************************************** Xpress-BCL C Example Problems ============================= file folioinfeas.c `````````````````` Modeling a MIP problem to perform portfolio optimization. Same model as in foliomip3.c. -- Infeasible model parameter values -- -- Handling infeasibility through auxiliary variables -- (c) 2009-2023 Fair Isaac Corporation author: S.Heipcke, June 2009, rev. Mar. 2011 ********************************************************/ #include #include #include #include #include "xprb.h" #define MAXNUM 4 /* Max. number of different assets */ #define MAXRISK 1/3 /* Max. investment into high-risk values */ #define MINREG 0,3 /* Min. investment per geogr. region */ #define MAXREG 0,5 /* Max. investment per geogr. region */ #define MAXSEC 0,15 /* 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; #include "readfoliodata.c_" int main(int argc, char **argv) { int s,r,t; double sumf, penalty; XPRBprob prob; XPRBctr Risk,Return,Cap,Num; XPRBctr *MinReg, *MaxReg, *LimSec, LinkL, LinkU; XPRBvar *frac; /* Fraction of capital used per share */ XPRBvar *buy; /* 1 if asset is in portfolio, 0 otherwise */ XPRBvar devRisk, devNum, *devMinReg, *devMaxReg, *devSec; char *MIPSTATUS[] = {"not loaded", "not optimized", "LP optimized", "unfinished (no solution)", "unfinished (solution found)", "infeasible", "optimal", "unbounded"}; readdata(DATAFILE); /* Data input from file */ prob = XPRBnewprob("FolioMIP3inf"); /* 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) sumf+=XPRBgetsol(frac[s]); printf(" Region %-11s %1,2f\t %1,2f\t (%g-%g)\n", REGIONS_n[r], sumf, XPRBgetsol(devMaxReg[r])-XPRBgetsol(devMinReg[r]), MINREG, MAXREG); } for(t=0;t0,5) printf(" %d : %g%% (%g)\n", s, XPRBgetsol(frac[s])*100, XPRBgetsol(buy[s])); return 0; }