| /********************************************************
  Xpress-BCL C# Example Problems
  ==============================
  file xbcontr1.cs
  ````````````````
  Contract allocation example.
  Combining BCL problem input with problem solving 
  in Xpress-Optimizer.
  (c) 2008 Fair Isaac Corporation
      authors: S.Heipcke, D.Brett.
********************************************************/
using System;
using System.Text;
using System.IO;
using BCL;
namespace Examples
{
    public class TestContract
    {
        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 static void Main()
        {
            XPRB.init();
            int d,c;
            XPRBprob p = new XPRBprob("Contract");          /* Initialize a new problem in BCL */
            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 */
            TestContract TestInstance = new TestContract();
            /**** 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****/
            p.exportProb(BCLconstant.XPRB_MPS,"Contract");  /* Output the matrix in MPS format */
            p.setSense(BCLconstant.XPRB_MINIM);         /* Choose the sense of the optimization */   
            p.mipOptimize();                   /* Solve the MIP-problem */
            if((p.getMIPStat()==BCLconstant.XPRB_MIP_SOLUTION) || (p.getMIPStat()==BCLconstant.XPRB_MIP_OPTIMAL)) 
            /* Test whether an integer sol. was found */
            {              
                System.Console.WriteLine("Objective: " + p.getObjVal());  /* Get objective value */
                for(d=0;d<District;d++)        /* Print the solution values */
                {
                    for(c=0;c<Contract;c++)
                    if(x[d,c].getSol()>0)
                        System.Console.Write(y[d, c].getName() + ":" + y[d, c].getSol() + ", ");
                    System.Console.WriteLine();
                }
            } 
            return;
        } 
    }
} |