CPLEX: Вызывались ли какие-либо обратные вызовы для каждого решения, найденного при полировке?

Какие обратные вызовы вызывают во время полировки? Более конкретно, есть ли обратный вызов, который вызывается для каждого нового решения, найденного во время полировки?

У меня есть некоторый (старый) код в C ++, который использует MIPInfoCallback и который хорошо вызывается во время B&B, но во время полировки это, кажется, не вызывается, хотя полировка находит, может быть, 20 или 30 улучшенных решений. В документации говорится, что обратные вызовы обычно вызываются во время полировки, но может случиться так, что MIPInfoCallback вызывается только перед исследованием каждого узла, и в моем случае полировка не исследует никаких дополнительных узлов.

Я попытался переключиться на использование действующего обратного вызова, но, похоже, это сильно повлияло на производительность — просто изменив тип моего обратного вызова с MIPInfoCallback на IncumbentCallback, можно изменить время получения первого возможного целочисленного решения с примерно 20 минут до более чем 3 часов (я действительно просто менял тип обратного вызова, оставляя тело обратного вызова без изменений). Я подозреваю, что это потому, что использование действующего обратного вызова отключает некоторые вещи в поиске.

Это на C ++ в Windows с CPLEX 12.1, но в ближайшее время планируется обновление до 12.5.

0

Решение

Ты пытался CPXsetincumbentcallbackfunc из вызываемой библиотеки C? Я не исследовал его поведение при полировке, но он позволяет пользователю отклонять решения по прихоти, поэтому я полагаю, что он должен вызываться всякий раз, когда сотрудник собирается обновиться — в том числе во время полировки.

0

Другие решения

Других решений пока нет …