/******************************************************** BCL Example Problems ==================== file xbburgl.c `````````````` Burglar problem. Binary variable formulation with index sets. -- Formulating logical conditions with indicator constraints -- (c) 2009-2023 Fair Isaac Corporation author: S.Heipcke, June 2009, rev. Mar. 2011 ********************************************************/ #include #include #include "xprb.h" /****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; XPRBidxset ITEMS; /* Set of items */ int i; XPRBctr ctr,cobj,Log3a,Log3b; XPRBprob prob; prob=XPRBnewprob("BurglarL"); /* Initialize a new problem in BCL */ /****INDICES****/ ITEMS=XPRBnewidxset(prob,"Items",8); /* Create the index set */ for(i=0;i<8;i++) XPRBaddidxel(ITEMS, ITEMNAMES[i]); NItems=XPRBgetidxsetsize(ITEMS); /* Get the size of the index set */ /****VARIABLES****/ x = (XPRBvar *)malloc(NItems*sizeof(XPRBvar)); for(i=0;i= 2 */ XPRBaddterm(Log3b, x[XPRBgetidxel(ITEMS,"tv")], 1); XPRBaddterm(Log3b, x[XPRBgetidxel(ITEMS,"video")], 1); XPRBaddterm(Log3b, NULL, 2); /* Turn the 2 constraints into indicator constraints */ XPRBsetindicator(Log3a, 1, x[XPRBgetidxel(ITEMS,"vase")]); /* x["vase"]=1 -> x["tv"]+x["video"]=0 */ XPRBsetindicator(Log3b, -1, x[XPRBgetidxel(ITEMS,"vase")]); /* x["vase"]=0 -> x["tv"]+x["video"]=2 */ /* Alternative MIP formulation (instead of Log3a and Log3b) */ /* ctr = XPRBnewctr(prob, "Log3", XPRB_E); // x["tv"] = 1 - x["vase"] XPRBaddterm(ctr, x[XPRBgetidxel(ITEMS,"tv")], 1); XPRBaddterm(ctr, x[XPRBgetidxel(ITEMS,"vase")], 1); XPRBaddterm(ctr, NULL, 1); */ /****SOLVING + OUTPUT****/ XPRBsetsense(prob,XPRB_MAXIM); /* Choose the sense of optimization */ XPRBmipoptimize(prob,""); /* Solve the MIP-problem */ printf("Objective: %g\n",XPRBgetobjval(prob)); /* Get objective value */ for(i=0;i0) printf("%s : %g\n", XPRBgetidxelname(ITEMS, i), XPRBgetsol(x[i])); /* Print out the chosen items */ return 0; }