2017-01-05 3 views
2

Я пытаюсь перевести некоторый код Gurobi на CPLEX, и у меня возникают проблемы с тем, как установить начальное значение для переменной.Что такое CPLEX-эквивалент метода .set() Gurobi?

Исходный код выглядит следующим образом:

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? Или мне нужно делать все сразу?

ответ

1

То, как вы добавляете начало MIP в CPLEX, является правильным (и альтернативного синтаксиса нет). Я не уверен, что вы имеете в виду именно «я должен делать все сразу», но, возможно, вы спрашиваете, можете ли вы указать начальное значение MIP для подмножества переменных, а не для всех из них. Если это так, см. MIP starts and effort level (например, с помощью CPX_MIPSTART_SOLVEMIP CPLEX решает subMIP, где вы должны указать значение по меньшей мере одной дискретной переменной). С C++ API метод addMIPStart имеет необязательный параметр effort для управления этим.

Смежные вопросы