Подсказки решателю
Подсказка — стартовое значение переменной, передаваемое решателю до начала поиска. Подсказки не являются ограничениями: решатель вправе их проигнорировать, если они противоречат ограничениям или ухудшают значение целевой функции.
Поэтому подсказки не меняют множество допустимых решений и не сужают пространство поиска. Они только направляют первые шаги в перспективную область.
Когда подсказки полезны
Подсказки эффективны на больших смешанно-целочисленных задачах, для которых известно содержательно правдоподобное стартовое решение:
- Перепланирование от текущего состояния. При оперативном перепланировании (production planning, scheduling) предыдущий план известен и обычно близок к новому оптимуму. Передача предыдущего плана как подсказки сокращает первую ветвь поиска.
- Эвристическое решение. Если для задачи известна простая жадная или конструктивная эвристика, её результат подаётся как подсказка. Решатель доказывает или улучшает это решение, а не ищет первое допустимое с нуля.
- Решение похожей задачи. В сериях задач, отличающихся параметрами (значениями коэффициентов, размерами заявок), решение предыдущей задачи часто полезно как подсказка для следующей.
Главный эффект подсказок — ускорение нахождения первого допустимого решения. Оно даёт верхнюю оценку (для задачи минимизации) и позволяет методу ветвей и границ отсекать неперспективные ветви с раннего этапа поиска.
Когда подсказки бесполезны
- Чистые LP-задачи. Симплекс-метод и метод внутренней точки имеют собственные механизмы инициализации и горячего старта. Передача стартовых значений через подсказки в этих алгоритмах не используется.
- Малые задачи, решающиеся за доли секунды без подсказок. Накладные расходы на подготовку подсказок не оправданы.
- Сильно изменившаяся задача. Если структура задачи существенно изменилась — изменены ограничения, добавлены или удалены переменные, — стартовое решение от предыдущего расчёта может не только не помочь, но и заметно ухудшить первый этап поиска.
Пример использования
Типичный сценарий — повторное решение MIP-задачи с подсказкой по предыдущему решению (имитация регламентного перепланирования):
Решение = Модель.Решить();
// При повторном решении (перепланировании) — подсказать значения булевых индикаторов
Если Решение.РешениеНайдено() Тогда
Для Каждого Индикатор Из ИндикаторыАктивации Цикл
Модель.Подсказки().Добавить(
Индикатор,
Решение.ЗначениеПеременной(Индикатор)
);
КонецЦикла;
КонецЕсли;
Подсказки могут передаваться выборочно — только для булевых переменных (как в примере выше) или только для тех непрерывных переменных, от значений которых зависит структура решения. Передавать подсказки для всех переменных не обязательно и часто избыточно.