ResourcePool

Задает набор ресурсов, которые могут захватываться и освобождаться заявками с помощью объектов Seize, Release и Service. Есть два способа моделирования ресурсов: они могут быть заданы в модели как индивидуальные объекты, а могут просто как их количество. Если ресурсы заданы в модели как индивидуальные объекты , то каждый такой ресурс может иметь отличные от других ресурсов свойства, отображаться на презентации, хранить статистику своего использования и т.д. Базовым классом для таких ресурсов является ResourceUnit, Вы можете создать свои собственные подклассы этого класса. Но если таких ресурсов будет достаточно много, и на моделирование каждого отдельного ресурса будет тратиться определенное время и память, и если все такие ресурсы будут идентичными, то имеет смысл не моделировать каждый такой ресурс отдельно, а рассматривать их в целом, то есть, захватывать и освобождать просто определенное количество такого агрегированного ресурса. Примером ресурсов такого типа могут быть деньги, компьютерная память, складская площадь и т.д.

Единственный порт объекта может быть соединен с портами access объектов Seize, Service и Release, работающих с этим типом ресурсов, или же может быть оставлен несоединенным, если в параметрах других объектах будет ссылка на имя этого объекта ResourcePool. Этот порт может соединяться с несколькими объектами, работающими с данными ресурсами.

Если запросы от объектов Seize и Service не могут быть удовлетворены в текущий момент времени, эти запросы помещаются в очередь объекта ResourcePool. Эта очередь может быть либо обычной очередью FIFO, либо учитывать приоритеты запросов.

При выборе ресурса (если ресурсы моделируются как индивидуальные объекты) по запросу заявки объект NetworkResourcePool выбирает тот свободный ресурс, который оставался свободным на протяжении наибольшего времени. Такой подход со временем приведет к равномерному использованию всех ресурсов.

Количество ресурсов может быть задано либо явно числом, либо с помощью табличной функции, задающей, как количество ресурсов будет изменяться во времени. Если вместимость объекта NetworkResourcePool будет динамически изменяться с помощью метода set_capacity(), и количество захваченных в текущий момент времени ресурсов будет превосходить новое значение вместимости, то лишние ресурсы будут удалены только после того, как они будут освобождены.

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

Пожалуйста, обратите внимание, что заявка запрашивает ресурс или ссылается на него, используя имя соответствующего объекта ResourcePool, и при этом Вы не можете выбрать какой-то определенный ресурс из числа ресурсов этого типа. Поэтому если Вам нужно ссылаться на какой-то определенный подтип ресурса, Вам будет нужно задать этот подтип с помощью еще одного объекта ResourcePool.

Задание расписания работы ресурсов

Вы можете задать расписание работы ресурсов с помощью специального элемента расписание.

Приведенная ниже демонстрационная модель показывает разницу между двумя различными режимами использования расписания в объекте (опции Расписанием и Расписанием доступности параметра Количество задано). 

Демо модель: Defining a Work Schedule for Resources

Параметры класса

Класс ресурса
[Имеет смысл, если Ресурсы моделируются Как индивидуальные объекты]
Класс ресурсов, задаваемых этим объектом, должен быть подклассом ResourceUnit. Указав класс ресурса, Вы можете напрямую обращаться к полям этого класса в коде динамических параметров, таких, как onNewUnit.
Синтаксис T extends ResourceUnit
Значение по умолчанию ResourceUnit

Переменные

StatisticsContinuous statsUtilization
Статистика использования ресурса. Собирается только в том случае, если выбрана опция объекта Включить сбор статистики.

Порты

ResourcePoolPort port
Порт, который должен быть соединен с портами access объектов Seize, Service и Release, работающих с этим типом ресурсов.

Параметры

Ресурсы моделируются
Определяет, как моделируются ресурсы: Как индивидуальные объекты или Просто как их количество.
Синтаксис boolean unitsAreObjects
Значение по умолчанию Как индивидуальные объекты (true)
Количество задано
Определяет, как задано количество ресурсов:
Напрямую - явно заданным численным значением;
Расписанием - расписанием, в котором будет задано, как количество ресурсов будет меняться с течением времени (тип значения расписания - целое);
Расписанием доступности - расписанием, задающем то, как меняется статус доступности ресурсов с течением времени (тип значения расписания - да/нет).
Табличной функцией (устар.) -  табличной функцией, задающей, как количество ресурсов будет изменяться во времени. Начиная с версии 6.5.1 мы рекомендуем использовать более совершенный способ задания - Расписание.
Синтаксис int capacityDefinitionType
Значение по умолчанию Напрямую
Количество ресурсов
[Виден, если Количество задано Напрямую или Расписанием доступности] Количество ресурсов (в случае, когда Количество задано Расписанием доступности - количество ресурсов в те интервалы времени, которым соответствует значение расписания - да).
Синтаксис int capacity
Значение по умолчанию 1
Расписание
[Виден, если Количество задано Расписанием] Расписание, задающее, как количество ресурсов будет изменяться с течением времени (тип значения расписания - целое). 
Синтаксис Schedule capacitySchedule
Расписание доступности
[Виден, если Количество задано Расписанием доступности] Расписание, задающее то, как меняется статус доступности ресурсов с течением времени (тип значения расписания - да/нет).
В те интервалы времени, которым будет соответствовать значение расписания нет, все ресурсы будут недоступны.
В те интервалы времени, которым будет соответствовать значение расписания да, количество доступных ресурсов будет равно значению, заданному в поле Количество ресурсов.
Синтаксис Schedule capacityScheduleOnOff
Табличная функция
[Виден, если Количество задано Табличной функцией (устар.)] Табличная функция, определяющая, как количество ресрусов будет изменяться с течением времени. 
Начиная с версии 6.5.1 мы рекомендуем использовать более совершенный способ задания - Расписание.
Синтаксис TableFunction capacityTable
Новый ресурс [динамический]
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Выражение, определяющее, какой ресурс будет создаваться (обычно просто вызов конструктора класса создаваемого ресурса).
Синтаксис ResourceUnit newUnit
Значение по умолчанию new ResourceUnit()
Действие при создании нового ресурса [динамический]
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Код, выполняемый при создании нового ресурса (может использоваться для дополнительной инициализации).
Синтаксис void onNewUnit
Локальная переменная T unit - только что созданный ресурс.
Действие при захвате [динамический]
Код, выполняемый при захвате ресурса.
Синтаксис void onSeize
Локальная переменная: T unit - ресурс, null, если ресурсы моделируются просто как количество.
                          Entity entity - заявка, захватившая этот ресурс.
