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

Булева логика

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

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

Логические связки

Базовые связки булевой алгебры — конъюнкция, дизъюнкция и исключающее «или»:

  • БулевоИ — все указанные булевы выражения истинны. Применяется, когда несколько условий должны выполняться совместно. Часто аналогичный эффект достигается перечислением условий в параметре Условия обычного ограничения; явное БулевоИ нужно, когда сама истинность всей группы является булевой переменной, связываемой с другими элементами модели.
  • БулевоИли / НиМенееОдного — хотя бы одно из указанных булевых выражений истинно. Методы синонимичны. Применяется в сценариях типа «у заказа должен быть как минимум один разрешённый исполнитель», «должен быть включён хотя бы один резервный канал поставки».
  • БулевоИсключающееИли — XOR над набором выражений: операция возвращает истину при нечётном числе истинных значений. Применяется реже — для проверок чётности и сигнатурных условий.

Подсчёт истинных индикаторов

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

  • ТолькоОдин — ровно одно из указанных выражений истинно. Базовое ограничение «выбора одного варианта»: один поставщик из трёх, одна смена для работника, один режим работы оборудования.
  • НиБолееОдного — не более одного выражения истинно. Аналогично ТолькоОдин, но допускает вариант «ни одного». Применяется, когда вариант «ничего из перечисленного» допустим — например, дополнительная гарантия может не выбираться вовсе.
  • НиМенееОдного — хотя бы одно выражение истинно. Синоним БулевоИли; применение в одной группе с НиБолееОдного и ТолькоОдин упрощает чтение кода.

ТолькоОдин эквивалентен совмещению НиМенееОдного и НиБолееОдного и записывается в одной команде вместо двух.

Импликация

Ограничение Следствие задаёт причинно-следственную связь: «если Причина = Истина, то Следствие = Истина». Обратное не подразумевается: Следствие может быть истинным и при ложной причине.

РаботникНазначен = Модель.Переменные().ДобавитьБулеву("назначен");
ВремяВОкне = Модель.Переменные().ДобавитьБулеву("в_окне");

// Если работник назначен — время его смены попадает в окно доступности
Модель.Ограничения().Следствие(РаботникНазначен, ВремяВОкне);

Через цепочку импликаций описываются многоступенчатые условия: «при превышении лимита включается резерв; при истощении резерва — отказ обслуживания».

Иллюстрация: выбор одного варианта поставки

Заказ обслуживается ровно одним из трёх вариантов поставки. Каждый вариант характеризуется собственными условиями (срок и стоимость доставки). Структура с тремя индикаторами и ограничением ТолькоОдин:

ВариантА = Модель.Переменные().ДобавитьБулеву("вариант_А");
ВариантБ = Модель.Переменные().ДобавитьБулеву("вариант_Б");
ВариантВ = Модель.Переменные().ДобавитьБулеву("вариант_В");

Модель.Ограничения().ТолькоОдин(
О2.Утилиты().Массив(ВариантА, ВариантБ, ВариантВ)
);

СрокПоставки = Модель.Переменные().ДобавитьИзДиапазона(0, 30, "срок_дней");

// Срок поставки определяется выбранным вариантом
Модель.Ограничения().ЗначениеРавно(СрокПоставки, 3, ВариантА);
Модель.Ограничения().ЗначениеРавно(СрокПоставки, 7, ВариантБ);
Модель.Ограничения().ЗначениеРавно(СрокПоставки, 14, ВариантВ);

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

Развёрнутый пример работы с булевыми индикаторами и условными ограничениями приведён на странице Назначение исполнителей с балансировкой нагрузки.

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

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