Ограничения
Ограничение — условие, которому должно удовлетворять найденное решение. Формулируется как соотношение между двумя линейными выражениями.
Набор всех ограничений модели задаёт допустимую область — множество комбинаций значений переменных, среди которых решатель ищет решение.
Допустимые операторы
В линейной модели допустимы только три оператора сравнения:
=— равенство;⩽(меньше или равно);⩾(больше или равно).
Строгие неравенства (<, >) и «не равно» (≠) не поддерживаются. Попытка их использовать приводит к выбросу исключения на этапе создания ограничения.
Это свойство класса задач линейной оптимизации в непрерывной форме. Множество допустимых решений должно быть замкнутым: на открытом интервале значения функции могут как угодно близко подходить к границе, но не достигают её, и понятие оптимума теряет смысл.
Если требуется выразить строгое неравенство, его заменяют нестрогим с малым зазором: вместо x < y пишется x ⩽ y - ε для подходящего малого ε. Если этого недостаточно или нужна операция «не равно», задача переносится на модель ограничений — она допускает все стандартные операторы сравнения и логические конструкции.
Ограничения как ресурсные балансы
Большинство практических ограничений в задачах планирования, логистики и распределения ресурсов формулируется как ресурсные балансы — равенства или неравенства между расходом ресурса и его лимитом:
- суммарное потребление сырья по продуктам
⩽доступный запас сырья — лимит мощности или склада; - суммарный выпуск по периодам
=плановый спрос — баланс спроса и предложения; - поток в узел сети
=поток из узла — баланс на промежуточном узле в транспортной задаче; - суммарная доля активов в портфеле
=1 — бюджетное ограничение в портфельной оптимизации.
// Лимит расхода сырья: суммарное потребление по всем продуктам не превышает запаса
СуммарноеПотребление = Модель.Выражения().СоздатьПостроительВыражений();
Для Каждого Продукт Из Продукты Цикл
СуммарноеПотребление.ДобавитьТерм(
ОбъёмПродукта[Продукт],
НормаРасходаНаЕдиницу[Продукт]
);
КонецЦикла;
Модель.Ограничения().ЗначениеМеньшеИлиРавно(
СуммарноеПотребление.ПолучитьВыражение(),
ЗапасСырья
);
Семантика «расход ⩽ лимит» и «расход = заказ» — основа транспортных задач, балансов материалов, ограничений мощности оборудования, бюджетных ограничений.
Условные ограничения и индикаторы
В чистом LP/IP/MIP нет встроенного механизма условных ограничений вида «ограничение действует, только если активна некоторая альтернатива».
Такие условия моделируются вручную: через булеву переменную-индикатор и константу big-M. Ограничение записывается с дополнительным слагаемым, которое «выключает» его при определённом значении индикатора. Подробное изложение приёма — в разделе Приёмы моделирования: индикаторные переменные и big-M.
Если таких условных ограничений много и они разнородны по структуре, число вспомогательных переменных и big-M-ограничений растёт быстро. В этом случае задачу целесообразно перенести на модель ограничений. Условные ограничения поддерживаются в ней на уровне готовых конструкций: любое ограничение можно сделать активным только при истинности набора булевых индикаторов.
Ограничения упорядочения
Когда массив выражений должен образовывать монотонную последовательность, применяются готовые ограничения неубывающей и невозрастающей последовательности. Они эквивалентны набору попарных ограничений Eᵢ ⩽ Eᵢ₊₁ (или Eᵢ ⩾ Eᵢ₊₁), но регистрируются одним вызовом и нагляднее отражают прикладное условие.
Типовые сценарии: упорядочение моментов времени в расписании событий, монотонность остатков на складе, прогрессивная шкала потребления.
// Накопленный объём выпуска должен расти от периода к периоду
НакопленноеПоПериодам = Новый Массив();
Для К = 0 По ПериодыПлана - 1 Цикл
НакопленноеПоПериодам.Добавить(НакопленныйОбъём[К]);
КонецЦикла;
Модель.Ограничения().НеубывающаяПоследовательность(НакопленноеПоПериодам);