Gurobi 的 .set() 方法的 CPLEX 等价物是什么?

What is the CPLEX equivalent of Gurobi's .set() method?

我正在尝试将一些 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 代码是什么?我无法在任何地方找到有关如何执行此操作的信息。我能找到的最接近的是:

http://www.ibm.com/support/knowledgecenter/en/SS9UKU_12.4.0/com.ibm.cplex.zos.help/UsrMan/topics/discr_optim/mip/para/49_mipStarts.html

但是,这表明我必须将起始值添加到模型本身,如下所示:

 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 那样对变量进行处理?还是我必须一次做完所有事情?

您在 CPLEX 中添加 MIP 开始的方式是正确的(并且没有替代语法)。我不确定 "do I have to do everything at once" 的确切含义,但也许您在问是否可以为一部分变量而不是所有变量提供 MIP 起始值。如果是这种情况,请参阅 MIP starts and effort level (e.g., with CPX_MIPSTART_SOLVEMIP CPLEX solves a subMIP where you must specify the value of at least one discrete variable). With the C++ API, the addMIPStart 方法有一个可选的 effort 参数来控制它。