/******************************************************** Xpress-BCL Java Example Problems ================================ file foliorep.java `````````````````` Modeling a MIP problem to perform portfolio optimization. Same model as in foliomip3.java. -- Infeasible model parameter values -- -- Retrieving IIS -- (c) 2009 Fair Isaac Corporation author: S.Heipcke, June 2009, rev. Nov. 2014 ********************************************************/ import java.io.*; import java.lang.*; import java.util.*; import com.dashoptimization.*; public class foliorep { static final String DATAFILE = "folio10.cdat"; static final int MAXNUM = 4; /* Max. number of different assets */ static final double MAXRISK = 1/3; /* Max. investment into high-risk values */ static final double MINREG = 0,3; /* Min. investment per geogr. region */ static final double MAXREG = 0,5; /* Max. investment per geogr. region */ static final double MAXSEC = 0,15; /* Max. investment per ind. sector */ static final double MAXVAL = 0,2; /* Max. investment per share */ static final double MINVAL = 0,1; /* Min. investment per share */ static int NSHARES; /* Number of shares */ static int NRISK; /* Number of high-risk shares */ static int NREGIONS; /* Number of geographical regions */ static int NTYPES; /* Number of share types */ static double[] RET; /* Estimated return in investment */ static int[] RISK; /* High-risk values among shares */ static boolean LOC[][]; /* Geogr. region of shares */ static boolean SEC[][]; /* Industry sector of shares */ static String SHARES_n[]; static String REGIONS_n[]; static String TYPES_n[]; static XPRBvar[] frac; /* Fraction of capital used per share */ static XPRBvar[] buy; /* 1 if asset is in portfolio, 0 otherwise */ public static void main(String[] args) throws IOException { int s,t,r; XPRBexpr LinkL, LinkU, le, le2; XPRBctr Risk,Return,Cap,Num; XPRBctr[] MinReg, MaxReg, LimSec; ArrayList AllCtrs = new ArrayList(); /* Array of ctrs that will be allowed to be relaxed */ try { readData(); /* Read data from file */ } catch(IOException e) { System.err.println(e.getMessage()); System.exit(1); } try (XPRBprob p = new XPRBprob("FolioMIP3inf"); /* Initialize BCL and create a new problem */ XPRS xprs = new XPRS()) { /* Initialize Xpress-Optimizer */ /* Create the decision variables */ frac = new XPRBvar[NSHARES]; buy = new XPRBvar[NSHARES]; for(s=0;s= rows) ax + aux_var = b ax + aux_var >= b lbp: x_i + aux_var >= l ubp: x_i - aux_var <= u */ int nrow, ncol; double[] lrp, grp, lbp, ubp; ncol=op.getIntAttrib(XPRS.ORIGINALCOLS); nrow=op.getIntAttrib(XPRS.ORIGINALROWS); lrp = new double[nrow]; grp = new double[nrow]; lbp = new double[ncol]; ubp = new double[ncol]; lrp[Risk.getRowNum()] = 1; for(r=0;r0,5) System.out.printf(" %s: %g%% (%g)\n", SHARES_n[s], frac[s].getSol()*100, buy[s].getSol()); } static void print_violated(ArrayList ctrs) { System.out.println(" Violated (relaxed) constraints:"); for (XPRBctr c: ctrs) { String type; double viol, slack = c.getSlack(); switch (c.getType()) { case XPRB.E: viol = Math.abs(slack); type = " ="; break; case XPRB.G: viol = slack; type = ">="; break; case XPRB.L: viol = -slack; type = "<="; break; default: System.out.println(" unexpected constraint type"); continue; } if (viol > 1e-6) System.out.printf(" %s constraint %s by %g\n", type, c.getName(), -slack); } } /***********************Data input routines***************************/ /***************************/ /* Input a list of strings */ /***************************/ private static String [] read_str_list(StreamTokenizer st) throws IOException { LinkedList l=new LinkedList(); st.nextToken(); /* Skip ':' */ while(st.nextToken()==st.TT_WORD) { l.addLast(st.sval); } String a[]=new String[l.size()]; l.toArray(a); return a; } /************************/ /* Input a list of ints */ /************************/ private static int [] read_int_list(StreamTokenizer st) throws IOException { LinkedList l=new LinkedList(); st.nextToken(); /* Skip ':' */ while(st.nextToken()==st.TT_NUMBER) { l.addLast((int)st.nval); } int a[]=new int[l.size()]; for(int i=0;i0) { RET=new double[NSHARES]; read_dbl_table(st,RET); } else if ( st.sval.equals("LOC") && NSHARES>0 && NREGIONS>0) LOC=read_bool_table(st,NREGIONS,NSHARES); else if ( st.sval.equals("SEC") && NSHARES>0 && NTYPES>0) SEC=read_bool_table(st,NTYPES,NSHARES); else break; } /* for(int i=0;i