xbexpl1.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbexpl1.java
* `````````````````
* BCL user guide example.
* Definition of variables and constraints,
* variable arrays and SOS, followed by file output,
* solving and printing of solutions.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, Jan. 2000, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbexpl1 {
/**************************************************************************/
/* Expl 1: This example corresponds to the one printed in the */
/* BCL User Guide. It shows how to define variables and */
/* constraints, and Special Ordered Sets, followed by file output, */
/* solving and printing of solutions. */
/* Set the following parameter to true to try out a problem formulation */
/* using Special Ordered Sets: */
static final boolean SOS = false;
/**************************************************************************/
static final int NJ = 4; /* Number of jobs */
static final int NT = 10; /* Time limit */
/**** DATA ****/
static final double[] DUR = {3, 4, 2, 2}; /* Durations of jobs */
static XPRBvar[] start; /* Start times of jobs */
static XPRBvar[][] delta; /* Binaries for start times */
static XPRBvar z; /* Maximum completion time (makespan) */
static XPRBsos[] set; /* Sets regrouping start times for jobs */
/*************************************************************************/
static void jobsModel(XPRBprob p) throws IOException {
XPRBexpr le;
int j, t;
/****VARIABLES****/
start = new XPRBvar[NJ]; /* Create start time variables */
for (j = 0; j < NJ; j++) start[j] = p.newVar("start");
z = p.newVar("z", XPRB.PL, 0, NT); /* Declare the makespan variable */
delta = new XPRBvar[NJ][NT];
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), XPRB.BV);
/****CONSTRAINTS****/
for (j = 0; j < NJ; j++) /* Calculate maximal completion time */
p.newCtr("Makespan", start[j].add(DUR[j]).lEql(z));
p.newCtr("Prec", start[0].add(DUR[0]).lEql(start[2]));
/* Precedence rel. between jobs */
for (j = 0; j < NJ; j++) {
/* Linking start times and binaries */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t].mul((t + 1)));
p.newCtr("Link_" + (j + 1), le.eql(start[j]));
}
for (j = 0; j < NJ; j++) {
/* One unique start time for each job */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t]);
p.newCtr("One_" + (j + 1), le.eql(1));
}
/****OBJECTIVE****/
p.setObj(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 */
/****OUTPUT****/
p.print(); /* Print out the problem definition */
p.exportProb(XPRB.MPS, "expl1"); /* Output matrix to MPS file */
}
/*************************************************************************/
static void jobsSolve(XPRBprob p) {
int j, t, statmip;
if (!SOS)
for (j = 0; j < NJ; j++)
for (t = 0; t < NT - DUR[j] + 1; t++) delta[j][t].setDir(XPRB.PR, 10 * (t + 1));
/* Give highest priority to variables for earlier start times */
else for (j = 0; j < NJ; j++) set[j].setDir(XPRB.DN); /* First branch downwards on sets */
p.setSense(XPRB.MINIM);
p.mipOptimize(""); /* Solve the problem as MIP */
statmip = p.getMIPStat(); /* Get the MIP problem status */
if ((statmip == XPRB.MIP_SOLUTION) || (statmip == XPRB.MIP_OPTIMAL)) {
/* An integer solution has been found */
System.out.println("Objective: " + p.getObjVal());
for (j = 0; j < NJ; j++) {
/* Print the solution for all start times */
System.out.println(start[j].getName() + ": " + start[j].getSol());
for (t = 0; t < NT - DUR[j] + 1; t++)
System.out.print(delta[j][t].getName() + ": " + delta[j][t].getSol());
System.out.println();
}
}
}
/*************************************************************************/
public static void main(String[] args) throws Exception {
try (XPRBprob p = new XPRBprob("jobs"); /* Initialize BCL and create a new problem */
XPRBexprContext context =
new XPRBexprContext() /* Release XPRBexpr instances at end of block. */) {
if (!SOS) jobsModel(p); /* Basic problem definition */
else jobsModelb(p); /* Formulation using SOS */
jobsSolve(p); /* Solve and print solution */
}
}
/*************************************************************************/
static void jobsModelb(XPRBprob p) throws IOException {
/**** SOS-formulation ****/
XPRBexpr le;
int j, t;
/****VARIABLES****/
start = new XPRBvar[NJ]; /* Create start time variables */
for (j = 0; j < NJ; j++) start[j] = p.newVar("start");
z = p.newVar("z", XPRB.PL, 0, NT); /* Declare the makespan variable */
delta = new XPRBvar[NJ][NT];
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), XPRB.PL, 0, 1);
/****CONSTRAINTS****/
for (j = 0; j < NJ; j++) /* Calculate maximal completion time */
p.newCtr("Makespan", start[j].add(DUR[j]).lEql(z));
p.newCtr("Prec", start[0].add(DUR[0]).lEql(start[2]));
/* Precedence rel. betw. jobs */
for (j = 0; j < NJ; j++) {
/* Linking start times and binaries */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t].mul((t + 1)));
p.newCtr("Link_" + (j + 1), le.eql(start[j]));
}
for (j = 0; j < NJ; j++) {
/* One unique start time for each job */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t]);
p.newCtr("One_" + (j + 1), le.eql(1));
}
/****OBJECTIVE****/
p.setObj(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 */
/****SETS****/
set = new XPRBsos[NJ];
for (j = 0; j < NJ; j++) {
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t].mul((t + 1)));
set[j] = p.newSos("sosj", XPRB.S1, le);
}
/****OUTPUT****/
p.print(); /* Print out the problem definition */
p.exportProb(XPRB.MPS, "expl1"); /* Output matrix to MPS file */
}
}
|
|
xbexpl1i.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbexpl1i.java
* ``````````````````
* BCL user guide example.
* Version using index sets.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2003, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbexpl1i {
static final String DATAFILE = System.getProperty("XPRBDATA") + "/jobs/durations.dat";
static final int MAXNJ = 4; /* Max. number of jobs */
static final int NT = 10; /* Time limit */
/**** DATA ****/
static int NJ = 0; /* Number of jobs read in */
static double[] DUR; /* Durations of jobs */
static XPRBindexSet Jobs; /* Job names */
static XPRBvar[] start; /* Start times of jobs */
static XPRBvar[][] delta; /* Binaries for start times */
static XPRBvar z; /* Maximum completion time (makespan) */
/*************************************************************************/
/**** Initialize the stream tokenizer ****/
static StreamTokenizer initST(FileReader file) {
StreamTokenizer st = null;
st = new StreamTokenizer(file); /* Initialize the stream tokenizer */
st.commentChar('!'); /* Use the character '!' for comments */
st.eolIsSignificant(true); /* Return end-of-line character */
st.ordinaryChar(','); /* Use ',' as separator */
st.parseNumbers(); /* Read numbers as numbers (not strings)*/
return st;
}
/**** Read data from files ****/
static void readData(XPRBprob p) throws IOException {
FileReader datafile = null;
StreamTokenizer st;
int i;
/* Create a new index set */
Jobs = p.newIndexSet("Jobs", MAXNJ);
DUR = new double[MAXNJ];
/* Read the durations data file */
datafile = new FileReader(DATAFILE);
st = initST(datafile);
do {
do {
st.nextToken();
} while (st.ttype == st.TT_EOL); /* Skip empty lines */
if (st.ttype != st.TT_WORD) break;
i = Jobs.addElement(st.sval);
if (st.nextToken() != ',') break;
if (st.nextToken() != st.TT_NUMBER) break;
DUR[i] = st.nval;
NJ += 1;
} while (st.nextToken() == st.TT_EOL && NJ < MAXNJ);
datafile.close();
System.out.println("Number of jobs read: " + Jobs.getSize());
}
/***********************************************************************/
static void jobsModel(XPRBprob p) {
XPRBexpr le;
int j, t;
/****VARIABLES****/
start = new XPRBvar[NJ]; /* Create start time variables (incl. bounds) */
for (j = 0; j < NJ; j++) start[j] = p.newVar("start", XPRB.PL, 0, NT - DUR[j] + 1);
z = p.newVar("z", XPRB.PL, 0, NT); /* Declare the makespan variable */
delta = new XPRBvar[NJ][NT];
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" + Jobs.getIndexName(j) + "_" + (t + 1), XPRB.BV);
/****CONSTRAINTS****/
for (j = 0; j < NJ; j++) /* Calculate maximal completion time */
p.newCtr("Makespan", start[j].add(DUR[j]).lEql(z));
p.newCtr("Prec", start[0].add(DUR[0]).lEql(start[2]));
/* Precedence rel. between jobs */
for (j = 0; j < NJ; j++) {
/* Linking start times and binaries */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t].mul((t + 1)));
p.newCtr("Link_" + (j + 1), le.eql(start[j]));
}
for (j = 0; j < NJ; j++) {
/* One unique start time for each job */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t]);
p.newCtr("One_" + (j + 1), le.eql(1));
}
/****OBJECTIVE****/
p.setObj(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 */
}
/*************************************************************************/
static void jobsSolve(XPRBprob p) {
int j, t, statmip;
for (j = 0; j < NJ; j++)
for (t = 0; t < NT - DUR[j] + 1; t++) delta[j][t].setDir(XPRB.PR, 10 * (t + 1));
/* Give highest priority to variables for earlier start times */
p.setSense(XPRB.MINIM);
p.mipOptimize(""); /* Solve the problem as MIP */
statmip = p.getMIPStat(); /* Get the MIP problem status */
if ((statmip == XPRB.MIP_SOLUTION) || (statmip == XPRB.MIP_OPTIMAL)) {
/* An integer solution has been found */
System.out.println("Objective: " + p.getObjVal());
for (j = 0; j < NJ; j++) {
/* Print the solution for all start times */
System.out.println(start[j].getName() + ": " + start[j].getSol());
for (t = 0; t < NT - DUR[j] + 1; t++)
System.out.print(delta[j][t].getName() + ": " + delta[j][t].getSol() + " ");
System.out.println();
}
}
}
/*************************************************************************/
public static void main(String[] args) throws IOException {
try (XPRBprob p = new XPRBprob("Jobs"); /* Initialize BCL and create a new problem */
XPRBexprContext context =
new XPRBexprContext() /* Release XPRBexpr instances at end of block. */) {
readData(p); /* Data input from file */
jobsModel(p); /* Problem definition */
jobsSolve(p); /* Solve and print solution */
}
}
}
|
|
xbexpl3.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbexpl3.java
* `````````````````
* Error handling and output redirection.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2005, rev. Jan. 2012
********************************************************/
import com.dashoptimization.*;
import java.io.*;
/* This small, infeasible example shows how all printed messages can
be intercepted by the user's program. */
public class xbexpl3 {
static XPRB bcl;
/***********************************************************************/
public static void modexpl3(XPRBprob prob) throws XPRBerror {
XPRBvar[] x;
XPRBexpr cobj;
int i;
x = new XPRBvar[3]; /* Create the variables */
for (i = 0; i < 2; i++) x[i] = prob.newVar("x_" + i, XPRB.UI, 0, 100);
/* Create the constraints:
C1: 2x0 + 3x1 >= 41
C2: x0 + 2x1 = 13 */
prob.newCtr("C1", x[0].mul(2).add(x[1].mul(3)).gEql(41));
prob.newCtr("C2", x[0].add(x[1].mul(2)).eql(13));
/* Uncomment the following line to cause an error in the model that
triggers the error handling: */
// x[2] = prob.newVar("x_2", XPRB.UI, 10, 1);
/* Objective: minimize x0+x1 */
cobj = new XPRBexpr();
for (i = 0; i < 2; i++) cobj.add(x[i]);
prob.setObj(cobj); /* Select objective function */
prob.setSense(XPRB.MINIM); /* Set objective sense to minimization */
prob.print(); /* Print current problem definition */
prob.lpOptimize(""); /* Solve the LP */
System.out.println(
"Problem status: "
+ prob.getProbStat()
+ " LP status: "
+ prob.getLPStat()
+ " MIP status: "
+ prob.getMIPStat());
/* This problem is infeasible, that means the following command will fail.
It prints a warning if the message level is at least 2 */
System.out.println("Objective: " + prob.getObjVal());
for (i = 0; i < 2; i++) /* Print solution values */
System.out.print(x[i].getName() + ":" + x[i].getSol() + ", ");
System.out.println();
}
/***********************************************************************/
public static void main(String[] args) {
try (XPRB bcl = new XPRB()) {
/* Initialize BCL */
bcl.setMsgLevel(2); /* Set the printing flag. Try other values:
0 - no printed output,
2 - print warnings, 3 - all messages */
try (XPRBprob prob = bcl.newProb("Expl3"); /* Create a new problem */
XPRBexprContext context =
new XPRBexprContext() /* Release XPRBexpr instance at end of block. */) {
FileWriter f = new FileWriter("expl3out.txt");
bcl.setOutputStream(f); /* Redirect all output from BCL to a file */
prob.setOutputStream(); /* Output for this prob. on standard output */
modexpl3(prob); /* Formulate and solve the problem */
prob.setOutputStream(f); /* Redirect problem output to file */
prob.print(); /* Write to the output file */
prob.setOutputStream(); /* Re-establish standard output for prob */
bcl.setOutputStream(); /* Re-establish standard output for BCL */
f.close();
System.err.flush();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
} catch (XPRBerror e) {
System.err.println("BCL error " + e.getErrorCode() + ": " + e.getMessage());
System.exit(1);
}
} catch (XPRBlicenseError e) {
System.err.println("BCL error " + e.getErrorCode() + ": " + e.getMessage());
System.exit(1);
}
}
}
|
|
xbexpl2.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbexpl2.java
* `````````````````
* Transportation model demonstrating use of index sets.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, Jan. 2000, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbexpl2 {
static final int MaxSuppliers = 100; /* Max. number of suppliers */
static final int MaxCustomers = 1000; /* Max. number of customers */
static final int MaxArcs = 10000; /* Max. number of non-zero cost values */
static final String DEMANDFILE = System.getProperty("XPRBDATA") + "/trans/ex2dem1.dat";
/* Demand data file (comma-separated format) */
static final String AVAILFILE = System.getProperty("XPRBDATA") + "/trans/ex2avail.dat";
/* Supply data file (comma-separated format) */
static final String COSTFILE = System.getProperty("XPRBDATA") + "/trans/ex2cost.dat";
/* Cost data file (comma-separated format) */
static XPRBindexSet Suppliers; /* Set of suppliers */
static XPRBindexSet Customers; /* Set of customers */
static double[] AVAIL; /* Availability of products */
static double[] DEMAND; /* Demand by customers */
static class TData {
int suppl;
int custm;
double value;
}
;
static TData[] COST = new TData[MaxArcs]; /* Cost per supplier-customer pair*/
static int NSuppl = 0, NCustom = 0, NArc = 0; /* Actual numbers of suppliers,
customers, and arcs */
/***********************************************************************/
static void modTrans(XPRBprob p) throws IOException {
XPRBexpr lobj, av[], de[];
int s, c, a;
XPRBvar[] x;
/****VARIABLES****/
x = new XPRBvar[NArc];
for (a = 0; a < NArc; a++) x[a] = p.newVar("x");
/****OBJECTIVE****/
lobj = new XPRBexpr();
for (a = 0; a < NArc; a++) lobj.add(x[a].mul(COST[a].value));
p.setObj(lobj); /* Set objective function */
/****CONSTRAINTS****/
/**** Create all constraints in a single loop ****/
/* Initialize the linear expressions */
av = new XPRBexpr[NSuppl];
for (s = 0; s < NSuppl; s++) av[s] = new XPRBexpr();
de = new XPRBexpr[NCustom];
for (c = 0; c < NCustom; c++) de[c] = new XPRBexpr();
for (a = 0; a < NArc; a++) {
/* Add terms to expressions one-by-one */
av[COST[a].suppl].add(x[a]);
de[COST[a].custm].add(x[a]);
}
/* Terminate the constraint definition */
for (s = 0; s < NSuppl; s++) p.newCtr("Avail", av[s].lEql(AVAIL[s]));
for (c = 0; c < NCustom; c++) p.newCtr("Demand", de[c].gEql(DEMAND[c]));
/****SOLVING + OUTPUT****/
p.exportProb(XPRB.MPS, "trans"); /* Matrix generation & output to MPS file */
p.lpOptimize(""); /* Solve the LP-problem */
System.out.println("Objective: " + p.getObjVal()); /* Get objective value */
for (a = 0; a < NArc; a++) /* Print out the solution values */
if (x[a].getSol() > 0)
System.out.println(
Suppliers.getIndexName(COST[a].suppl)
+ " ("
+ AVAIL[COST[a].suppl]
+ ") -> "
+ Customers.getIndexName(COST[a].custm)
+ " ("
+ DEMAND[COST[a].custm]
+ "): "
+ x[a].getSol());
}
/***********************************************************************/
/**** Initialize the stream tokenizer ****/
static StreamTokenizer initST(FileReader file) {
StreamTokenizer st = null;
st = new StreamTokenizer(file); /* Initialize the stream tokenizer */
st.commentChar('!'); /* Use the character '!' for comments */
st.eolIsSignificant(true); /* Return end-of-line character */
st.ordinaryChar(','); /* Use ',' as separator */
st.parseNumbers(); /* Read numbers as numbers (not strings)*/
return st;
}
/**** Read data from files ****/
static void readData(XPRBprob p) throws IOException {
FileReader datafile = null;
StreamTokenizer st;
int i;
/* Create supplier and customer index sets */
Suppliers = p.newIndexSet("suppl", MaxSuppliers);
Customers = p.newIndexSet("custom", MaxCustomers);
AVAIL = new double[MaxSuppliers];
DEMAND = new double[MaxCustomers];
/* Read the demand data file */
datafile = new FileReader(DEMANDFILE);
st = initST(datafile);
do {
do {
st.nextToken();
} while (st.ttype == st.TT_EOL); /* Skip empty lines */
if (st.ttype != st.TT_WORD) break;
i = Customers.addElement(st.sval);
if (st.nextToken() != ',') break;
if (st.nextToken() != st.TT_NUMBER) break;
DEMAND[i] = st.nval;
} while (st.nextToken() == st.TT_EOL);
datafile.close();
NCustom = Customers.getSize();
/* Read the supply data file */
datafile = new FileReader(AVAILFILE);
st = initST(datafile);
do {
do {
st.nextToken();
} while (st.ttype == st.TT_EOL);
if (st.ttype != st.TT_WORD) break;
i = Suppliers.addElement(st.sval);
if (st.nextToken() != ',') break;
if (st.nextToken() != st.TT_NUMBER) break;
AVAIL[i] = st.nval;
} while (st.nextToken() == st.TT_EOL);
datafile.close();
NSuppl = Suppliers.getSize();
/* Read the cost data file */
NArc = 0;
datafile = new FileReader(COSTFILE);
st = initST(datafile);
do {
/* Read the cost data file and fill the index sets */
do {
st.nextToken();
} while (st.ttype == st.TT_EOL); /* Skip empty lines */
if (st.ttype != st.TT_WORD) break;
COST[NArc] = new TData();
COST[NArc].suppl = Suppliers.getIndex(st.sval);
if (COST[NArc].suppl < 0) System.out.println("Supp(" + st.sval + ")");
if (st.nextToken() != ',') break;
if (st.nextToken() != st.TT_WORD) break;
COST[NArc].custm = Customers.getIndex(st.sval);
if (COST[NArc].custm < 0) System.out.println("Cust(" + st.sval + ")");
if (st.nextToken() != ',') break;
if (st.nextToken() != st.TT_NUMBER) break;
COST[NArc++].value = st.nval;
} while (st.nextToken() == st.TT_EOL);
datafile.close();
System.out.println("C: " + NCustom + " S: " + NSuppl + " A: " + NArc);
}
/***********************************************************************/
public static void main(String[] args) {
try (XPRBprob p = new XPRBprob("Trans"); /* Initialize BCL create a new problem */
XPRBexprContext context =
new XPRBexprContext() /* Release XPRBexpr instances at end of block. */) {
readData(p); /* Data input from file */
modTrans(p); /* Formulate and solve the problem */
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
}
|
|
xbcutex.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbcutex.java
* `````````````````
* Simplified version of xbexpl1.java showing how
* to define cuts with BCL.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2005, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbcutex {
static final int NJ = 4; /* Number of jobs */
static final int NT = 10; /* Time limit */
/**** DATA ****/
static final double[] DUR = {3, 4, 2, 2}; /* Durations of jobs */
static XPRBvar[] start; /* Start times of jobs */
static XPRBvar[][] delta; /* Binaries for start times */
static XPRBvar z; /* Maximum completion time (makespan) */
/*************************************************************************/
static class CutMgrCallback implements XPRScutMgrListener {
public int XPRScutMgrEvent(XPRSprob oprob, Object data) {
XPRBprob bprob;
XPRBcut[] ca;
int num, i;
bprob = (XPRBprob) data; /* Get the BCL problem */
try {
bprob.beginCB(oprob);
num = oprob.getIntAttrib(XPRS.NODES);
if (num == 2) {
/* Only generate cuts at node 2 */
ca = new XPRBcut[2];
ca[0] = bprob.newCut(start[1].add(2).lEql(start[0]), 2);
ca[1] = bprob.newCut(start[2].mul(4).add(start[3].mul(-5.3)).lEql(-17), 2);
System.out.println("Adding constraints:");
for (i = 0; i < 2; i++) ca[i].print();
bprob.addCuts(ca);
}
bprob.endCB();
} catch (XPRSprobException e) {
System.out.println("Error " + e.getCode() + ": " + e.getMessage());
}
return 0; /* Call this method once per node */
}
}
/*************************************************************************/
static void jobsModel(XPRBprob p) {
XPRBexpr le;
int j, t;
/****VARIABLES****/
start = new XPRBvar[NJ]; /* Create start time variables */
for (j = 0; j < NJ; j++) start[j] = p.newVar("start");
z = p.newVar("z", XPRB.PL, 0, NT); /* Declare the makespan variable */
delta = new XPRBvar[NJ][NT];
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), XPRB.BV);
/****CONSTRAINTS****/
for (j = 0; j < NJ; j++) /* Calculate maximal completion time */
p.newCtr("Makespan", start[j].add(DUR[j]).lEql(z));
p.newCtr("Prec", start[0].add(DUR[0]).lEql(start[2]));
/* Precedence rel. between jobs */
for (j = 0; j < NJ; j++) {
/* Linking start times and binaries */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t].mul((t + 1)));
p.newCtr("Link_" + (j + 1), le.eql(start[j]));
}
for (j = 0; j < NJ; j++) {
/* One unique start time for each job */
le = new XPRBexpr();
for (t = 0; t < (NT - DUR[j] + 1); t++) le.add(delta[j][t]);
p.newCtr("One_" + (j + 1), le.eql(1));
}
/****OBJECTIVE****/
p.setObj(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 */
/****OUTPUT****/
p.print(); /* Print out the problem definition */
}
/*************************************************************************/
static void jobsSolve(XPRBprob p) throws XPRSexception {
int j, t, statmip;
XPRSprob oprob;
CutMgrCallback cb;
oprob = p.getXPRSprob(); /* Get Optimizer problem */
oprob.setIntControl(XPRS.HEUREMPHASIS, 0);
oprob.setIntControl(XPRS.CUTSTRATEGY, 0);
/* Switch automated cut generation off:
otherwise this problem is solved in the
first node of the MIP search tree */
p.setCutMode(1); /* Switch presolve off, enable cut manager */
cb = new CutMgrCallback();
oprob.addCutMgrListener(cb, p);
p.setSense(XPRB.MINIM);
p.mipOptimize(""); /* Solve the problem as MIP */
statmip = p.getMIPStat(); /* Get the MIP problem status */
if ((statmip == XPRB.MIP_SOLUTION) || (statmip == XPRB.MIP_OPTIMAL)) {
/* An integer solution has been found */
System.out.println("Objective: " + p.getObjVal());
for (j = 0; j < NJ; j++) {
/* Print the solution for all start times */
System.out.println(start[j].getName() + ": " + start[j].getSol());
for (t = 0; t < NT - DUR[j] + 1; t++)
System.out.print(delta[j][t].getName() + ": " + delta[j][t].getSol());
System.out.println();
}
}
}
/*************************************************************************/
public static void main(String[] args) throws XPRSexception {
try (XPRBprob p = new XPRBprob("Jobs"); /* Initialize BCL and create a new problem */
XPRBexprContext context =
new XPRBexprContext(); /* Release XPRBexpr instances at end of block. */
XPRS xprs = new XPRS()) {
/* Initialize Xpress-Optimizer */
jobsModel(p); /* Basic problem definition */
jobsSolve(p); /* Solve and print solution */
}
}
}
|
|
xbqpr12.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbqpr12.java
* `````````````````
* Small Quadratic Programming example.
* minimize x1 + x1^2 +2x1x2 +2x2^2 +x4^2
* s.t. C1: x1 +2x2 -4x4 >= 0
* C2: 3x1 -2x3 - x4 <= 100
* C3: 10 <= x1 +3x2 +3x3 -2x4 <= 30
* 0<=x1<=20
* 0<=x2,x3
* x4 free
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, Jan. 2000, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbqpr12 {
static final int NXPRBvar = 4;
/***********************************************************************/
public static void main(String[] args) throws IOException {
try (XPRBprob p = new XPRBprob("QPr12"); /* Initialize BCL and create a new problem */
XPRBexprContext context =
new XPRBexprContext() /* Release XPRBexpr instances at end of block. */) {
XPRBctr c;
XPRBexpr le, qobj;
XPRBvar[] x;
int i;
/**** VARIABLES ****/
x = new XPRBvar[NXPRBvar];
x[0] = p.newVar("x1", XPRB.PL, 0, 20);
x[1] = p.newVar("x2");
x[2] = p.newVar("x3");
x[3] = p.newVar("x4", XPRB.PL, -XPRB.INFINITY, XPRB.INFINITY);
/****OBJECTIVE****/
qobj = new XPRBexpr(); /* Define the objective function */
qobj.add(x[0]);
qobj.add((x[0].sqr()).add(x[0].mul(2).mul(x[1])).add(x[1].sqr().mul(2)).add(x[3].sqr()));
p.setObj(qobj);
/**** CONSTRAINTS ****/
p.newCtr("C1", x[0].add(x[1].mul(2)).add(x[3].mul(-4)).gEql(0));
p.newCtr("C2", x[0].mul(3).add(x[2].mul(-2)).add(x[3].mul(-1)).lEql(100));
c = p.newCtr("C3", x[0].add(x[1].mul(3)).add(x[2].mul(3)).add(x[3].mul(-2)));
c.setRange(10, 30);
/****SOLVING + OUTPUT****/
p.print(); /* Print out the problem definition */
p.exportProb(XPRB.MPS, "QPr12"); /* Output the matrix in MPS format */
p.exportProb(XPRB.LP, "QPr12"); /* Output the matrix in LP format */
p.setSense(XPRB.MINIM); /* Choose the sense of the optimization */
p.lpOptimize(""); /* Solve the QP-problem */
System.out.println("Objective function value: " + p.getObjVal());
for (i = 0; i < NXPRBvar; i++) System.out.print(x[i].getName() + ": " + x[i].getSol() + ", ");
System.out.println();
}
}
}
|
|
xbairport.java |
/********************************************************
* BCL Example Problems
* ====================
*
* file xbairport.java
* ```````````````````
* QCQP problem by
* Rodrigo de Barros Nabholz & Maria Aparecida Diniz Ehrhardt
* November 1994, DMA - IMECC- UNICAMP.
* Based on AMPL model airport.mod by Hande Y. Benson
* (Source: http://www.orfe.princeton.edu/~rvdb/ampl/nlmodels/ )
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, June 2008, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbairport {
static final int N = 42;
static final double CX[] = {
-6.3, -7.8, -9, -7.2, -5.7, -1.9, -3.5, -0.5, 1.4, 4, 2.1, 5.5, 5.7, 5.7, 3.8, 5.3, 4.7, 3.3, 0,
-1, -0.4, 4.2, 3.2, 1.7, 3.3, 2, 0.7, 0.1, -0.1, -3.5, -4, -2.7, -0.5, -2.9, -1.2, -0.4, -0.1,
-1, -1.7, -2.1, -1.8, 0
};
static final double CY[] = {
8, 5.1, 2, 2.6, 5.5, 7.1, 5.9, 6.6, 6.1, 5.6, 4.9, 4.7, 4.3, 3.6, 4.1, 3, 2.4, 3, 4.7, 3.4, 2.3,
1.5, 0.5, -1.7, -2, -3.1, -3.5, -2.4, -1.3, 0, -1.7, -2.1, -0.4, -2.9, -3.4, -4.3, -5.2, -6.5,
-7.5, -6.4, -5.1, 0
};
static final double R[] = {
0.09, 0.3, 0.09, 0.45, 0.5, 0.04, 0.1, 0.02, 0.02, 0.07, 0.4, 0.045, 0.05, 0.056, 0.36, 0.08,
0.07, 0.36, 0.67, 0.38, 0.37, 0.05, 0.4, 0.66, 0.05, 0.07, 0.08, 0.3, 0.31, 0.49, 0.09, 0.46,
0.12, 0.07, 0.07, 0.09, 0.05, 0.13, 0.16, 0.46, 0.25, 0.1
};
public static void main(String[] args) throws IOException {
try (XPRBprob prob = new XPRBprob("airport"); /* Initialize BCL and create a new problem */
XPRBexprContext context =
new XPRBexprContext() /* Release XPRBexpr instances at end of block. */) {
int i, j;
XPRBvar[] x, y; /* x-/y-coordinates to determine */
XPRBexpr qe;
XPRBctr cobj, c;
/**** VARIABLES ****/
x = new XPRBvar[N];
for (i = 0; i < N; i++) x[i] = prob.newVar("x(" + (i + 1) + ")", XPRB.PL, -10, 10);
y = new XPRBvar[N];
for (i = 0; i < N; i++) y[i] = prob.newVar("y(" + (i + 1) + ")", XPRB.PL, -10, 10);
/****OBJECTIVE****/
/* Minimize the total distance between all points */
/* sum(i in 1..N-1,j in i+1..N) ((x(i)-x(j))^2+(y(i)-y(j))^2) */
qe = new XPRBexpr();
for (i = 0; i < N - 1; i++)
for (j = i + 1; j < N; j++)
qe.add((x[i].add(x[j].mul(-1))).sqr()).add((y[i].add(y[j].mul(-1))).sqr());
cobj = prob.newCtr("TotDist", qe);
prob.setObj(cobj); /* Set objective function */
/**** CONSTRAINTS ****/
/* All points within given distance of their target location */
/* (x(i)-CX(i))^2+(y(i)-CY(i))^2 <= R(i) */
for (i = 0; i < N; i++)
c =
prob.newCtr(
"LimDist", (x[i].add(-CX[i])).sqr().add((y[i].add(-CY[i])).sqr()).lEql(R[i]));
/****SOLVING + OUTPUT****/
prob.setSense(XPRB.MINIM); /* Choose the sense of optimization */
/* Problem printing and matrix output: */
/*
prob.print();
prob.exportProb(XPRB.MPS, "airport");
prob.exportProb(XPRB.LP, "airport");
*/
prob.lpOptimize(""); /* Solve the problem */
System.out.println("Solution: " + prob.getObjVal());
for (i = 0; i < N; i++)
System.out.println(
x[i].getName() + ": " + x[i].getSol() + ", " + y[i].getName() + ": " + y[i].getSol());
}
}
}
|
|
xbcontr1.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbcontr1.java
* ``````````````````
* Contract allocation example.
* Combining BCL problem input with problem solving
* in Xpress-Optimizer.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2005, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbcontr1 {
static final int District = 6; /* Number of districts */
static final int Contract = 10; /* Number of contracts */
/**** DATA ****/
static final int[] OUTPUT = {50, 40, 10, 20, 70, 50};
/* Max. output per district */
static final int[] COST = {50, 20, 25, 30, 45, 40};
/* Cost per district */
static final int[] VOLUME = {20, 10, 30, 15, 20, 30, 10, 50, 10, 20};
/* Volume of contracts */
/***********************************************************************/
public static void main(String[] args) throws XPRSexception, XPRSprobException {
try (XPRBprob p =
new XPRBprob("Contract1"); /* Initialize BCL and create a new problem in BCL */
XPRBexprContext context =
new XPRBexprContext(); /* Release XPRBexpr instances at end of block. */
XPRS xprs = new XPRS()) {
/* Initialize Xpress-Optimizer */
int d, c, i, stat, ncol, len;
double[] sol;
double val;
java.lang.String[] names;
XPRSprob op;
XPRBexpr l1, l2, lobj;
XPRBvar[][] x; /* Variables indicating whether a project
is chosen */
XPRBvar[][] y; /* Quantities allocated to contractors */
/**** VARIABLES ****/
x = new XPRBvar[District][Contract];
y = new XPRBvar[District][Contract];
for (d = 0; d < District; d++)
for (c = 0; c < Contract; c++) {
x[d][c] = p.newVar("x_d" + (d + 1) + "_c" + (c + 1), XPRB.BV);
y[d][c] = p.newVar("q_d" + (d + 1) + "_c" + (c + 1), XPRB.SC, 0, OUTPUT[d]);
y[d][c].setLim(5);
}
/****OBJECTIVE****/
lobj = new XPRBexpr();
for (d = 0; d < District; d++) for (c = 0; c < Contract; c++) lobj.add(y[d][c].mul(COST[d]));
p.setObj(lobj); /* Set the objective function */
/**** CONSTRAINTS ****/
for (c = 0; c < Contract; c++) {
l1 = new XPRBexpr();
l2 = new XPRBexpr();
for (d = 0; d < District; d++) {
l1.add(y[d][c]);
l2.add(x[d][c]);
}
p.newCtr("Size", l1.gEql(VOLUME[c])); /* "Size": cover the req. volume */
p.newCtr("Min", l2.gEql(2)); /* "Min": at least 2 districts / contract */
}
for (d = 0; d < District; d++) {
/* Do not exceed max. output */
l1 = new XPRBexpr();
for (c = 0; c < Contract; c++) l1.add(y[d][c]);
p.newCtr("Output", l1.lEql(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].lEql(y[d][c]));
/****SOLVING + OUTPUT****/
p.loadMat(); /* Load the matrix explicitly */
op = p.getXPRSprob(); /* Retrieve the Optimizer problem */
op.mipOptimize(""); /* Solve the MIP problem */
stat = op.getIntAttrib(XPRS.MIPSTATUS);
/* Get the global (MIP) status */
if ((stat == XPRS.MIP_SOLUTION) || (stat == XPRS.MIP_OPTIMAL)) {
/* Test whether an integer sol. was found */
val = op.getDblAttrib(XPRS.MIPOBJVAL);
System.out.println("Objective: " + val);
ncol = op.getIntAttrib(XPRS.COLS);
sol = new double[ncol];
op.getMipSol(sol); /* Get the primal solution values */
names = new java.lang.String[ncol];
op.getNames(XPRS.NAMES_COLUMN, names, 0, ncol - 1); /* Get the variable names */
for (i = 0; i < ncol; i++) /* Print out the solution */
if (sol[i] != 0) System.out.print(names[i] + ": " + sol[i] + ", ");
System.out.println();
}
}
}
}
|
|
xbcontr2.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbcontr2.java
* ``````````````````
* Contract allocation example.
* Combining BCL problem input with problem solving
* and callbacks in Xpress-Optimizer.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2005, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbcontr2 {
static final int District = 6; /* Number of districts */
static final int Contract = 10; /* Number of contracts */
/**** DATA ****/
static final int[] OUTPUT = {50, 40, 10, 20, 70, 50};
/* Max. output per district */
static final int[] COST = {50, 20, 25, 30, 45, 40};
/* Cost per district */
static final int[] VOLUME = {20, 10, 30, 15, 20, 30, 10, 50, 10, 20};
/* Volume of contracts */
/***********************************************************************/
static class IntSolCallback implements XPRSintSolListener {
public void XPRSintSolEvent(XPRSprob oprob, Object data) {
int num, d, c;
XPRBprob bprob;
XPRBvar y;
try {
bprob = (XPRBprob) data;
bprob.beginCB(oprob);
num = oprob.getIntAttrib(XPRS.MIPSOLS); /* Get number of the solution */
bprob.sync(XPRB.XPRS_SOL); /* Update BCL solution values */
System.out.println("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.out.println(y.getName() + ": " + y.getSol());
}
bprob.endCB();
} catch (XPRSprobException e) {
System.out.println("Error " + e.getCode() + ": " + e.getMessage());
}
}
}
/***********************************************************************/
public static void main(String[] args) throws XPRSexception {
try (XPRBprob p = new XPRBprob("Contract2"); /* Initialize BCL and create a new problem BCL */
XPRBexprContext context =
new XPRBexprContext(); /* Release XPRBexpr instances at end of block. */
XPRS xprs = new XPRS() /* Initialize Xpress-Optimizer */) {
int d, c, i, stat, ncol, len;
double[] sol;
double val;
java.lang.String[] names;
XPRSprob op;
IntSolCallback cb;
XPRBvar[][] x; /* Variables indicating whether a project
is chosen */
XPRBvar[][] y; /* Quantities allocated to contractors */
XPRBexpr l1, l2, lobj;
/**** VARIABLES ****/
x = new XPRBvar[District][Contract];
y = new XPRBvar[District][Contract];
for (d = 0; d < District; d++)
for (c = 0; c < Contract; c++) {
x[d][c] = p.newVar("x_d" + (d + 1) + "_c" + (c + 1), XPRB.BV);
y[d][c] = p.newVar("q_d" + (d + 1) + "_c" + (c + 1), XPRB.SC, 0, OUTPUT[d]);
y[d][c].setLim(5);
}
/****OBJECTIVE****/
lobj = new XPRBexpr();
for (d = 0; d < District; d++) for (c = 0; c < Contract; c++) lobj.add(y[d][c].mul(COST[d]));
p.setObj(lobj); /* Set the objective function */
/**** CONSTRAINTS ****/
for (c = 0; c < Contract; c++) {
l1 = new XPRBexpr();
l2 = new XPRBexpr();
for (d = 0; d < District; d++) {
l1.add(y[d][c]);
l2.add(x[d][c]);
}
p.newCtr("Size", l1.gEql(VOLUME[c])); /* "Size": cover the req. volume */
p.newCtr("Min", l2.gEql(2)); /* "Min": at least 2 districts / contract */
}
for (d = 0; d < District; d++) {
/* Do not exceed max. output */
l1 = new XPRBexpr();
for (c = 0; c < Contract; c++) l1.add(y[d][c]);
p.newCtr("Output", l1.lEql(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].lEql(y[d][c]));
/****SOLVING + OUTPUT****/
cb = new IntSolCallback();
p.getXPRSprob().addIntSolListener(cb, p);
/* Define an integer solution callback */
p.mipOptimize(""); /* Solve the MIP problem */
}
}
}
|
|
xbcontr2s.java |
/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbcontr2s.java
* ```````````````````
* Contract allocation example.
* Combining BCL problem input with problem solving
* and callbacks in Xpress-Optimizer.
* -- Single MIP thread --
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2005, rev. Dec. 2011
********************************************************/
import com.dashoptimization.*;
import java.io.*;
public class xbcontr2s {
static final int District = 6; /* Number of districts */
static final int Contract = 10; /* Number of contracts */
/**** DATA ****/
static final int[] OUTPUT = {50, 40, 10, 20, 70, 50};
/* Max. output per district */
static final int[] COST = {50, 20, 25, 30, 45, 40};
/* Cost per district */
static final int[] VOLUME = {20, 10, 30, 15, 20, 30, 10, 50, 10, 20};
/* Volume of contracts */
/***********************************************************************/
static class IntSolCallback implements XPRSintSolListener {
public void XPRSintSolEvent(XPRSprob oprob, Object data) {
int num, d, c;
XPRBprob bprob;
XPRBvar y;
try {
bprob = (XPRBprob) data;
num = oprob.getIntAttrib(XPRS.MIPSOLS); /* Get number of the solution */
bprob.sync(XPRB.XPRS_SOL); /* Update BCL solution values */
System.out.println("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.out.println(y.getName() + ": " + y.getSol());
}
} catch (XPRSprobException e) {
System.out.println("Error " + e.getCode() + ": " + e.getMessage());
}
}
}
/***********************************************************************/
public static void main(String[] args) throws XPRSexception {
try (XPRBprob p = new XPRBprob("Contract2"); /* Initialize BCL and create a new problem */
XPRBexprContext context =
new XPRBexprContext(); /* Release XPRBexpr instances at end of block. */
XPRS xprs = new XPRS()) {
/* Initialize Xpress-Optimizer */
int d, c, i, stat, ncol, len;
double[] sol;
double val;
java.lang.String[] names;
XPRSprob op;
IntSolCallback cb;
XPRBexpr l1, l2, lobj;
XPRBvar[][] x; /* Variables indicating whether a project
is chosen */
XPRBvar[][] y; /* Quantities allocated to contractors */
/**** VARIABLES ****/
x = new XPRBvar[District][Contract];
y = new XPRBvar[District][Contract];
for (d = 0; d < District; d++)
for (c = 0; c < Contract; c++) {
x[d][c] = p.newVar("x_d" + (d + 1) + "_c" + (c + 1), XPRB.BV);
y[d][c] = p.newVar("q_d" + (d + 1) + "_c" + (c + 1), XPRB.SC, 0, OUTPUT[d]);
y[d][c].setLim(5);
}
/****OBJECTIVE****/
lobj = new XPRBexpr();
for (d = 0; d < District; d++) for (c = 0; c < Contract; c++) lobj.add(y[d][c].mul(COST[d]));
p.setObj(lobj); /* Set the objective function */
/**** CONSTRAINTS ****/
for (c = 0; c < Contract; c++) {
l1 = new XPRBexpr();
l2 = new XPRBexpr();
for (d = 0; d < District; d++) {
l1.add(y[d][c]);
l2.add(x[d][c]);
}
p.newCtr("Size", l1.gEql(VOLUME[c])); /* "Size": cover the req. volume */
p.newCtr("Min", l2.gEql(2)); /* "Min": at least 2 districts / contract */
}
for (d = 0; d < District; d++) {
/* Do not exceed max. output */
l1 = new XPRBexpr();
for (c = 0; c < Contract; c++) l1.add(y[d][c]);
p.newCtr("Output", l1.lEql(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].lEql(y[d][c]));
/****SOLVING + OUTPUT****/
/* Desactivate parallel MIP (for synchronization of BCL and Optimizer) */
p.getXPRSprob().setIntControl(XPRS.MIPTHREADS, 1);
cb = new IntSolCallback();
p.getXPRSprob().addIntSolListener(cb, p);
/* Define an integer solution callback */
p.mipOptimize(""); /* Solve the MIP problem */
}
}
}
|
|