О2_Routing_МенеджерОграничений.КонкурентноеИспользование
Ограничивает суммарную нагрузку активных интервалов на общий ресурс: в каждый момент времени сумма потребностей одновременно активных интервалов не должна превышать ёмкость. Основной способ вызова: О2.Модели().МодельМаршрутизации().СоздатьМодель().Ограничения().КонкурентноеИспользование(Емкость, Потребности).
Синтаксис
О2.Модели().МодельМаршрутизации().СоздатьМодель().Ограничения().КонкурентноеИспользование(
Емкость,
Потребности,
Условия
)
Параметры
- Емкость — Число — максимально допустимая суммарная нагрузка в любой момент времени. Целое неотрицательное число.
- Потребности — Массив — массив объектов
ПотребностьИнтервала. Каждый объект описывает один интервал и величину его нагрузки на ресурс. - Условия — ФиксированнаяСтруктура, Массив, Неопределено — условия активации всего ограничения. Если не указаны, ограничение применяется всегда.
Возвращаемое значение
- Менеджер ограничений (
О2_Routing_МенеджерОграничений) — текущий объект. Позволяет строить цепочки вызовов (fluent-интерфейс).
Описание
Метод О2.Модели().МодельМаршрутизации().СоздатьМодель().Ограничения().КонкурентноеИспользование(...) задаёт ограничение на совместное использование разделяемого ресурса несколькими интервалами. Ограничение выполняется, если для каждого момента времени t:
Σ Потребность(i) для всех активных i в момент t ≤ Емкость
Активность опциональных интервалов (созданных с параметром Условие) определяется их переменной-условием — если условие ложно, интервал не учитывается при подсчёте нагрузки.
Типичные сценарии применения:
- Ограничение числа одновременно работающих бригад / единиц оборудования.
- Ограничение пропускной способности склада (зон погрузки).
- Управление параллельными потоками заданий с ограниченным числом исполнителей.
Для каждого интервала объект потребности формируется методом ПотребностьИнтервала.
Пример
Модель = О2
.Модели()
.МодельМаршрутизации()
.СоздатьМодель();
Интервалы = Модель.Интервалы();
Ограничения = Модель.Ограничения();
// Три операции с разными потребностями по ресурсу (например, бригада из N чел.)
РаботаА = Интервалы.ДобавитьФиксированный(60, 0, 480);
РаботаБ = Интервалы.ДобавитьФиксированный(90, 0, 480);
РаботаВ = Интервалы.ДобавитьФиксированный(30, 0, 480);
// Суммарно не более 4 человек одновременно
Ограничения.КонкурентноеИспользование(
4,
О2.Утилиты().Массив(
Ограничения.ПотребностьИнтервала(РаботаА, 2), // требует 2 чел.
Ограничения.ПотребностьИнтервала(РаботаБ, 3), // требует 3 чел.
Ограничения.ПотребностьИнтервала(РаботаВ, 1) // требует 1 чел.
)
);