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

Домены

Домен — множество допустимых целых значений. В модели применяется в двух местах:

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

В отличие от диапазона [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);

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

Полный набор методов менеджера доменов приведён в разделе Программный интерфейс — Домены.