/******************************************************** Xpress-BCL C Example Problems ============================= file folioheur.c ```````````````` Modeling a small MIP problem to perform portfolio optimization. -- Heuristic solution -- (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Dec. 2003, rev. Mar. 2011 ********************************************************/ #include #include "xprb.h" #include "xprs.h" #define MAXNUM 4 /* Max. number of different assets */ #define NSHARES 10 /* Number of shares */ #define NRISK 5 /* Number of high-risk shares */ #define NNA 4 /* Number of North-American shares */ void solveHeur(void); double RET[] = {5,17,26,12,8,9,7,6,31,21}; /* Estimated return in investment */ int RISK[] = {1,2,3,8,9}; /* High-risk values among shares */ int NA[] = {0,1,2,3}; /* Shares issued in N.-America */ XPRBprob prob; XPRBvar frac[NSHARES]; /* Fraction of capital used per share */ XPRBvar buy[NSHARES]; /* 1 if asset is in portfolio, 0 otherwise */ int main(int argc, char **argv) { int s; XPRBctr Risk,Na,Return,Cap,Num; prob = XPRBnewprob("FolioMIPHeur"); /* Initialize a new problem in BCL */ /* Create the decision variables (including upper bounds for `frac') */ for(s=0;s 0,2-TOL) XPRBsetlb(buy[s], 1); } XPRBmipoptimize(prob, "c"); /* Continue solving the MIP-problem */ ifgsol=0; if(XPRBgetmipstat(prob)==XPRB_MIP_SOLUTION || XPRBgetmipstat(prob)==XPRB_MIP_OPTIMAL) { /* If an integer feas. solution was found */ ifgsol=1; solval=XPRBgetobjval(prob); /* Get the value of the best solution */ printf("Heuristic solution: Total return: %g\n", XPRBgetobjval(prob)); for(s=0;s 0,2-TOL)) { XPRBsetlb(buy[s], 0); XPRBsetub(buy[s], 1); } XPRBloadbasis(basis); /* Load the saved basis: bound changes are immediately passed on from BCL to the Optimizer if the problem has not been modified in any other way, so that there is no need to reload the matrix */ XPRBdelbasis(basis); /* No need to store the saved basis any longer */ if(ifgsol==1) XPRSsetdblcontrol(XPRBgetXPRSprob(prob), XPRS_MIPABSCUTOFF, solval+TOL); /* Set the cutoff to the best known solution */ }