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

Chgprobs - Working with multiple problems

Description
This example defines 3 very small problems, making changes to the problem definition after matrix generation and retrieving solution information. It also shows BCL warnings.

xbexpljava.zip[download all files]

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.
xbexpl.java[download]





xbexpl.java

/********************************************************
 * Xpress-BCL Java Example Problems
 * ================================
 *
 * file xbexpl.java
 * ````````````````
 * Working with multiple problems.
 *
 * (c) 2008-2024 Fair Isaac Corporation
 * author: S.Heipcke, Jan. 2000, rev. Mar. 2011
 ********************************************************/

import com.dashoptimization.*;
import java.io.*;

/********************************************************/
/* This file illustrates how to                         */
/* - do changes to the problem definition               */
/* - retrieve solution information                      */
/* - define and work with several problems              */
/*                                                      */
/* Set at least one of the following options to true.   */
/* It is possible to define all together. In this case  */
/* the last function (expl5) that shows how to switch   */
/* between problems is activated too.                   */
/********************************************************/
public class xbexpl {
  static final boolean CHGCTR = true; /* Accessing & modifying constraints */
  static final boolean CHGVAR = true; /* Accessing & modifying variables */
  static final boolean UNBOUNDED = true; /* Solve a small unbounded problem */

  static XPRBprob p2, p3, p4;

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

  public static void main(String[] args) {
    try (XPRB bcl = new XPRB(); /* Initialize BCL */
        XPRBexprContext context =
            new XPRBexprContext() /* Release XPRBexpr instances at end of block. */) {
      try {
        if (CHGCTR) expl2(bcl);
        if (CHGVAR) expl3(bcl);
        if (UNBOUNDED) {
          expl4(bcl);
          if (CHGCTR && CHGVAR) expl5(bcl);
        }
      } catch (IOException e) {
        System.err.println(e.getMessage());
        System.exit(1);
      } finally {
        if (p4 != null) p4.close();
        if (p3 != null) p3.close();
        if (p2 != null) p2.close();
      }
    }
  }

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

