Ограничения на значения
Семейство объединяет арифметические и реляционные условия над линейными выражениями, а также глобальные ограничения — ограничения, описывающие свойство сразу множества выражений (попарная различность, экстремум, индексирование массива). Семейство покрывает большинство числовых условий прикладной задачи.
Равенства и неравенства
Соотношения между выражениями — наиболее распространённый тип ограничений. Один и тот же набор условий записывается несколькими способами:
Соотношение— компактная запись: одна строка, в которой через символ;перечисляются несколько соотношений. Поддерживает операторы=,<>,>,>=,<,<=. Применяется, когда соотношения формулируются в коде вручную и их немного.СоотношениеЗначений— типизированная форма: два выражения и тип сравнения из перечисления. Применяется, когда тип сравнения параметризован (например, выбирается в форме настройки) или когда выражения уже представлены объектами.- обёртки
ЗначениеРавно,ЗначениеНеРавно,ЗначениеБольше,ЗначениеБольшеИлиРавно,ЗначениеМеньше,ЗначениеМеньшеИлиРавно— короткая форма для конкретного типа сравнения. Имя метода непосредственно отражает условие, что повышает читаемость в большинстве моделей.
// Один вызов с несколькими соотношениями
Модель.Ограничения().Соотношение("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 ферзей и Судоку.
Полный перечень методов
Полный набор методов работы с ограничениями на значения и последовательностями приведён в разделах Программный интерфейс — Ограничения на значения и Программный интерфейс — Последовательности.