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

Ограничения на значения

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

Равенства и неравенства

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

  • Соотношение — компактная запись: одна строка, в которой через символ ; перечисляются несколько соотношений. Поддерживает операторы =, <>, >, >=, <, <=. Применяется, когда соотношения формулируются в коде вручную и их немного.
  • СоотношениеЗначений — типизированная форма: два выражения и тип сравнения из перечисления. Применяется, когда тип сравнения параметризован (например, выбирается в форме настройки) или когда выражения уже представлены объектами.
  • обёртки ЗначениеРавно, ЗначениеНеРавно, ЗначениеБольше, ЗначениеБольшеИлиРавно, ЗначениеМеньше, ЗначениеМеньшеИлиРавно — короткая форма для конкретного типа сравнения. Имя метода непосредственно отражает условие, что повышает читаемость в большинстве моделей.
// Один вызов с несколькими соотношениями
Модель.Ограничения().Соотношение("0 <= x + y < 5*y; x > 0");

// Эквивалентная запись через обёртки
Модель.Ограничения().ЗначениеБольшеИлиРавно("x + y", 0);
Модель.Ограничения().ЗначениеМеньше("x + y", "5*y");
Модель.Ограничения().ЗначениеБольше(Пx, 0);

Все методы перечисленных групп строят арифметические соотношения. Выбор формы определяется удобством записи в конкретной части кода.

Глобальные ограничения

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

  • ВсеРазличные — все выражения массива принимают попарно различные значения. Применяется в задачах назначения, расписаниях помещений, головоломках (Sudoku, N ферзей).
  • МинимумРавен / МаксимумРавен — связь экстремума массива с другим выражением. Применяется для введения производного показателя: длительность всего проекта равна максимуму окончаний работ; минимальная нагрузка по сотрудникам — нижняя граница нагрузки; верхняя граница длины очереди — максимум по периодам.
  • ПроизведениеРавно — произведение значений массива равно значению другого выражения. Применяется для выражения нелинейной связи через целочисленное умножение.
  • ЭлементРавен — индексирование массива переменной: Выражения[Индекс] = Значение, где Индекс сам является переменной. Применяется в задачах выбора: переменная-индекс отражает выбор одного значения из списка.
  • Инверсия — биекция между двумя массивами переменных: «если Прямой[А] = Б, то Обратный[Б] = А». Применяется при поддержке согласованности двух представлений одного и того же отношения — например, «работник назначен на задачу» и «задача выполняется работником».

Принадлежность домену

Ограничение ЗначениеВДомене проверяет, что значение выражения принадлежит заданному домену — произвольному множеству целых чисел.

Применяется, когда множество допустимых значений выражения не сводится к диапазону или равенству. Типовые сценарии — выбор стандартного типоразмера из прайс-листа, попадание в один из заранее утверждённых диапазонов работы.

Целочисленные операции

Несколько ограничений выражают целочисленные операции, не поддерживаемые в строковой нотации линейных выражений (деление, модуль). Каждое ограничение связывает два или три выражения:

  • АбсолютноеЗначениеРавно|x| = y. Применяется при формулировке штрафов за отклонение значения от целевого без учёта знака.
  • ОтношениеЗначенийРавно — целочисленное деление: x ÷ y = z. Применяется в задачах распределения по корзинам одинакового размера.
  • ОстатокДеленияРавен — остаток от деления: x mod y = z. Применяется для построения циклических признаков (день недели по номеру дня, чётность, период).

Последовательности

Семейство ограничений требует, чтобы значения массива выражений были упорядочены:

Применение — упорядочивание этапов проекта во времени, требование монотонности накоплений (запас не растёт во время цикла «расходование — пополнение»), формирование сортированного представления решения.

Разрешённые и запрещённые комбинации

Если множество допустимых сочетаний значений описывается таблицей, применяются табличные ограничения:

Прикладные сценарии — совместимость комплектующих (для каждой пары известно, могут ли они стоять рядом), матрица доступа (роль × ресурс → разрешено или запрещено), допустимые комбинации натуральных параметров заказа (бренд + модель + цвет → допустимая позиция в каталоге).

Иллюстрация: упорядочивание этапов проекта

Проект состоит из трёх этапов; каждый этап начинается на определённом дне и не может начаться раньше предыдущего. Условие порядка этапов записывается одним вызовом:

ЭтапПроектирование = Модель.Переменные().ДобавитьИзДиапазона(0, 30, "этап_1");
ЭтапРазработка = Модель.Переменные().ДобавитьИзДиапазона(0, 30, "этап_2");
ЭтапВнедрение = Модель.Переменные().ДобавитьИзДиапазона(0, 30, "этап_3");

Модель.Ограничения().НеубывающаяПоследовательность(
О2.Утилиты().Массив(ЭтапПроектирование, ЭтапРазработка, ЭтапВнедрение)
);

Глобальное ограничение ВсеРазличные — основа решений в N ферзей и Судоку.

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

Полный набор методов работы с ограничениями на значения и последовательностями приведён в разделах Программный интерфейс — Ограничения на значения и Программный интерфейс — Последовательности.