Перейти к основному содержимому

Управление поиском

Помимо переменных, ограничений и целевой функции модель принимает два дополнительных сигнала решателю — подсказки и предположения. Эти сигналы не изменяют пространство допустимых решений, но влияют на процесс поиска: подсказки ускоряют нахождение решения, предположения позволяют временно зафиксировать булевы условия для серии запусков.

В отличие от ограничений, подсказки и предположения не обязательны к соблюдению с точки зрения формальной модели. Подсказка игнорируется решателем, если нарушает ограничения; предположения очищаются и заменяются между запусками без пересборки модели.

Подсказки

Подсказка — предложенное значение одной переменной. Совокупность подсказок задаёт стартовое решение, с которого решатель начинает поиск. Если предложенные значения удовлетворяют всем ограничениям, решатель получает допустимое решение немедленно и далее улучшает его. Если значения нарушают ограничения, подсказка игнорируется.

Основные сценарии применения:

  • Тёплый старт при перерасчёте. После небольших изменений входных данных стартовым решением выступает предыдущее найденное. Подсказки с прошлыми значениями сокращают время повторного поиска.
  • Использование исторических данных. Прошлогоднее расписание подаётся как подсказка для нового; решатель быстро адаптирует его под актуальные ограничения.
  • Зафиксированное частичное решение. Часть переменных задана пользователем (например, обязательные смены руководителя), решатель дополняет остальные.
Пx = Модель.Переменные().ДобавитьИзДиапазона(0, 10, "x");
Пy = Модель.Переменные().ДобавитьИзДиапазона(0, 10, "y");

Модель.Ограничения().Соотношение("x + y = 12");
Модель.Ограничения().Соотношение("2*y < x < 10");

// Стартовая точка для поиска: x = 8, y = 3
Модель.Подсказки().Добавить(Пx, 8);
Модель.Подсказки().Добавить(Пy, 3);

Решение = Модель.Решить();

Очистка ранее установленных подсказок выполняется методом Подсказки().Очистить. Подсказки заменяются между запусками без пересборки модели.

Предположения

Предположение — набор булевых выражений, объявленных истинными для текущего запуска. В отличие от условных ограничений, фиксируемых в модели на постоянной основе, предположения добавляются и очищаются между запусками без пересборки модели.

Основное применение — анализ «что если»: одна модель используется в серии экспериментов, в каждом из которых временно активируется или запрещается часть условий.

Стандартный шаблон работы:

  1. В модель добавляется опциональное ограничение, привязанное к булевой переменной-индикатору.
  2. Перед запуском в модель добавляется предположение, фиксирующее истинность индикатора.
  3. Запускается поиск, проверяется результат.
  4. Предположения очищаются, при необходимости поиск выполняется заново с другим набором предположений или без них.
ВыборАВ_В = Модель.Переменные().ДобавитьБулеву("выбран_АВ_В");

// Опциональное ограничение, привязанное к индикатору
Модель.Ограничения().Соотношение("стоимость <= 100000", ВыборАВ_В);

// Активация индикатора через предположение
Модель.Предположения().Добавить(ВыборАВ_В);

Решение = Модель.Решить();

Если Решение.РешениеНайдено() Тогда
// Предположение подтвердилось: существует решение в стоимостном лимите
Иначе
// Решения нет; предположение очищается, выполняется поиск с другими условиями
Модель.Предположения().Очистить();
КонецЕсли;

Очистка установленных предположений выполняется методом Предположения().Очистить. Между запусками наборы предположений изменяются произвольно, что позволяет переключать модель между разными «срезами» условий без пересборки.

Когда что применять

ЗадачаПодходПричина
Большая модель, требуется ускорение поискаПодсказкиСтартовое решение сокращает время до первого допустимого решения.
Частый перерасчёт после небольших изменений данныхПодсказки на значениях прошлого решенияСокращает время инкрементального перерасчёта.
Серия запусков «что если» с разными активными условиямиПредположенияИзменяют активные условия без пересборки модели.
Жёсткая фиксация значения переменнойОграничение ЗначениеРавноПодсказки не гарантируют сохранение значения; ограничение гарантирует.
Условие, активируемое выбором решателяУсловные ограничения с булевой переменнойЭто часть формулировки задачи, а не сигнал поиску.

Стратегии перебора и нативные настройки решателя

Помимо подсказок и предположений модель поддерживает стратегии перебора переменных — порядок и способ, в котором решатель пробует значения для каждой переменной. Стратегии настраиваются в задачах с известной структурой, в которых правильный порядок поиска даёт ощутимое ускорение.

Расширенные параметры решателя — число потоков, лимит времени, признак подробного журналирования — задаются через настройки решателя при вызове Решить. Часть тонких параметров (выбор алгоритма пропагации, размер памяти под отсечения) задаётся через нативные настройки — точечный механизм для случаев, не покрытых типизированным API.

В большинстве прикладных задач значений по умолчанию достаточно. Тонкая настройка применяется, когда стандартный поиск не укладывается в бюджет времени и есть предметное понимание целей изменений.

Иллюстрация: серия запусков «что если»

Стандартный сценарий «что если» — одна модель и серия запусков с разными предположениями:

ВечерняяСменаРазрешена = Модель.Переменные().ДобавитьБулеву("вечер_ок");

// Опциональное ограничение: вечерняя смена назначается при истинности индикатора
Модель.Ограничения().Соотношение(
"число_назначений_вечерней_смены > 0",
ВечерняяСменаРазрешена
);

// Запуск 1: вечерние смены разрешены
Модель.Предположения().Добавить(ВечерняяСменаРазрешена);

Решение1 = Модель.Решить();
ОбщаяСтоимость1 = Решение1.ЗначениеЦелевойФункции();

// Запуск 2: вечерние смены запрещены
Модель.Предположения().Очистить();
Модель.Предположения().Добавить(Модель.Переменные().Отрицание(ВечерняяСменаРазрешена));

Решение2 = Модель.Решить();
ОбщаяСтоимость2 = Решение2.ЗначениеЦелевойФункции();

// Разница в стоимости — цена запрета вечерних смен

Этот же приём применяется в интерактивном анализе в форме 1С: пользователь устанавливает галочки активных условий, прикладной код формирует набор предположений и запускает пересчёт. Пример рабочего расписания, в котором уместна такая работа, — Составление графика работы сотрудников.

Полный перечень методов

Полный набор методов работы с подсказками, предположениями и стратегиями перебора приведён в разделе Программный интерфейс — Предположения и подсказки.