Я пытаюсь изменить способ, которым Cplex выполняет свою ветвь и связывает во время оптимизации, используя свой C ++ API.Что я на самом деле хочу сделать:
- Задать параметры перед вызовом метода solve()
.Например, использование cplex.setParam(IloCplex::NodeSel, 0);
говорит Cplex, чтобы он выполнял DFS в дереве ветвлений и границ.
- Как только cplex нашел первого оператора (т.е. целочисленное решение проблемы), я хотел бы установить этопараметр to one (cplex.setParam(IloCplex::NodeSel, 1);
), что означает, что Cplex должен затем выполнить поиск с наилучшими границами вместо dfs в дереве.
Я попытался использовать действующий обратный вызов (который выполняется всякий раз, когда целочисленное решение), чтобы установить параметр следующим образом:
ILOINCUMBENTCALLBACK1(CustomIncumbentCallback, IloNumVarArray, vars){
cplex.setParam(IloCplex::NodeSel, 1);
...
}
и в main()
перед вызовом solve()
:
cplex.use(CustomIncumbentCallback(env));
Однако, похоже, он не работает ипараметры сохраняют свое первоначальное значение, даже когда в обратном вызове вызывается setParam
(я убедился, что этот обратный вызов выполняется, когда найдено целочисленное решение).Обратите внимание, что переменная cplex
является глобальной переменной в моем коде.
Мой вопрос: возможно ли изменить значение параметра во время оптимизации (после вызова solve()
, но до конца?об этом) и если да, то как?