我正在CPLEX 12.10中使用OPL(无Java/C++API(应用热启动技术来解决MILP最小化问题。从模型1中,我得到了一个可行的解S和一个LB值。然后,我使用由doc指示的向量API注入S作为模型2的MIP开始,并包括LB作为约束(obj >= LB
(。
到目前为止,一切都在运转。然而,从引擎日志中,我注意到模型2没有使用所提供的LB作为第一个最佳边界。因此,在困难的情况下,模型2以显著大的MIP GAP结束,而模型1已经证明LB具有小得多的MIP GAP。
是否有任何方法强制CPLEX使用提供的LB值作为某个截止值?在官方参数列表中,我发现目标值下限,但似乎不推荐使用。
您可以编写
oplModel.Obj.LB=0;
在流控制中,如果Obj是目标,oplModel是模型,但这并不总是有利于收敛。
例如,混合生命游戏提供
374
412
412
427
427
431
而如果我使用边界
// hybrid CPOptimizer and CPLEX to solve lifegame
//
// warmstart between CPO and CPLEX tu use them both
//
// the objective is maximize
//
// And in 60s
//
// we get
// 396 hybrid (hybrid.mod)
// 379 cplex alone (lifegameip.mod)
// 280 cpo alone (lifegamecp.mod)
int nbiter=3;
int n=30;
int values[0..(n+2)*(n+2)-1];
main {
var n=thisOplModel.n;
var nbiter=thisOplModel.nbiter;
var source1 = new IloOplModelSource("lifegameip.mod");
var cplex = new IloCplex();
var def1 = new IloOplModelDefinition(source1);
var source2 = new IloOplModelSource("lifegamecp.mod");
var cp = new IloCP();
var def2 = new IloOplModelDefinition(source2);
var opl1 = new IloOplModel(def1,cplex);
var opl2 = new IloOplModel(def2,cp);
opl1.generate();
opl2.generate();
var objValues=new Array(2*5);
for(var iter=1;iter<=nbiter;iter++)
{
writeln("iter ",iter);
opl1.Obj.UB=450;
// start with CPLEX
cplex.tilim=10;
cplex.solve();
writeln("cplex objective = ",cplex.getObjValue());
objValues[iter*2-1]=cplex.getObjValue();
cp.param.timelimit=10;
// Warmstart in CPO
var sol=new IloOplCPSolution();
for(var i=0;i<=(n+2)*(n+2)-1;i++) sol.setValue(opl2.x[i],opl1.x[i]);
cp.setStartingPoint(sol);
opl2.Obj.UB=450
// CP Solve
cp.solve();
writeln("cpo objective =",cp.getObjValue());
objValues[iter*2]=cp.getObjValue();
// And warmstart CPLEX
var vectors = new IloOplCplexVectors();
// We attach the values (defined as data) as starting solution
// for the variables x.
for(var i=0;i<=(n+2)*(n+2)-1;i++) thisOplModel.values[i]=opl2.x[i];
vectors.attach(opl1.x,thisOplModel.values);
vectors.setStart(cplex);
}
writeln("list of objectives") ;
for(var i=1;i<=2*nbiter;i++) writeln(objValues[i]);
}
我得到更糟糕的结果
0
241
241
332
332
366