  /**** Expl 2: changing bounds and operations on constraints ****/
  static void expl2(XPRB bcl) throws IOException {
    XPRBvar[] x;
    XPRBctr[] ctr;
    XPRBexpr lobj;
    double[] objcof = {2.0, 1.0, 1.0, 1.0, 0};
    int i;

    p2 = bcl.newProb("expl2"); /* Create a new problem */

    /* Define 5 integer variables in 0,...,100 */
    x = new XPRBvar[5];
    for (i = 0; i < 5; i++) x[i] = p2.newVar("x_" + i, XPRB.UI, 0, 100);

    /* Create the constraints:
    ctr0: x0 +10 <= x1
    ctr1: x1     <= x3
    ctr2: x1 + 8 <= x2 */
    ctr = new XPRBctr[4];
    ctr[0] = p2.newCtr("ctr0", x[0].add(10).lEql(x[1]));
    ctr[1] = p2.newCtr("ctr1", x[1].lEql(x[3]));
    ctr[2] = p2.newCtr("ctr2", x[1].add(8).lEql(x[2]));

    lobj = new XPRBexpr();
    for (i = 0; i < 5; i++) lobj.add(x[i].mul(objcof[i]));
    p2.setObj(lobj); /* Select objective function */
    p2.setSense(XPRB.MINIM); /* Set objective sense to minimization */

    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    p2.exportProb(XPRB.LP, "expl2"); /* Matrix generation and output */
    p2.print(); /* Print current problem definition */

    p2.lpOptimize(""); /* Solve the LP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();

    ctr[0].setRange(-15, -5); /* Transform constraint into range constr. */
    System.out.println("\n<<<<<<<<Constraint transformed into range:>>>>>>>>");
    p2.print(); /* Print current problem definition */
    for (i = 0; i < 4; i++) {
      x[i].print();
      System.out.print(" ");
    } /* Print new variable bounds */
    System.out.println();
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();

    ctr[0].setType(XPRB.L); /* Change range constraint back to constraint */
    System.out.println("\n<<<<<<<<Constraint restored to inequality:>>>>>>>>");
    p2.print(); /* Print current problem definition */
    ctr[0].setTerm(-10); /* Set new RHS value */
    System.out.println("<<<<<<<<Restore original RHS value:>>>>>>>>");
    p2.print(); /* Print current problem definition */

    x[1].setLB(15); /* Change the bound on a variable */
    System.out.println("<<<<<<<<Variable bound changed:>>>>>>>>");
    for (i = 0; i < 4; i++) {
      x[i].print();
      System.out.print(" ");
    } /* Print new variable bounds */
    System.out.println();
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();

    /* Change constraint coefficient and RHS */
    ctr[1].setTerm(x[1], -3); /* ctr1: x1 <= 3*x3 */
    ctr[0].addTerm(-10); /* ctr0: x0 + 20 <= x1 */
    System.out.println("\n<<<<<<<<Constraint coefficient and RHS changed:>>>>>>>>");
    for (i = 0; i < 3; i++) ctr[i].print();
    for (i = 0; i < 4; i++) {
      x[i].print();
      System.out.print(" ");
    } /* Print new variable bounds */
    System.out.println();
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();

    /* Change constraint type */
    ctr[2].setType(XPRB.G); /* ctr2: x1 + 8 >= x2 */
    System.out.println("\n<<<<<<<<Constraint type changed:>>>>>>>>");
    for (i = 0; i < 3; i++) ctr[i].print();
    for (i = 0; i < 4; i++) {
      x[i].print();
      System.out.print(" ");
    } /* Print variable bounds */
    System.out.println();
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();

    /* Add another constraint ctr3: x0 +37<= x2 */
    ctr[3] = p2.newCtr("ctr3", x[0].add(37).lEql(x[2]));
    System.out.println("\n<<<<<<<<Constraint added:>>>>>>>>");
    p2.print();
    for (i = 0; i < 4; i++) {
      x[i].print();
      System.out.print(" ");
    } /* Print variable bounds */
    System.out.println();
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();

    /* Delete a constraint */
    p2.delCtr(ctr[2]);
    System.out.println("\n<<<<<<<<Constraint deleted:>>>>>>>>");
    p2.print();
    for (i = 0; i < 4; i++) {
      x[i].print();
      System.out.print(" ");
    } /* Print variable bounds */
    System.out.println();
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal());
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();
  }

  /**** Expl 3: Knapsack problem: accessing variables ****/
  static void expl3(XPRB bcl) throws IOException {
    XPRBvar[] x;
    XPRBexpr le, lobj;
    XPRBctr ctr;
    double[] coeff = {30.0, 32.0, 27.0, 11.0};
    double[] objcof = {9.0, 15.0, 8.0, 3.0};
    int i;

    p3 = bcl.newProb("expl3"); /* Create a new problem */

    x = new XPRBvar[4];
    for (i = 0; i < 4; i++) /* Define 4 binary variables */ x[i] = p3.newVar("x_" + i, XPRB.BV);

    /* Create the knapsack constraint:
    sum_i coeff[i]*x[i] <= 70  */
    le = new XPRBexpr();
    for (i = 0; i < 4; i++) le.add(x[i].mul(coeff[i]));
    ctr = p3.newCtr("sumkn", le.lEql(70));

    lobj = new XPRBexpr();
    for (i = 0; i < 4; i++) lobj.add(x[i].mul(objcof[i]));
    p3.setObj(lobj); /* Set objective function */

    /* p3.print(); */
    /* Uncomment to print the problem */
    p3.exportProb(XPRB.MPS, "expl3"); /* Matrix output in MPS format */
    p3.setSense(XPRB.MAXIM); /* Change to maximization */
    p3.mipOptimize(""); /* Solve the MIP */
    System.out.println("Objective: " + p3.getObjVal()); /* Get objective value */
    for (i = 0; i < 4; i++) /* Print the solution */
      System.out.println(x[i].getName() + ": " + x[i].getSol() + " (rc:" + x[i].getRCost() + "),");
    System.out.println("Dual: " + ctr.getDual() + " slack: " + ctr.getSlack());
    /* Print dual & slack values */

    System.out.println("\n<<<<<<<<Variable type changed from BV to UI>>>>>>>>");
    x[1].setType(XPRB.UI); /* Change variable type */
    System.out.println(
        x[1].getName()
            + ": bounds: "
            + x[1].getLB()
            + " "
            + x[1].getUB()
            + ", type: "
            + x[1].getType()
            + ", index: "
            + x[1].getColNum());
    p3.mipOptimize(""); /* Re-solve the MIP */
    System.out.println("Objective: " + p3.getObjVal()); /* Get objective value */

    System.out.println("\n<<<<<<<<Variable bound changed: no matrix regeneration>>>>>>>>");
    x[1].setUB(3); /* Change variable bound */
    System.out.println(
        x[1].getName()
            + ": bounds: "
            + x[1].getLB()
            + " "
            + x[1].getUB()
            + ", type: "
            + x[1].getType()
            + ", index: "
            + x[1].getColNum());
    p3.mipOptimize(""); /* Re-solve the MIP */
    System.out.println("Objective: " + p3.getObjVal()); /* Get objective value */
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");

    System.out.println("\n\n<<<<<<<<Variable type changed from UI to PI>>>>>>>>");
    x[1].setType(XPRB.PI); /* Change variable type */
    x[1].setLim(2); /* Set the integer limit for
                                          the partial integer variable */
    x[1].print();
    System.out.println(); /* Print current variable definition */
    p3.mipOptimize(""); /* Re-solve the MIP */
    System.out.println("Objective: " + p3.getObjVal()); /* Get objective value */
    for (i = 0; i < 4; i++) /* Print the solution */
      System.out.println(x[i].getName() + ": " + x[i].getSol() + " (rc:" + x[i].getRCost() + "),");
    System.out.println("Dual: " + ctr.getDual() + " slack: " + ctr.getSlack());
    /* Print dual & slack values */
  }

  /****Expl 4: a small unbounded problem ****/
  static void expl4(XPRB bcl) {
    XPRBvar[] x;
    int i;

    p4 = bcl.newProb("expl4"); /* Create a new problem */

    /* Define 2 variables in [0,PLUSINFINITY] */
    x = new XPRBvar[2];
    for (i = 0; i < 2; i++) x[i] = p4.newVar("x_" + i);

    /* Create the constraints:
    ctr0: 4*x0 + x1 >= 4
    ctr1: x0 + x1   >= 3
    ctr2: x0 + 2*x1 >= 4 */
    p4.newCtr("c1", x[0].mul(4).add(x[1]).gEql(4));
    p4.newCtr("c2", x[0].add(x[1]).gEql(3));
    p4.newCtr("c3", x[0].add(x[1].mul(2)).gEql(4));

    p4.setObj(x[0].add(x[1])); /* Define and set objective function */

    p4.setSense(XPRB.MAXIM); /* Change to maximization */
    p4.lpOptimize(""); /* Solve the LP */
    System.out.println(
        "Problem status: "
            + p4.getProbStat()
            + " LP status: "
            + p4.getLPStat()
            + " MIP status: "
            + p4.getMIPStat());
    System.out.println("Objective: " + p4.getObjVal()); /* Get objective value */
    for (i = 0; i < 2; i++) /* Print solution values */
      System.out.print(x[i].getName() + ":" + x[i].getSol() + " ");
    System.out.println();
  }

  /***Expl5: Working with different problems****/
  static void expl5(XPRB bcl) {
    int i;

    System.out.println("\n<<<<<<<<Re-solve problem " + p2.getName() + ">>>>>>>>");
    p2.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p2.getProbStat()
            + " LP status: "
            + p2.getLPStat()
            + " MIP status: "
            + p2.getMIPStat());
    System.out.println("Objective: " + p2.getObjVal()); /* Get objective value */
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print("x_" + i + ":" + p2.getVarByName("x_" + i).getSol());

    /* In C and C++, here we delete the problem "expl4". With Java, the
    closest correspondence is to explicitely close this problem. */
    System.out.println("\n\n<<<<<<<<Finalize prob4>>>>>>>>");
    p4.print();
    p4.close();
    p4 = null;

    System.out.println("\n\n<<<<<<<<Re-solve problem " + p3.getName() + " and print it>>>>>>>>");
    p3.print(); /* Print the problem def. */
    p3.mipOptimize(""); /* Solve the MIP */
    System.out.println(
        "Problem status: "
            + p3.getProbStat()
            + " LP status: "
            + p3.getLPStat()
            + " MIP status: "
            + p3.getMIPStat());
    System.out.println("Objective: " + p3.getObjVal()); /* Get objective value */
    for (i = 0; i < 4; i++) /* Print solution values */
      System.out.print("x_" + i + ":" + p3.getVarByName("x_" + i).getSol());
    System.out.println();
  }
}

Back to examples browserPrevious exampleNext example