Домены
Домен — множество допустимых целых значений. В модели применяется в двух местах:
- при регистрации переменной из домена — определяет множество значений, которые переменная способна принять;
- в ограничении
ЗначениеВДомене— определяет допустимые значения линейного выражения.
В отличие от диапазона [a, b], описывающего сплошной интервал, домен может содержать произвольные целые значения, объединение нескольких диапазонов, пересечение, отражение. Это даёт возможность точно описать множество допустимых значений в задачах, где оно нерегулярное.
Назначение доменов
Когда переменная или выражение связаны доменом, решатель не пробует значения вне домена. Это сокращает время поиска и упрощает формулировку: часть бизнес-логики переносится из ограничений в определение переменной.
Типовые сценарии применения:
- допустимые объёмы фасовки готовой продукции, заданные прайс-листом (
{200, 500, 1000}); - разрешённые часы работы с обеденным перерывом (
[9, 13] ∪ [14, 18]); - общая зона доступа двух сотрудников с пересекающимися графиками (
[10, 16] ∩ [12, 18]); - разрешённые типоразмеры тары, кодов товара, номиналов скидки.
Базовые конструкции
Менеджер доменов поддерживает несколько способов задания домена:
- Диапазон — сплошной интервал
[a, b]. Применяется в большинстве задач. - СписокДиапазонов — несколько отдельных диапазонов в одном домене (рабочие интервалы дня с перерывом).
- СписокЗначений — перечислимый набор конкретных значений без интервалов (фасовки
{200, 500, 1000}). - ОдноЗначение — домен из одного значения. Применяется как ограничение на конкретное значение переменной на этапе определения.
- Пустой / ВсеЗначения — крайние случаи: домен без значений (заведомо невозможное состояние) и домен из всех значений
Int64(отсутствие ограничений на множество).
Операции над доменами
Помимо базовых конструкций менеджер поддерживает операции построения новых доменов из существующих. Это позволяет описать сложное множество композицией простых:
- Объединение (
D = D1 ∪ D2) — все значения, входящие хотя бы в один из исходных доменов. Применяется при разбиении множества на несвязные интервалы. - Пересечение (
D = D1 ∩ D2) — значения, присутствующие во всех исходных доменах. Применяется при сужении: получение общей рабочей зоны нескольких сотрудников с разными графиками. - Сложение — каждое значение нового домена является суммой значения из первого домена и значения из второго. Применяется для арифметических преобразований множеств и для сдвига.
- Дополнение — все значения
Int64, не входящие в исходный домен. Применяется в задачах, в которых проще описать запрещённое множество, чем разрешённое. - Отрицание — зеркальное отражение домена относительно нуля. Например, для
[10, 15]даёт[-15, -10].
Из этих операций собираются множества произвольной структуры. Если получившееся множество не описывается операциями над диапазонами и списками (например, «только чётные значения от 50 до 100»), оставшаяся часть условия выражается ограничением модели — см. ниже.
Иллюстрация: переменная-объём упаковки
Объём упаковки готовой продукции выбирается из стандартных фасовок прайс-листа {200, 500, 1000} мл и нестандартного диапазона [2000, 3000] мл, доступного под заказ. Множество допустимых значений собирается объединением:
СтандартныеФасовки = Модель.Домены().СписокЗначений(
О2.Утилиты().Массив(200, 500, 1000)
);
ПодЗаказ = Модель.Домены().Диапазон(2000, 3000);
ВсеФасовки = Модель.Домены().Объединение(
О2.Утилиты().Массив(СтандартныеФасовки, ПодЗаказ)
);
ОбъёмУпаковки = Модель.Переменные().ДобавитьИзДомена(ВсеФасовки, "объём");
Если допустимое множество дополнительно сужается арифметическим условием, оно выражается отдельным ограничением. Пример: переменная-объём в диапазоне [50, 100] с дополнительным условием чётности значения:
Домен = Модель.Домены().Диапазон(50, 100);
Переменная = Модель.Переменные().ДобавитьИзДомена(Домен);
// Чётные значения: остаток от деления на 2 равен 0
Модель.Ограничения().ОстатокДеленияРавен(Переменная, 2, 0);
Полный перечень методов
Полный набор методов менеджера доменов приведён в разделе Программный интерфейс — Домены.