Булева логика
Семейство булевых ограничений работает над булевыми переменными и булевыми выражениями (см. Переменные). По смыслу эти ограничения формируют логический каркас модели, связывая индикаторы выбора, флаги существования и переключатели сценариев.
В прикладных моделях булевы ограничения применяются совместно с условными ограничениями других семейств: булевы переменные определяют, какая «ветвь» условий действует, а булевы ограничения связывают эти переменные между собой по правилам бизнес-логики.
Логические связки
Базовые связки булевой алгебры — конъюнкция, дизъюнкция и исключающее «или»:
БулевоИ— все указанные булевы выражения истинны. Применяется, когда несколько условий должны выполняться совместно. Часто аналогичный эффект достигается перечислением условий в параметреУсловияобычного ограничения; явноеБулевоИнужно, когда сама истинность всей группы является булевой переменной, связываемой с другими элементами модели.БулевоИли/НиМенееОдного— хотя бы одно из указанных булевых выражений истинно. Методы синонимичны. Применяется в сценариях типа «у заказа должен быть как минимум один разрешённый исполнитель», «должен быть включён хотя бы один резервный канал поставки».БулевоИсключающееИли— XOR над набором выражений: операция возвращает истину при нечётном числе истинных значений. Применяется реже — для проверок чётности и сигнатурных условий.
Подсчёт истинных индикаторов
Когда требуется ограничить количество активных индикаторов в группе, применяются три специализированных ограничения:
ТолькоОдин— ровно одно из указанных выражений истинно. Базовое ограничение «выбора одного варианта»: один поставщик из трёх, одна смена для работника, один режим работы оборудования.НиБолееОдного— не более одного выражения истинно. АналогичноТолькоОдин, но допускает вариант «ни одного». Применяется, когда вариант «ничего из перечисленного» допустим — например, дополнительная гарантия может не выбираться вовсе.НиМенееОдного— хотя бы одно выражение истинно. СинонимБулевоИли; применение в одной группе сНиБолееОдногоиТолькоОдинупрощает чтение кода.
ТолькоОдин эквивалентен совмещению НиМенееОдного и НиБолееОдного и записывается в одной команде вместо двух.
Импликация
Ограничение Следствие задаёт причинно-следственную связь: «если Причина = Истина, то Следствие = Истина». Обратное не подразумевается: Следствие может быть истинным и при ложной причине.
РаботникНазначен = Модель.Переменные().ДобавитьБулеву("назначен");
ВремяВОкне = Модель.Переменные().ДобавитьБулеву("в_окне");
// Если работник назначен — время его смены попадает в окно доступности
Модель.Ограничения().Следствие(РаботникНазначен, ВремяВОкне);
Через цепочку импликаций описываются многоступенчатые условия: «при превышении лимита включается резерв; при истощении резерва — отказ обслуживания».
Иллюстрация: выбор одного варианта поставки
Заказ обслуживается ровно одним из трёх вариантов поставки. Каждый вариант характеризуется собственными условиями (срок и стоимость доставки). Структура с тремя индикаторами и ограничением ТолькоОдин:
ВариантА = Модель.Переменные().ДобавитьБулеву("вариант_А");
ВариантБ = Модель.Переменные().ДобавитьБулеву("вариант_Б");
ВариантВ = Модель.Переменные().ДобавитьБулеву("вариант_В");
Модель.Ограничения().ТолькоОдин(
О2.Утилиты().Массив(ВариантА, ВариантБ, ВариантВ)
);
СрокПоставки = Модель.Переменные().ДобавитьИзДиапазона(0, 30, "срок_дней");
// Срок поставки определяется выбранным вариантом
Модель.Ограничения().ЗначениеРавно(СрокПоставки, 3, ВариантА);
Модель.Ограничения().ЗначениеРавно(СрокПоставки, 7, ВариантБ);
Модель.Ограничения().ЗначениеРавно(СрокПоставки, 14, ВариантВ);
Три условных ограничения связывают индикаторы вариантов с одним и тем же выражением СрокПоставки. Активным окажется одно из них (за счёт ТолькоОдин), и СрокПоставки примет соответствующее значение. Подобная схема применяется к любому числу параметров заказа — стоимость, гарантия, поставщик — в сочетании с целевой функцией, минимизирующей итоговую стоимость или срок.
Развёрнутый пример работы с булевыми индикаторами и условными ограничениями приведён на странице Назначение исполнителей с балансировкой нагрузки.
Полный перечень методов
Полный набор методов булевой логики приведён в разделе Программный интерфейс — Булевы ограничения.