Originally posted by: Namal
Ok, I tried this out with a simple example:
#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
ILOUSERCUTCALLBACK0(CtCallback) {
IloRange cut;
IloNumVar x1, x2;
x1.setName("x");
x2.setName("y");
cut = (x1+ 2*x2 <= 6);
add(cut).end();
}
static void populatebynonzero (IloModel model, IloNumVarArray x, IloRangeArray c)
{
IloEnv env = model.getEnv();
IloObjective obj = IloMaximize(env);
c.add(IloRange(env, -IloInfinity, 1.0));
c.add(IloRange(env, -IloInfinity, 12.0));
c.add(IloRange(env, -IloInfinity, 12.0));
x.add(IloNumVar(env, 0, IloInfinity, ILOINT));
x.add(IloNumVar(env, 0, IloInfinity, ILOINT));
obj.setLinearCoef(x[1], 1.0);
c[0].setLinearCoef(x[0], -1.0);
c[0].setLinearCoef(x[1], 1.0);
c[1].setLinearCoef(x[0], 3.0);
c[1].setLinearCoef(x[1], 2.0);
c[2].setLinearCoef(x[0], 2.0);
c[2].setLinearCoef(x[1], 3.0);
c[0].setName("c1");
c[1].setName("c2");
c[2].setName("c3");
x[0].setName("x");
x[1].setName("y");
model.add(obj);
model.add(c);
}
int main (int argc, char **argv){
IloEnv env;
try {
IloModel model(env);
IloCplex cplex(model);
cplex.setParam(IloCplex::RootAlg, IloCplex::Primal);
IloNumVarArray var(env);
IloRangeArray con(env);
populatebynonzero (model, var, con);
cplex.use(CtCallback(env));
if ( !cplex.solve() ) {
env.error() << "Failed to optimize LP" << endl;
throw(-1);
}
IloNumArray vals(env);
env.out() << "Solution status = " << cplex.getStatus() << endl;
env.out() << "Solution value = " << cplex.getObjValue() << endl;
cplex.getValues(vals, var);
env.out() << "Values = " << vals << endl;
cplex.getSlacks(vals, con);
env.out() << "Slacks = " << vals << endl;
}
catch (IloException& e) {
cerr << "Concert exception caught: " << e << endl;
}
catch (...) {
cerr << "Unknown exception caught" << endl;
}
env.end();
return 0;
}
How can I get the (float) values after the computation with that cut or stop further calculation at all?
#CPLEXOptimizers#DecisionOptimization