Originally posted by: napoleao
Hi Paul,
maybe things are much easier now:
http://publib.boulder.ibm.com/infocenter/cosinfoc/v12r3/index.jsp?topic=%2Filog.odms.cplex.help%2Fhtml%2Frefcallablelibrary%2Fhtml%2Ffunctions%2FCPXsetlazyconstraintcallbackfunc.html To confirm, I used the following implementation:
public class BendersIncumbentCallback extends IloCplex.IncumbentCallback {
public void main() throws IloException {
System.out.println("Node " + getNnodes() + ": IncumbentCallback called");
}
}
class BendersBranchCallback extends IloCplex.BranchCallback{
public void main() throws IloException {
System.out.println("Node " + getNnodes() + ": BranchCallback called");
}
}
class BendersLazyConstraintCallback extends IloCplex.LazyConstraintCallback {
boolean local;
private Subproblem subproblem;
BendersLazyConstraintCallback(boolean local) throws IloException {
this.local = local;
subproblem = new Subproblem(data);
}
private double[] getContractValues() throws IloException {
double[] solution = new double[data.nContracts];
for (int j = 0; j < data.nContracts; j++) {
solution[j] = getValue(contracts[j]);
}
return solution;
}
public void main() throws IloException {
System.out.println("Node " + getNnodes() + ": LazyConstraintCallback called");
double[] contractValues = getContractValues();
int status = subproblem.solveModel(contractValues);
if (status == 1) {
// subproblem is optimal
if (subproblem.cplex.getObjValue() - getValue(Z) > 0.001) {
// generate Benders' optimality cut to master problem
System.out.println("Node " + getNnodes() + ": Infeasible incumbent");
if (local) {
addLocal(bendersCut(subproblem));
} else {
add(bendersCut(subproblem));
}
//exportModel(getNnodes());
}
} else if (status == 0){
// subproblem is unbounded
System.out.println("unexpected status 0");
} else {
//unexpected subproblem status
System.out.println("unexpected status -1");
}
}
}
And the LazyConstraintCallback has just been called for Nodes that present integer feasible solutions.
Node 0: LazyConstraintCallback called
Node 0: Infeasible incumbent
Node 0: LazyConstraintCallback called
Node 0: IncumbentCallback called
Node 0: BranchCallback called
Node 1: BranchCallback called
Node 2: LazyConstraintCallback called
Node 2: Infeasible incumbent
Node 2: BranchCallback called
Node 3: BranchCallback called
Node 4: BranchCallback called
Node 5: BranchCallback called
Node 6: BranchCallback called
Node 7: BranchCallback called
Node 8: BranchCallback called
Node 9: BranchCallback called
Node 10: LazyConstraintCallback called
Node 10: Infeasible incumbent
Node 10: LazyConstraintCallback called
Node 10: Infeasible incumbent
Node 10: LazyConstraintCallback called
Node 10: IncumbentCallback called
Node 10: BranchCallback called
Node 12: BranchCallback called
Node 13: BranchCallback called
Node 14: BranchCallback called
Node 15: BranchCallback called
Node 16: BranchCallback called
Node 17: BranchCallback called
Node 18: LazyConstraintCallback called
Node 18: Infeasible incumbent
Node 18: LazyConstraintCallback called
Node 18: IncumbentCallback called
Node 18: BranchCallback called
Node 19: LazyConstraintCallback called
Node 19: Infeasible incumbent
Node 19: LazyConstraintCallback called
Node 19: IncumbentCallback called
Node 19: BranchCallback called
Node 20: LazyConstraintCallback called
Node 20: Infeasible incumbent
Node 20: LazyConstraintCallback called
Node 20: IncumbentCallback called
Node 20: BranchCallback called
Node 22: LazyConstraintCallback called
Node 22: Infeasible incumbent
Node 22: BranchCallback called
Node 23: LazyConstraintCallback called
Node 23: IncumbentCallback called
Node 23: BranchCallback called
Node 24: BranchCallback called
Node 25: BranchCallback called
Node 26: BranchCallback called
Node 27: BranchCallback called
Node 28: BranchCallback called
Node 29: BranchCallback called
Node 30: LazyConstraintCallback called
Node 30: IncumbentCallback called
Node 30: BranchCallback called
Node 34: BranchCallback called
Node 35: BranchCallback called
Node 36: BranchCallback called
Node 37: BranchCallback called
Node 38: BranchCallback called
Node 39: BranchCallback called
Node 40: BranchCallback called
Node 41: LazyConstraintCallback called
Node 41: Infeasible incumbent
Node 42: LazyConstraintCallback called
Node 42: Infeasible incumbent
Node 42: LazyConstraintCallback called
Node 42: IncumbentCallback called
Node 42: BranchCallback called
Node 43: BranchCallback called
Node 44: BranchCallback called
Node 45: LazyConstraintCallback called
Node 45: Infeasible incumbent
Node 45: LazyConstraintCallback called
Node 45: IncumbentCallback called
Node 45: BranchCallback called
Node 46: LazyConstraintCallback called
Node 46: Infeasible incumbent
Node 46: BranchCallback called
Node 47: BranchCallback called
Node 48: BranchCallback called
Node 49: BranchCallback called
Node 50: BranchCallback called
Node 51: LazyConstraintCallback called
Node 51: IncumbentCallback called
Node 51: BranchCallback called
Node 55: BranchCallback called
Node 56: BranchCallback called
Node 57: BranchCallback called
Node 58: BranchCallback called
Node 59: BranchCallback called
Node 60: BranchCallback called
Node 61: BranchCallback called
Node 62: BranchCallback called
Node 65: BranchCallback called
Node 66: BranchCallback called
Node 67: BranchCallback called
Node 68: BranchCallback called
Node 69: BranchCallback called
Node 70: BranchCallback called
Node 75: BranchCallback called
Node 76: BranchCallback called
Node 77: BranchCallback called
Node 78: BranchCallback called
Node 79: BranchCallback called
Node 80: BranchCallback called
Node 81: BranchCallback called
Node 82: BranchCallback called
Node 83: BranchCallback called
Node 84: BranchCallback called
Node 85: BranchCallback called
Node 86: BranchCallback called
Node 87: BranchCallback called
Node 88: BranchCallback called
Node 89: BranchCallback called
Node 90: BranchCallback called
Node 91: BranchCallback called
Node 92: BranchCallback called
Node 93: BranchCallback called
Node 94: BranchCallback called
Finally, from the documentation, it seems that only non-redundant cuts are now added to the pool.
Best,
Napo
#CPLEXOptimizers#DecisionOptimization