为 CPLEX OPL 热启动提供初始最佳 LB
Provide initial best LB to CPLEX OPL warm-start
我正在使用 OPL(无 Java/C++ API)在 CPLEX 12.10 中应用热启动技术来解决 MILP 最小化问题。
从模型1中,我得到了一个可行解S和一个LB值。
然后,我使用 doc 指示的 Vector API 将 S 作为模型 2 的 MIP 启动注入,并将 LB 作为约束 (obj >= LB
).
到目前为止,一切正常。但是,从引擎日志中,我注意到模型 2 没有使用提供的 LB 作为第一最佳边界。因此,面对困难的情况,模型 2 以明显大的 MIP GAP 结束,而模型 1 已经证明 LB 具有小得多的 MIP GAP。
有没有什么方法可以强制 CPLEX 使用提供的 LB 值作为一些截止值?在the official list of parameters, I found lower objective value limit,不过好像不推荐。
你可以写
oplModel.Obj.LB=0;
在流量控制中,如果 Obj 是 objective 并且 oplModel 是模型,但这并不总是有利于收敛。
例如,hybrid lifegame 给出
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
我正在使用 OPL(无 Java/C++ API)在 CPLEX 12.10 中应用热启动技术来解决 MILP 最小化问题。
从模型1中,我得到了一个可行解S和一个LB值。
然后,我使用 doc 指示的 Vector API 将 S 作为模型 2 的 MIP 启动注入,并将 LB 作为约束 (obj >= LB
).
到目前为止,一切正常。但是,从引擎日志中,我注意到模型 2 没有使用提供的 LB 作为第一最佳边界。因此,面对困难的情况,模型 2 以明显大的 MIP GAP 结束,而模型 1 已经证明 LB 具有小得多的 MIP GAP。
有没有什么方法可以强制 CPLEX 使用提供的 LB 值作为一些截止值?在the official list of parameters, I found lower objective value limit,不过好像不推荐。
你可以写
oplModel.Obj.LB=0;
在流量控制中,如果 Obj 是 objective 并且 oplModel 是模型,但这并不总是有利于收敛。
例如,hybrid lifegame 给出
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