/******************************************************** Xpress-BCL C++ Example Problems =============================== file xbcontr2.cxx ````````````````` Contract allocation example. Combining BCL problem input with problem solving and callbacks in Xpress-Optimizer. (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Jan. 2000, rev. Mar. 2011 ********************************************************/ #include #include "xprb_cpp.h" #include "xprs.h" using namespace std; using namespace ::dashoptimization; #define District 6 /* Number of districts */ #define Contract 10 /* Number of contracts */ /**** DATA ****/ int OUTPUT[] = {50, 40, 10, 20, 70, 50}; /* Max. output per district */ int COST[] = {50, 20, 25, 30, 45, 40}; /* Cost per district */ int VOLUME[] = {20, 10, 30, 15, 20, 30, 10, 50, 10, 20}; /* Volume of contracts */ /***********************************************************************/ void XPRS_CC printsolution(XPRSprob oprob, void *vp) { int num, d, c; XPRBprob *bprob; XPRBvar y; bprob = (XPRBprob *)vp; bprob->beginCB(oprob); XPRSgetintattrib(oprob, XPRS_MIPSOLS, &num); /* Get number of the solution */ bprob->sync(XPRB_XPRS_SOL); /* Update BCL solution values */ cout << "Solution " << num << ": Objective value: " << bprob->getObjVal() << endl; for(d=0;dgetVarByName(XPRBnewname("q_d%dc%d",d+1,c+1)); if( (y.getColNum()>-1) && (y.getSol() != 0)) cout << y.getName() << ": " << y.getSol() << endl; } bprob->endCB(); } /***********************************************************************/ int main(int argc, char **argv) { int d,c; XPRBexpr l1,l2,lobj; XPRBvar x[District][Contract]; /* Variables indicating whether a project is chosen */ XPRBvar y[District][Contract]; /* Quantities allocated to contractors */ XPRBprob p("Contr2"); /* Initialize a new problem in BCL */ /**** VARIABLES ****/ for(d=0;d= VOLUME[c]); /* "Size": cover the required volume */ p.newCtr("Min", l2 >= 2 ); /* "Min": at least 2 districts per contract */ } for(d=0;d