/******************************************************** Xpress-BCL C++ Example Problems =============================== file xbburgl.cxx ```````````````` Burglar problem. Binary variable formulation with index sets. -- Formulating logical conditions with indicator constraints -- (c) 2009-2024 Fair Isaac Corporation author: S.Heipcke, June 2009, rev. Mar. 2011 ********************************************************/ #include #include "xprb_cpp.h" using namespace std; using namespace ::dashoptimization; /****DATA****/ /* Item: ca ne va pi tv vi ch br */ double VALUE[] = {15,100, 90, 60, 40, 15, 10, 1}; /* Value of items */ double WEIGHT[] = { 2, 20, 20, 30, 40, 30, 60, 10}; /* Weight of items */ double WTMAX = 102; /* Max weight allowed for haul */ char *ITEMNAMES[] = {"camera", "necklace", "vase", "picture", "tv", "video", "chest", "brick"}; int NItems; /* Number of items */ int main(int argc, char **argv) { XPRBvar *x; XPRBindexSet ITEMS; /* Set of items */ int i; XPRBexpr lobj, kn; XPRBctr Log3a,Log3b; XPRBprob p("BurglarL"); /* Initialize a new problem in BCL */ /****INDICES****/ ITEMS=p.newIndexSet("Items",8); /* Create the index set */ for(i=0;i<8;i++) ITEMS+=ITEMNAMES[i]; NItems=ITEMS.getSize(); /* Get the size of the index set */ /****VARIABLES****/ x = new XPRBvar[NItems]; for(i=0;i= 2); /* Turn the 2 constraints into indicator constraints */ Log3a.setIndicator(1, x[ITEMS["vase"]]); // x["vase"]=1 -> x["tv"]+x["video"]=0 Log3b.setIndicator(-1, x[ITEMS["vase"]]); // x["vase"]=0 -> x["tv"]+x["video"]=2 /* Alternative MIP formulation (instead of Log3a and Log3b) */ // p.newCtr("Log3", x[ITEMS["tv"]] = 1 - x[ITEMS["vase"]]); /****SOLVING + OUTPUT****/ p.setSense(XPRB_MAXIM); /* Choose the sense of the optimization */ p.mipOptimize(""); /* Solve the MIP-problem*/ cout << "Objective: " << p.getObjVal() << endl; /* Get objective value */ for(i=0;i0) cout << ITEMS[i] << ": " << x[i].getSol() << endl; delete [] x; return 0; }