我正在尝试将一些Gurobi代码转换为CPLEX,并且无法确定如何设置变量的起始值。
原始代码如下所示:
for (int b=0; b<nB ; ++b){
for (int t=0; t<t_max; ++t){
Yvars[b][t].set(GRB_DoubleAttr_Start, startVals[b][t+shift]);
}
}
等效的CPLEX代码是什么?我无法在任何地方找到有关如何执行此操作的信息。我能找到的最接近的是:
但是,这表明我必须将起始值添加到模型本身,如下所示:
IloNumVarArray startVar(env);
IloNumArray startVal(env);
for (int b = 0; b < nB; ++b)
for (int t = 0; t < t_max; ++t) {
startVar.add(Yvars[b][t]);
startVal.add(startVals[b][t+shift]);
}
cplex.addMIPStart(startVar, startVal);
并不仅仅像原始代码那样影响单个变量。有没有办法像Gurobi一样对变量这么做?或者我必须一次做所有事情吗?
答案 0 :(得分:1)
您在CPLEX中添加MIP启动的方式是正确的(并且没有替代语法)。我不确定你究竟是什么意思&#34;我是否必须一次做所有事情&#34;,但也许你在问你是否可以为一部分变量提供MIP起始值而不是全部他们。如果是这种情况,请参阅MIP starts and effort level(例如,使用CPX_MIPSTART_SOLVEMIP
CPLEX解决了一个subMIP,您必须在其中指定至少一个离散变量的值)。使用C ++ API,addMIPStart方法有一个可选的effort
参数来控制它。