| |||||||||
UG - Examples from 'BCL Reference Manual' Description The following examples are discussed in detail in the 'BCL User Guide and Reference Manual':
Source Files By clicking on a file name, a preview is opened at the bottom of this page. Data Files xbcutex.cs /******************************************************** Xpress-BCL C# Example Problems ============================== file xbcutex.cs ``````````````` Simplified version of xbexpl1.cxx showing how to define cuts with BCL. (c) 2008-2024 Fair Isaac Corporation authors: S.Heipcke, D.Brett. ********************************************************/ using System; using System.Text; using System.IO; using Optimizer; using BCL; namespace Examples { public class TestUGCutex { const int NJ = 4; /* Number of jobs */ const int NT = 10; /* Time limit */ /**** DATA ****/ double[] DUR = {3,4,2,2}; /* Durations of jobs */ XPRBvar[] start = new XPRBvar[NJ]; /* Start times of jobs */ XPRBvar[,] delta = new XPRBvar[NJ,NT]; /* Binaries for start times */ XPRBvar z; /* Maximum completion time (makespan) */ XPRBprob p = new XPRBprob("Jobs"); /* Initialize BCL and a new problem */ /***********************************************************************/ public int usrcme(XPRSprob xprsp, object vd) { XPRBcut[] ca = new XPRBcut[2]; int num; int i=0; XPRBprob bprob = (XPRBprob)vd; bprob.beginCB(xprsp); /* In terms of an example, we add a few additional constraints (without any relation to the original problem) at the second node of the MIP search tree. These constraints/cuts are applied at this node and all its child nodes. */ num = xprsp.Nodes; if(num == 2) { ca[0] = bprob.newCut(start[1]+2 <= start[0], 2); ca[1] = bprob.newCut((4*start[2]) - (5.3*start[3]) <= -17, 2); System.Console.WriteLine("Adding constraints:"); for(i=0;i<2;i++) ca[i].print(); if(bprob.addCuts(ca,2) != 0) System.Console.WriteLine("Problem with adding cuts."); } bprob.endCB(); return 0; /* Call this function once per node */ } /*************************************************************************/ public void jobsModel() { XPRBexpr le; int j,t; /****VARIABLES****/ /* Create start time variables */ for(j=0;j<NJ;j++) start[j] = p.newVar("start"); z = p.newVar("z", BCLconstant.XPRB_PL, 0, NT); /* Declare the makespan variable */ for(j=0;j<NJ;j++) /* Declare binaries for each job */ for(t=0;t<(NT-DUR[j]+1);t++) delta[j, t] = p.newVar("delta" + (j+1) + (t+1), BCLconstant.XPRB_BV); /****CONSTRAINTS****/ for(j=0;j<NJ;j++) /* Calculate maximal completion time */ p.newCtr("Makespan", start[j]+DUR[j] <= z); p.newCtr("Prec", start[0]+DUR[0] <= start[2]); /* Precedence relation between jobs */ for(j=0;j<NJ;j++) /* Linking start times and binaries */ { le= new XPRBexpr(0); for(t=0;t<(NT-DUR[j]+1);t++) le += (t+1)*delta[j,t]; p.newCtr("Link_" + (j+1), le == start[j]); } for(j=0;j<NJ;j++) /* One unique start time for each job */ { le= new XPRBexpr(0); for(t=0;t<(NT-DUR[j]+1);t++) le += delta[j,t]; p.newCtr("One_" + (j+1), le == 1); } /****OBJECTIVE****/ p.setObj(p.newCtr("OBJ", new XPRBexpr(z))); /* Define and set objective function */ /****BOUNDS****/ for(j=0;j<NJ;j++) start[j].setUB(NT-DUR[j]+1); /* Upper bounds on start time variables */ } /*************************************************************************/ public void jobsSolve() { int j,t,statmip; CutmgrCallback del = new CutmgrCallback(usrcme); XPRSprob xprsp = p.getXPRSprob(); xprsp.HeurEmphasis = 0; xprsp.CutStrategy = 0; /* Switch heuristics and cut generation off: otherwise this problem is solved in the first node of the MIP search tree */ p.setCutMode(1); /* Enable the cut mode */ xprsp.AddCutmgrCallback(del, (object)p); p.setSense(BCLconstant.XPRB_MINIM); p.mipOptimize(); /* Solve the problem as MIP */ statmip = p.getMIPStat(); /* Get the MIP problem status */ if ((statmip == BCLconstant.XPRB_MIP_SOLUTION) || (statmip == BCLconstant.XPRB_MIP_OPTIMAL)) /* An integer solution has been found */ { System.Console.WriteLine("Objective: " + p.getObjVal()); for(j=0;j<NJ;j++) { /* Print the solution for all start times */ System.Console.WriteLine(start[j].getName() + ": " + start[j].getSol()); for(t=0;t<NT-DUR[j]+1;t++) System.Console.Write(delta[j,t].getName() + ": " + delta[j,t].getSol() + " "); System.Console.WriteLine(); } } } /*************************************************************************/ public static void Main() { XPRB.init(); TestUGCutex TestInstance = new TestUGCutex(); TestInstance.jobsModel(); /* Basic problem definition */ TestInstance.jobsSolve(); /* Solve and print solution */ return; } } } | |||||||||
© Copyright 2024 Fair Isaac Corporation. |