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

Ограничения

Ограничение — условие, которому должно удовлетворять найденное решение. Формулируется как соотношение между двумя линейными выражениями.

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

Допустимые операторы

В линейной модели допустимы только три оператора сравнения:

  • = — равенство;
  • (меньше или равно);
  • (больше или равно).

Строгие неравенства (<, >) и «не равно» () не поддерживаются. Попытка их использовать приводит к выбросу исключения на этапе создания ограничения.

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

Если требуется выразить строгое неравенство, его заменяют нестрогим с малым зазором: вместо x < y пишется x ⩽ y - ε для подходящего малого ε. Если этого недостаточно или нужна операция «не равно», задача переносится на модель ограничений — она допускает все стандартные операторы сравнения и логические конструкции.

Ограничения как ресурсные балансы

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

  • суммарное потребление сырья по продуктам доступный запас сырья — лимит мощности или склада;
  • суммарный выпуск по периодам = плановый спрос — баланс спроса и предложения;
  • поток в узел сети = поток из узла — баланс на промежуточном узле в транспортной задаче;
  • суммарная доля активов в портфеле = 1 — бюджетное ограничение в портфельной оптимизации.
// Лимит расхода сырья: суммарное потребление по всем продуктам не превышает запаса
СуммарноеПотребление = Модель.Выражения().СоздатьПостроительВыражений();

Для Каждого Продукт Из Продукты Цикл
СуммарноеПотребление.ДобавитьТерм(
ОбъёмПродукта[Продукт],
НормаРасходаНаЕдиницу[Продукт]
);
КонецЦикла;

Модель.Ограничения().ЗначениеМеньшеИлиРавно(
СуммарноеПотребление.ПолучитьВыражение(),
ЗапасСырья
);

Семантика «расход ⩽ лимит» и «расход = заказ» — основа транспортных задач, балансов материалов, ограничений мощности оборудования, бюджетных ограничений.

Условные ограничения и индикаторы

В чистом LP/IP/MIP нет встроенного механизма условных ограничений вида «ограничение действует, только если активна некоторая альтернатива».

Такие условия моделируются вручную: через булеву переменную-индикатор и константу big-M. Ограничение записывается с дополнительным слагаемым, которое «выключает» его при определённом значении индикатора. Подробное изложение приёма — в разделе Приёмы моделирования: индикаторные переменные и big-M.

Если таких условных ограничений много и они разнородны по структуре, число вспомогательных переменных и big-M-ограничений растёт быстро. В этом случае задачу целесообразно перенести на модель ограничений. Условные ограничения поддерживаются в ней на уровне готовых конструкций: любое ограничение можно сделать активным только при истинности набора булевых индикаторов.

Ограничения упорядочения

Когда массив выражений должен образовывать монотонную последовательность, применяются готовые ограничения неубывающей и невозрастающей последовательности. Они эквивалентны набору попарных ограничений Eᵢ ⩽ Eᵢ₊₁ (или Eᵢ ⩾ Eᵢ₊₁), но регистрируются одним вызовом и нагляднее отражают прикладное условие.

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

// Накопленный объём выпуска должен расти от периода к периоду
НакопленноеПоПериодам = Новый Массив();
Для К = 0 По ПериодыПлана - 1 Цикл
НакопленноеПоПериодам.Добавить(НакопленныйОбъём[К]);
КонецЦикла;

Модель.Ограничения().НеубывающаяПоследовательность(НакопленноеПоПериодам);

См. также