Управление поиском
Помимо переменных, ограничений и целевой функции модель принимает два дополнительных сигнала решателю — подсказки и предположения. Эти сигналы не изменяют пространство допустимых решений, но влияют на процесс поиска: подсказки ускоряют нахождение решения, предположения позволяют временно зафиксировать булевы условия для серии запусков.
В отличие от ограничений, подсказки и предположения не обязательны к соблюдению с точки зрения формальной модели. Подсказка игнорируется решателем, если нарушает ограничения; предположения очищаются и заменяются между запусками без пересборки модели.
Подсказки
Подсказка — предложенное значение одной переменной. Совокупность подсказок задаёт стартовое решение, с которого решатель начинает поиск. Если предложенные значения удовлетворяют всем ограничениям, решатель получает допустимое решение немедленно и далее улучшает его. Если значения нарушают ограничения, подсказка игнорируется.
Основные сценарии применения:
- Тёплый старт при перерасчёте. После небольших изменений входных данных стартовым решением выступает предыдущее найденное. Подсказки с прошлыми значениями сокращают время повторного поиска.
- Использование исторических данных. Прошлогоднее расписание подаётся как подсказка для нового; решатель быстро адаптирует его под актуальные ограничения.
- Зафиксированное частичное решение. Часть переменных задана пользователем (например, обязательные смены руководителя), решатель дополняет остальные.
Пx = Модель.Переменные().ДобавитьИзДиапазона(0, 10, "x");
Пy = Модель.Переменные().ДобавитьИзДиапазона(0, 10, "y");
Модель.Ограничения().Соотношение("x + y = 12");
Модель.Ограничения().Соотношение("2*y < x < 10");
// Стартовая точка для поиска: x = 8, y = 3
Модель.Подсказки().Добавить(Пx, 8);
Модель.Подсказки().Добавить(Пy, 3);
Решение = Модель.Решить();
Очистка ранее установленных подсказок выполняется методом Подсказки().Очистить. Подсказки заменяются между запусками без пересборки модели.
Предположения
Предположение — набор булевых выражений, объявленных истинными для текущего запуска. В отличие от условных ограничений, фиксируемых в модели на постоянной основе, предположения добавляются и очищаются между запусками без пересборки модели.
Основное применение — анализ «что если»: одна модель используется в серии экспериментов, в каждом из которых временно активируется или запрещается часть условий.
Стандартный шаблон работы:
- В модель добавляется опциональное ограничение, привязанное к булевой переменной-индикатору.
- Перед запуском в модель добавляется предположение, фиксирующее истинность индикатора.
- Запускается поиск, проверяется результат.
- Предположения очищаются, при необходимости поиск выполняется заново с другим набором предположений или без них.
ВыборАВ_В = Модель.Переменные().ДобавитьБулеву("выбран_АВ_В");
// Опциональное ограничение, привязанное к индикатору
Модель.Ограничения().Соотношение("стоимость <= 100000", ВыборАВ_В);
// Активация индикатора через предположение
Модель.Предположения().Добавить(ВыборАВ_В);
Решение = Модель.Решить();
Если Решение.РешениеНайдено() Тогда
// Предположение подтвердилось: существует решение в стоимостном лимите
Иначе
// Решения нет; предположение очищается, выполняется поиск с другими условиями
Модель.Предположения().Очистить();
КонецЕсли;
Очистка установленных предположений выполняется методом Предположения().Очистить. Между запусками наборы предположений изменяются произвольно, что позволяет переключать модель между разными «срезами» условий без пересборки.
Когда что применять
| Задача | Подход | Причина |
|---|---|---|
| Большая модель, требуется ускорение поиска | Подсказки | Стартовое решение сокращает время до первого допустимого решения. |
| Частый перерасчёт после небольших изменений данных | Подсказки на значениях прошлого решения | Сокращает время инкрементального перерасчёта. |
| Серия запусков «что если» с разными активными условиями | Предположения | Изменяют активные условия без пересборки модели. |
| Жёсткая фиксация значения переменной | Ограничение ЗначениеРавно | Подсказки не гарантируют сохранение значения; ограничение гарантирует. |
| Условие, активируемое выбором решателя | Условные ограничения с булевой переменной | Это часть формулировки задачи, а не сигнал поиску. |
Стратегии перебора и нативные настройки решателя
Помимо подсказок и предположений модель поддерживает стратегии перебора переменных — порядок и способ, в котором решатель пробует значения для каждой переменной. Стратегии настраиваются в задачах с известной структурой, в которых правильный порядок поиска даёт ощутимое ускорение.
Расширенные параметры решателя — число потоков, лимит времени, признак подробного журналирования — задаются через настройки решателя при вызове Решить. Часть тонких параметров (выбор алгоритма пропагации, размер памяти под отсечения) задаётся через нативные настройки — точечный механизм для случаев, не покрытых типизированным API.
В большинстве прикладных задач значений по умолчанию достаточно. Тонкая настройка применяется, когда стандартный поиск не укладывается в бюджет времени и есть предметное понимание целей изменений.
Иллюстрация: серия запусков «что если»
Стандартный сценарий «что если» — одна модель и серия запусков с разными предположениями:
ВечерняяСменаРазрешена = Модель.Переменные().ДобавитьБулеву("вечер_ок");
// Опциональное ограничение: вечерняя смена назначается при истинности индикатора
Модель.Ограничения().Соотношение(
"число_назначений_вечерней_смены > 0",
ВечерняяСменаРазрешена
);
// Запуск 1: вечерние смены разрешены
Модель.Предположения().Добавить(ВечерняяСменаРазрешена);
Решение1 = Модель.Решить();
ОбщаяСтоимость1 = Решение1.ЗначениеЦелевойФункции();
// Запуск 2: вечерние смены запрещены
Модель.Предположения().Очистить();
Модель.Предположения().Добавить(Модель.Переменные().Отрицание(ВечерняяСменаРазрешена));
Решение2 = Модель.Решить();
ОбщаяСтоимость2 = Решение2.ЗначениеЦелевойФункции();
// Разница в стоимости — цена запрета вечерних смен
Этот же приём применяется в интерактивном анализе в форме 1С: пользователь устанавливает галочки активных условий, прикладной код формирует набор предположений и запускает пересчёт. Пример рабочего расписания, в котором уместна такая работа, — Составление графика работы сотрудников.
Полный перечень методов
Полный набор методов работы с подсказками, предположениями и стратегиями перебора приведён в разделе Программный интерфейс — Предположения и подсказки.