Действие при освобождении [динамический]
Код, выполняемый при освобождении ресурса.
Синтаксис void onRelease
Локальная переменная: T unit - ресурс, null, если ресурсы моделируются просто как количество.
                          Entity entity - заявка, освобождающая ресурс.
Использовать приоритеты [динамический]
Если опция выбрана (true), то запросы на ресурсы будут удовлетворяться согласно приоритетам этих запросов, задаваемых в параметре Приоритет запроса
Синтаксис boolean enablePriorities
Локальная переменная Entity entity - текущая заявка, запрашивающая ресурс.
Значение по умолчанию false
Приоритет запроса [динамический]
[Виден, если выбрана опция Использовать приоритеты] Выражение, вычисляющее приоритет запроса. Чем больше значение Вы зададите, тем больше будет приоритет.
Синтаксис double priority
Значение по умолчанию 0
Локальная переменная Entity entity - текущая заявка, запрашивающая ресурс.
Фигура анимации свободного ресурса [динамический]
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Фигура, которой на презентации будет отображаться свободный ресурс. Фигура доступна с помощью метода unit.getShape() и может быть изменена в любой момент времени с помощью метода unit.setShape(). Поскольку этот параметр динамический, то Вы можете присвоить разным ресурсам разные фигуры (и даже уникальную фигуру для каждого ресурса, написав здесь, например, new ShapeOval()).
Синтаксис Shape idleUnitShape
Локальная переменная: T unit - ресурс.
Фигура анимации занятого ресурса [динамический]
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Фигура, которой на презентации будет отображаться занятый (захваченный заявкой) ресурс. Фигура доступна с помощью метода unit.getShape() и может быть изменена в любой момент времени с помощью метода unit.setShape(). Поскольку этот параметр динамический, то Вы можете присвоить разным ресурсам разные фигуры (и даже уникальную фигуру для каждого ресурса, написав здесь, например, new ShapeOval()).
Синтаксис Shape busyUnitShape
Локальная переменная: T unit - ресурс.
Уникальная фигура для каждого ресурса
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Если опция выбрана (true), то объект создаст копию заданной фигуры ресурса и присвоит ее создаваемому ресурсу. В этом случае свойства фигуры (и ее содержимое, если это группа фигур) могут быть изменены отдельно для каждого ресурса. Если же опция не выбрана, то все ресурсы будут отображаться с помощью одной и той же фигуры, и любое изменение ее свойств приведет к изменению анимаций всех таких ресурсов. 
Синтаксис boolean uniqueShape
Значение по умолчанию false
Разрешить вращение
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Если опция выбрана (true), то при движении ресурсов их фигуры анимации будут всегда поворачиваться согласно текущему направлению движения ресурса. 
Синтаксис boolean enableRotation
Значение по умолчанию false
Разрешить вращение по вертикали
Если опция выбрана (true), то при движении ресурсов их фигуры анимации будут поворачиваться согласно текущему направлению движения ресурса как по горизонтали, так и по вертикали.
Синтаксис: boolean enableVerticalRotation
Значение по умолчанию: true
Фигура анимации
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Фигура анимации объекта ResourcePool. Тип фигуры зависит от выбранного Типа анимации.
Синтаксис Shape animationGuide
Тип анимации
[Виден, если Ресурсы моделируются Как индивидуальные объекты] Тип анимации объекта ResourcePool. Допустимые значения: Мешок, Упорядоченная, Набор, Одиночная.
Синтаксис int animationType
Значение по умолчанию Мешок
Допустимые значения Animator.BAG, Animator.ARRANGED, Animator.SET, Animator.SINGLE
Включить сбор статистики
Если опция выбрана (true), то для объекта будет собираться статистика.
Синтаксис boolean enableStats
Значение по умолчанию false

Функции

int idle()- возвращает количество свободных ресурсов.

int busy() - возвращает количество занятых ресурсов.

int getUnit( int index ) - возвращает ресурс с номером index. Метод не должен вызываться, если ресурсы моделируются просто как их количество.

void resetStats() - удаляет собранную статистику использования ресурса.