为 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