CPLEX C ++: как изменить параметры при оптимизации - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь изменить способ, которым 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(), но до конца?об этом) и если да, то как?

1 Ответ

0 голосов
/ 14 мая 2018

Ваш вопрос связан с Как установить UpperCutoff при использовании обратного вызова с отложенным ограничением в CPLEX .

Ответ - нет. Вы не можете изменять параметры во время оптимизации, а настройка параметра из обратного вызова не поддерживается.

Однако для параметра расширенный пусковой переключатель по умолчанию установлено значение 1. В документации указано, что:

Для моделей MIP, установка 1 (один) заставит CPLEX продолжить с частично изученное дерево MIP, если оно доступно. Если исследование дерева еще не началось, настройка 1 (один) указывает, что CPLEX должен использовать загруженный старт MIP, если доступно. Настройка 2 сохраняет текущий действующий (если он есть) повторно применяет предварительную обработку и запускает новую поиск по новому корню.

Если вы прервете решение после того, как будет найден первый сотрудник, измените параметр и снова вызовите решение, оно должно продолжиться с того места, на котором остановилось, как описано выше.

...