| |||||||||||||||||
Delivery - Data input from file; infeasibility analysis Description A simple supply and demand network example showing data
input from file and the use of "views": incremental
definition of arrays of variables. Also uses constraint
templates with the arrays of variables. A second version of this model (file xbdlvriis) has modified data making the problem infeasible. This example shows how to analyze infeasibility with the help of IIS (irreducible infeasible sets), it retrieves the IIS and prints out their contents. It is possible to retrieve more detailed information on the IIS, such as isolation rows or bounds, using Xpress Optimizer functions (file xbdlvriis2iso) or to use the infeasibility repair functionality of the Optimizer (file xbdlvriis2rep) with models defined in BCL.
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
Data Files xbdlvriis2iso.cxx /******************************************************** Xpress-BCL C++ Example Problems =============================== file xbdlvriis2iso.cxx `````````````````````` Transportation problem (infeasible data). Retrieving and printing IIS. - Using Optimizer functions to retrieve detailed IIS information including isolation rows/bounds - (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Jan. 2008, rev. Mar. 2011 ********************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include "xprb_cpp.h" #include "xprs.h" using namespace std; using namespace ::dashoptimization; #define NSupp 10 // Number of suppliers #define NCust 7 // Number of customers #define MaxArcs 100 // Max. num. of non-zero cost values #define VANFILE XPRBDATAPATH "/delivery/ifvan.dat" // Van data file #define COSTFILE XPRBDATAPATH "/delivery/cost.dat" // Cost data file /****DATA****/ // Supplier: London Luton B'ham Bristl Derby Stckpt York double SUPPLY[] = {140.0, 200.0, 50.0, 10.0, 400.0, 200.0, 20.0, // Supplier: Derby Soton Scnthp 90.0, 30.0, 12.0}; // Customer: London Livpol Doncst York Hull Manchr Shffld double DEMAND[] = {1230.3, 560.4, 117.1, 592.8, 310.0, 1247.0, 86.0}; double COST[NSupp][NCust]; // Cost per supplier-customer pair double IFVAN[NSupp][NCust]; // Non-zero if route uses vans instead // of lorries double VANCAP=40.0; // Capacity on routes that use vans /***********************************************************************/ void modDelivery(XPRBprob &p) { XPRBexpr lobj, lc; int s,c,i; XPRBvar x[NSupp][NCust]; int numv, numc, numiis, len, ncol, nrow; char *vnames, *cnames; int *viis,*ciis; char **vindex,**cindex; double bnd, rhs; char *ctrtype = NULL; char *bndtype = NULL; double *duals = NULL; double *rdcs = NULL; char *isolationrows = NULL; char *isolationbnds = NULL; const char *isotype[] = {"N/A", "No ", "Yes"}; XPRSprob op; /****VARIABLES****/ for(s=0;s<NSupp;s++) for(c=0; c<NCust; c++) x[s][c] = p.newVar(XPRBnewname("x_s%d",s)); /****OBJECTIVE****/ for(s=0;s<NSupp;s++) // Objective: Minimize total cost for(c=0; c<NCust; c++) lobj += COST[s][c]*x[s][c]; p.setObj(p.newCtr("OBJ", lobj)); // Set objective function /****CONSTRAINTS****/ for(c=0; c<4; c++) // Satisfy demand of each customer { lc=0; for(s=0;s<5;s++) lc += x[s][c]; p.newCtr("Demand", lc >= DEMAND[c]); } for(c=4; c<NCust; c++) // Satisfy demand of each customer { lc=0; for(s=5;s<NSupp;s++) lc += x[s][c]; p.newCtr("Demand", lc >= DEMAND[c]); } for(s=0;s<5;s++) // Keep within supply at each supplier { lc=0; for(c=0; c<4; c++) lc+= x[s][c]; p.newCtr("Supply", lc <= SUPPLY[s]); } for(s=5;s<NSupp;s++) // Keep within supply at each supplier { lc=0; for(c=4; c<NCust; c++) lc+= x[s][c]; p.newCtr("Supply", lc <= SUPPLY[s]); } /****BOUNDS****/ for(s=0;s<NSupp;s++) for(c=0; c<NCust; c++) if(IFVAN[s][c]!=0) x[s][c].setUB(VANCAP); /****SOLVING + OUTPUT****/ p.setSense(XPRB_MINIM); // Set objective sense to minimization p.lpOptimize(""); // Solve the LP-problem cout << "LP status: " << p.getLPStat() << endl; if (p.getLPStat()==XPRB_LP_OPTIMAL) { cout << "Objective: " << p.getObjVal() << endl; // Get objective value } else if (p.getLPStat()==XPRB_LP_INFEAS) // Problem is infeasible { op = p.getXPRSprob(); // Retrieve the Optimizer problem /**** Get all IIS ****/ numiis = p.getNumIIS(); // Generate IIS, get number of independent IIS // Alternatively: use Optimizer functions to generate IIS /* XPRSiisall(op); XPRSgetintattrib(op, XPRS_NUMIIS, &numiis); */ cout << "Number of IIS: " << numiis << endl; /**** Obtain variable and constraint names for later use in printout ****/ // Retrieve variable names XPRSgetintattrib(op, XPRS_ORIGINALCOLS, &ncol); XPRSgetnamelist(op, 2, NULL, 0, &len, 0, ncol-1); // Get number of bytes required for retrieving names vnames = new char[len]; vindex = new char*[ncol]; XPRSgetnamelist(op, 2, vnames, len, NULL, 0, ncol-1); vindex[0]=vnames; for(i=1; i<ncol; i++) vindex[i] =vindex[i-1]+strlen(vindex[i-1])+1; // Retrieve constraint names XPRSgetintattrib(op, XPRS_ORIGINALROWS, &nrow); XPRSgetnamelist(op, 1, NULL, 0, &len, 0, nrow-1); cnames = new char[len]; cindex = new char*[nrow]; XPRSgetnamelist(op, 1, cnames, len, NULL, 0, nrow-1); cindex[0]=cnames; for(i=1; i<nrow; i++) cindex[i] = cindex[i-1]+strlen(cindex[i-1])+1; /**** Retrieve detailed IIS info (incl. isolations) ****/ for(s=1;s<=numiis;s++) { XPRSgetiisdata(op, s, &numc, &numv, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); XPRSiisisolations(op, s); // Find isolations ciis = new int[numc]; viis = new int[numv]; ctrtype = new char[numc]; bndtype = new char[numv]; duals = new double[numc]; rdcs = new double[numv]; isolationrows = new char[numc]; isolationbnds = new char[numv]; XPRSgetiisdata(op, s, &numc, &numv, ciis, viis, ctrtype, bndtype, duals, rdcs, isolationrows, isolationbnds); cout << "IIS " << s << ": " << numv << " variables, " << numc; cout << " constraints" << endl; cout << " Name Type Sense Bound Dual values In iso. " << endl; if (numv>0) { // Print all variables in the IIS for(i=0;i<numv;i++) { if (bndtype[i] == 'L') XPRSgetlb(op, &bnd, viis[i], viis[i]); else XPRSgetub(op, &bnd, viis[i], viis[i]); cout << " " << vindex[viis[i]] << " column " << bndtype[i]; cout << " " << bnd << " " << rdcs[i] << " "; cout << isotype[1+(int)isolationbnds[i]] << endl; } delete [] viis; // Free the array of variables delete [] bndtype; delete [] rdcs; delete [] isolationbnds; } if (numc>0) { // Print all constraints in the IIS for(i=0;i<numc;i++) { XPRSgetrhs(op, &rhs, ciis[i], ciis[i]); cout << " " << cindex[ciis[i]]<< " row " << ctrtype[i]; cout << " " << rhs << " " << duals[i] << " "; cout << isotype[1+(int)isolationrows[i]] << endl; } delete [] ciis; // Free the array of constraints } } delete [] vnames; delete [] cnames; delete [] vindex; delete [] cindex; } } /***********************************************************************/ /**** Read data from files ****/ void readData() { FILE *datafile; int s,c; // Initialize data tables to 0 for(s=0;s<NSupp;s++) for(c=0; c<NCust; c++) { COST[s][c] = 0; IFVAN[s][c] = 0; } // Read the demand data file datafile=fopen(COSTFILE,"r"); for(s=0;s<NSupp;s++) XPRBreadarrlinecb(XPRB_FGETS, datafile, 99, "g,", COST[s], NCust); fclose(datafile); // Read the van data file datafile=fopen(VANFILE,"r"); for(s=0;s<NSupp;s++) XPRBreadarrlinecb(XPRB_FGETS, datafile, 99, "g,", IFVAN[s], NCust); fclose(datafile); } /***********************************************************************/ int main(int argc, char **argv) { XPRBprob p("Delivery"); // Initialize a new problem in BCL readData(); // Data input from file modDelivery(p); // Problem formulation and solution return 0; } | |||||||||||||||||
© Copyright 2024 Fair Isaac Corporation. |