FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Contract - Semi-continuous variables, predefined constraint functions, combine BCL with Xpress Optimizer

Description
A small MIP-problem example demonstrating how to define semi-continuous variables, use predefined constraint functions and retrieve the problem status.

Two modified versions (documented in the 'BCL Reference Manual') show how to (1) combine BCL problem input with problem solving in Xpress Optimizer and (2) use an Xpress Optimizer solution callback with a BCL model.

Further explanation of this example: 'BCL Reference Manual', Appendix B Using BCL with the Optimizer library


Source Files
By clicking on a file name, a preview is opened at the bottom of this page.
xbcontr1.cs[download]
xbcontr1.csproj[download]
xbcontr1.cs[download]
xbcontr2.cs[download]
xbcontr2s.cs[download]





xbcontr2s.cs

/********************************************************
  Xpress-BCL C# Example Problems
  ==============================

  file xbcontr2.cs
  ````````````````
  Contract allocation example.
  Combining BCL problem input with problem solving
  and callbacks in Xpress-Optimizer.
  --- MIP Single-threaded ---

  (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 TestUGContr2s
    {
        const int District = 6;                  /* Number of districts */
        const int 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 */


        /*********************************************************************/
        public void printsolution(XPRSprob xprsp, object vp)
        {
            int num, d, c;
            XPRBprob bprob;
            XPRBvar y;

            bprob = (XPRBprob)vp;
            bprob.beginCB(xprsp);
            num = xprsp.MIPSols;
            bprob.sync(BCLconstant.XPRB_XPRS_SOL);                  /* Update BCL solution values */
            System.Console.WriteLine("Solution " + num + ": Objective value: " + bprob.getObjVal());

            for(d=0;d<District;d++)
                for(c=0;c<Contract;c++)
                {
                    y = bprob.getVarByName("q_d" + (d+1) + "c" + (c+1));
                    if( (y.getColNum()>-1) && (y.getSol() != 0))
                        System.Console.WriteLine(y.getName() + ": " + y.getSol());
                }
            bprob.endCB();

            return;
        }

        /*********************************************************************/

        public static void Main()
        {
           XPRB.init();
           int d,c;
            XPRBexpr l1,l2,lobj;
            XPRBvar[,] x = new XPRBvar[District,Contract];  /* Variables indicating whether a project
            is chosen */
            XPRBvar[,] y = new XPRBvar[District,Contract];  /* Quantities allocated to contractors */
            XPRBprob p = new XPRBprob("Contr2");           /* Initialize a new problem in BCL */
            TestUGContr2s TestInstance = new TestUGContr2s();
            IntsolCallback del = new IntsolCallback(TestInstance.printsolution);
            XPRSprob xprsp;

            /**** VARIABLES ****/
            for(d=0;d<District;d++)
                for(c=0;c<Contract;c++)
                {
                    x[d, c] = p.newVar("x_d" + (d+1) + "c" + (c+1), BCLconstant.XPRB_BV);
                    y[d, c] = p.newVar("q_d" + (d+1) + "c" + (c+1), BCLconstant.XPRB_SC, 0, TestInstance.OUTPUT[d]);
                    y[d,c].setLim(5);
                }

            /****OBJECTIVE****/
            lobj = new XPRBexpr();
            for(d=0;d<District;d++)
                for(c=0;c<Contract;c++)
                    lobj += TestInstance.COST[d] * y[d, c];

            p.setObj(p.newCtr("OBJ",lobj));       /* Set the objective function */

            /**** CONSTRAINTS ****/
            for(c=0;c<Contract;c++)
            {
                l1= new XPRBexpr(0);
                l2= new XPRBexpr(0);
                for(d=0;d<District;d++)
                {
                    l1 += y[d,c];
                    l2 += x[d,c];
                }
                p.newCtr("Size", l1 >= TestInstance.VOLUME[c]);   /* "Size": cover the required volume */
                p.newCtr("Min", l2 >= 2 ); 	/* "Min": at least 2 districts per contract */
            }

            for(d=0;d<District;d++)        /* Do not exceed max. output of any district */
            {
                l1= new XPRBexpr(0);
                for(c=0;c<Contract;c++)
                    l1 += y[d,c];
                p.newCtr("Output", l1 <= TestInstance.OUTPUT[d]);
            }

            for(d=0;d<District;d++)        /* If a contract is allocated to a district,
                                           then at least 1 unit is allocated to it */
                for(c=0;c<Contract;c++)
                    p.newCtr("XY", x[d,c] <= y[d,c]);

            /****SOLVING + OUTPUT****/
            xprsp = p.getXPRSprob();
            /* Desactivate parallel MIP (for synchronization of BCL and Optimizer) */
            xprsp.MIPThreads = 1;
            xprsp.AddIntsolCallback(del, (object)p);
            /* Define an integer solution callback */

            p.setSense(BCLconstant.XPRB_MINIM);
            p.mipOptimize();

            return;
        }

    }

}
Back to examples browserPrevious exampleNext example