为CPLEX OPL热启动提供初始最佳LB



我正在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

最新更新