Какие обратные вызовы вызывают во время полировки? Более конкретно, есть ли обратный вызов, который вызывается для каждого нового решения, найденного во время полировки?
У меня есть некоторый (старый) код в C ++, который использует MIPInfoCallback и который хорошо вызывается во время B&B, но во время полировки это, кажется, не вызывается, хотя полировка находит, может быть, 20 или 30 улучшенных решений. В документации говорится, что обратные вызовы обычно вызываются во время полировки, но может случиться так, что MIPInfoCallback вызывается только перед исследованием каждого узла, и в моем случае полировка не исследует никаких дополнительных узлов.
Я попытался переключиться на использование действующего обратного вызова, но, похоже, это сильно повлияло на производительность — просто изменив тип моего обратного вызова с MIPInfoCallback на IncumbentCallback, можно изменить время получения первого возможного целочисленного решения с примерно 20 минут до более чем 3 часов (я действительно просто менял тип обратного вызова, оставляя тело обратного вызова без изменений). Я подозреваю, что это потому, что использование действующего обратного вызова отключает некоторые вещи в поиске.
Это на C ++ в Windows с CPLEX 12.1, но в ближайшее время планируется обновление до 12.5.
Ты пытался CPXsetincumbentcallbackfunc
из вызываемой библиотеки C? Я не исследовал его поведение при полировке, но он позволяет пользователю отклонять решения по прихоти, поэтому я полагаю, что он должен вызываться всякий раз, когда сотрудник собирается обновиться — в том числе во время полировки.
Других решений пока нет …