/********************************************************
* Xpress-BCL Java Example Problems
* ================================
*
* file xbgoalobj.java
* ```````````````````
* Archimedian and pre-emptive goal programming
* using objective functions.
*
* (c) 2008-2024 Fair Isaac Corporation
* author: S.Heipcke, 2005, rev. Mar. 2011
********************************************************/
import com.dashoptimization.*;
public class xbgoalobj {
static final int NGOALS = 3;
/**** Data ****/
static final String[] Type = {"perc", "abs", "perc"};
static final String[] Sense = {"max", "min", "max"};
static final double[] Weight = {100, 1, 0.1};
static final double[] Deviation = {10, 4, 20};
public static void main(String[] args) throws XPRSprobException, XPRSexception {
try (XPRBprob prob = new XPRBprob("Goal"); /* 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 */
XPRBvar x, y;
XPRBexpr[] goal;
XPRBexpr wobj;
XPRBctr[] goalCtr;
XPRBctr aCtr;
double[] Target;
int i, g;
Target = new double[NGOALS];
goalCtr = new XPRBctr[NGOALS];
goal = new XPRBexpr[NGOALS];
wobj = new XPRBexpr();
/* Adding the variables */
x = prob.newVar("x", XPRB.PL);
y = prob.newVar("y", XPRB.PL);
/* Adding a constraint */
aCtr = prob.newCtr("Limit", x.mul(42).add(y.mul(13)).lEql(100));
/* Goals */
goal[0] = x.mul(5).add(y.mul(2)).add(-20);
goal[1] = x.mul(-3).add(y.mul(15)).add(-48);
goal[2] = x.mul(1.5).add(y.mul(21)).add(-3.8);
for (g = 0; g < NGOALS; g++) goalCtr[g] = prob.newCtr("Goal" + (g + 1), goal[g]);
/**** Archimedian GP ****/
System.out.println("Archimedian:");
for (g = 0; g < NGOALS; g++) {
if (Sense[g] == "max") wobj.add(((XPRBexpr) goal[g].clone()).mul(-Weight[g]));
else wobj.add(((XPRBexpr) goal[g].clone()).mul(Weight[g]));
}
prob.setObj(wobj);
prob.getXPRSprob().setIntControl(XPRS.OUTPUTLOG, 0);
prob.lpOptimize("");
/* Solution printout */
System.out.println(" Solution: x: " + x.getSol() + ", y: " + y.getSol());
System.out.println(" Goal Target Value");
for (g = 0; g < NGOALS; g++)
System.out.println(
" "
+ (g + 1)
+ " "
+ Sense[g]
+ " "
+ (goalCtr[g].getAct() - goalCtr[g].getRHS()));
/**** Prememptive GP ****/
System.out.println("Prememptive:");
i = -1;
while (i < NGOALS - 1) {
i += 1;
if (Sense[i] == "max") {
prob.setObj(goal[i]);
prob.setSense(XPRB.MAXIM);
prob.lpOptimize("");
if (prob.getLPStat() != XPRB.LP_OPTIMAL) {
System.out.println("Cannot satisfy goal " + (i + 1));
break;
} else {
Target[i] = prob.getObjVal();
if (Type[i] == "perc") Target[i] -= Math.abs(Target[i]) * Deviation[i] / 100;
else Target[i] -= Deviation[i];
if (i < NGOALS - 1) goalCtr[i].add(Target[i]);
goalCtr[i].setType(XPRB.G);
}
} else {
prob.setObj(goal[i]);
prob.setSense(XPRB.MINIM);
prob.lpOptimize("");
if (prob.getLPStat() != XPRB.LP_OPTIMAL) {
System.out.println("Cannot satisfy goal " + i);
break;
} else {
Target[i] = prob.getObjVal();
if (Type[i] == "perc") Target[i] += Math.abs(Target[i]) * Deviation[i] / 100;
else Target[i] += Deviation[i];
if (i < NGOALS - 1) goalCtr[i].add(Target[i]);
goalCtr[i].setType(XPRB.L);
}
}
System.out.println("Solution(" + (i + 1) + "): x: " + x.getSol() + ", y: " + y.getSol());
}
/* Solution printout */
System.out.println(" Goal Target Value");
for (g = 0; g <= i; g++) {
System.out.print(
" "
+ (g + 1)
+ " "
+ (goalCtr[g].getType() == XPRB.G ? " >= " : " <= ")
+ Target[g]);
if (g == NGOALS - 1) System.out.println(" " + prob.getObjVal());
else System.out.println(" " + (goalCtr[g].getAct() - goalCtr[g].getRHS() + Target[g]));
}
}
}
}
|