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

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

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

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

Подсказки​

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

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

  • Тёплый старт при перерасчёте. После небольших изменений входных данных стартовым решением выступает предыдущее найденное. Подсказки с прошлыми значениями сокращают время повторного поиска.
  • Использование исторических данных. Прошлогоднее расписание подаётся как подсказка для нового; решатель быстро адаптирует его под актуальные ограничения.
  • Зафиксированное частичное решение. Часть переменных задана пользователем (например, обязательные смены руководителя), решатель дополняет остальные.
П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С: пользователь устанавливает галочки активных условий, прикладной код формирует набор предположений и запускает пересчёт. Пример рабочего расписания, в котором уместна такая работа, — Составление графика работы сотрудников.

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

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