/******************************************************** Xpress-BCL C Example Problems ============================= file foliomiis.c ```````````````` Modeling a MIP problem to perform portfolio optimization. Same model as in foliomip3.c. -- Infeasible model parameter values -- -- Retrieving MIIS -- (c) 2011-2023 Fair Isaac Corporation author: S.Heipcke, Mar. 2011 ********************************************************/ #include #include #include #include #include "xprb.h" #define MAXNUM 5 /* Max. number of different assets */ #define MAXRISK 1/4 /* Max. investment into high-risk values */ #define MINREG 0,1 /* Min. investment per geogr. region */ #define MAXREG 0,25 /* Max. investment per geogr. region */ #define MAXSEC 0,15 /* Max. investment per ind. sector */ #define MAXVAL 0,225 /* Max. investment per share */ #define MINVAL 0,1 /* Min. investment per share */ #define DATAFILE "folio5.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,i; 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 */ XPRBctr *iisctr; XPRBvar *iisvar; int numv, numc, numiis; 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) { /* Print all variables in the IIS */ printf(" Variables: "); for(i=0;i0) { /* Print all constraints in the IIS */ printf(" Constraints: "); for(i=0;i