AnyLogic
Развернуть
Размер шрифта

Seize

Захватывает для агента заданное количество ресурсов из указанного блока ResourcePool). Существует несколько способов указать ресурсы, которые следует захватить. Более подробную информацию о том, как это сделать, вы можете найти в статье про использование ресурсов.

При захвате ресурса агент мгновенно покидает этот блок. Освободить ресурс можно с помощью блока Release. Все захваченные ресурсы должны быть освобождены до того, как агент будет уничтожен с помощью блока Sink.

Блок содержит очередь Queue, в которой агенты ожидают, пока запрашиваемые ресурсы не станут доступными. Вначале ресурсы запрашиваются для первого агента из очереди, и пока этот агент не захватит ресурсы (или не покинет блок по какой-либо другой причине), ресурсы для последующих агентов не выделяются (даже если они и могли бы быть выделены). Обратите внимание, что если агентам нужно захватить несколько невзаимосвязанных ресурсов, то, возможно, лучше использовать несколько блоков Seize.

При необходимости поведение встроенной очереди Queue может быть настроено на вашу конкретную задачу с помощью таймаутов, вытеснения, приоритетов и т.д.

Если агент планирует захватить ресурс на какое-то определенное время, а затем освободить его, то попробуйте использовать для этой задачи блок Service, аналогичный последовательности блоков [Seize, Delay, Release].

Параметры

Функции

Функция Описание
int size() Возвращает количество агентов, находящихся в данный момент в очереди Queue.
T get( int index ) Возвращает агента, находящегося в очереди в позиции с номером index (ближайшая к выходу из очереди позиция имеет номер 0).
T remove(Agent agent) Извлекает агента agent из очереди и возвращает его. Если такого агента в очереди обнаружено не будет, функция вернет null.
T resume(Agent agent) Возобновляет ранее приостановленный блок Delay (если он не был приостановлен, выдает ошибку).
T suspend(Agent agent) Приостанавливает задержку на заданный таймаут dt.
void recalculateResourceChoiceConditions(Agent agent) Заново проверяет условия выбора ресурсов для заданного агента, который сейчас находится в очереди этого блока. Эту функцию можно использовать, когда некоторые ресурсы, ранее недоступные для захвата конкретным агентом, возможно, стали доступными, поскольку условия изменились.
Эта функция также заново проверяет условия для зарезервированных ресурсов (если выбрано правило захвата Захватить весь набор сразу), но не проверяет уже захваченные ресурсы (если выбрано правило захвата Захватывать ресурсы один за другим).
void recalculateResourceChoiceConditions() Заново проверяет условия выбора ресурсов для всех агентов, которые сейчас находится в очереди этого блока. Эту функцию можно использовать, когда некоторые ресурсы, ранее недоступные для захвата, возможно, стали доступными, поскольку условия изменились.
Эта функция также заново проверяет условия для зарезервированных ресурсов (если выбрано правило захвата Захватить весь набор сразу), но не проверяет уже захваченные ресурсы (если выбрано правило захвата Захватывать ресурсы один за другим).
void recalculateAgentPriority(agent) Заново рассчитывает приоритет задачи для указанного агента, который в данный момент находится в очереди этого блока Seize. Вызов этой функции может повлечь за собой вытеснение ресурсов.
Если в этом блоке Seize выбрано Правило захвата: Захватывать ресурсы один за другим и агент уже успел захватить один или несколько ресурсов, могут игнорироваться некоторые наборы ресурсов, необходимые для начала выполнения задачи. Речь идет о наборах ресурсов, которые невозможно захватить целиком (укомплектовать), поскольку некоторые ресурсы из них в данный момент захвачены. Перерасчет приоритета не обновит проигнорированные наборы ресурсов, т.е. агент сможет захватывать только те ресурсы, которые необходимы для комплектации не игнорируемых наборов.
Если у блока Seize очередь с ограниченной вместимостью, перерасчет не повлияет на агентов, которые ждут входа в блок Seize.
void recalculatePriorities() Заново рассчитывает приоритет задач для всех агентов, которые в данный момент находятся в очереди этого блока Seize. Вызов этой функции может повлечь за собой вытеснение ресурсов.
Если в этом блоке Seize выбрано Правило захвата: Захватывать ресурсы один за другим и агент уже успел захватить один или несколько ресурсов, могут игнорироваться некоторые наборы ресурсов, необходимые для начала выполнения задачи. Речь идет о наборах ресурсов, которые невозможно захватить целиком (укомплектовать), поскольку некоторые ресурсы из них в данный момент захвачены. Перерасчет приоритета не обновит проигнорированные наборы ресурсов, т.е. агент сможет захватывать только те ресурсы, которые необходимы для комплектации не игнорируемых наборов.
Приоритеты рассчитываются заново только для агентов, которые в данный момент находятся в очереди этого блока Seize. Если у блока Seize очередь с ограниченной вместимостью, перерасчет не повлияет на агентов, которые ждут входа в этот блок.

Порты

in
Входной порт.
outTimeout
Выходной порт для агентов, покидающих блок по таймауту (вследствие истечения заданного времени ожидания).
outPreempted
Выходной порт для агентов, покидающих блок в результате вытеснения.
out
Выходной порт.
preparedUnits
Выходной порт для готовых ресурсов, которые закончили выполнять свои задачи. Сюда вы можете присоединить последний блок диаграммы подготовки ресурсов. Эта диаграмма процесса должна начинаться с блока ResourceTaskStart.
Как мы можем улучшить эту статью?