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

Service

Захватывает для агента заданное количество ресурсов, задерживает их, а затем освобождает захваченные им ресурсы. Эквивалентен последовательности блоков Seize, Delay, Release (и сам реализован именно таким способом) и должен использоваться в тех случаях, когда все, что требуется — это задержать захваченные ресурсы на заданное время, а затем их отпустить. Большинство параметров этих вложенных блоков вынесены в интерфейс блока Service.

Один набор ресурсов может выполнять задачи с разными приоритетами, заданные в нескольких блоках.

  • Если задачи имеют одинаковый приоритет, они будут выполняться последовательно в соответствии с настройками времени выполнения каждой из них. Если освободившихся единиц ресурса хватает, то такие задачи могут выполняться одновременно. Если у двух задач одинаковый приоритет, но одна из них по какой-то причине была ранее приостановлена, то выбирается приостановленная задача.1
  • Если для задач не задан механизм вытеснения, они будут выполняться последовательно в соответствии с настройками времени выполнения каждой из них. Если освободившихся единиц ресурса хватает, то такие задачи могут выполняться одновременно.
  • Начало выполнения задачи, заданной в одном блоке, не сбрасывает приоритеты задач, заданных в других блоках.
1 Каждый ресурс получает запросы из разных источников. Когда у ресурса есть несколько задач с одинаковым приоритетом (новых или ранее приостановленных), при выборе задачи к исполнению учитываются следующие правила:
  • Самый высокий приоритет — у приостановленных задач из «индивидуальной» очереди единицы ресурса.
    Такие очереди формируются агентами, находящимися в блоках, для которых значение свойства Правило вытеснения задач установлено на Ожидать оригинал ресурса.
  • После этого обрабатываются прерванные задачи из очереди блока ResourcePool.
    Эта очередь формируется агентами, находящимися в блоках, для которых значение свойства Правило вытеснения задач установлено на Захватывать любой ресурс.

После выполнения задач из этих очередей ресурс сначала выполняет задачи из «индивидуальной очереди», а затем — из очереди блока ResourcePool.

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

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

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

Параметры

Захватить
Здесь вы можете выбрать, требуются ли для сервиса ресурсы одного типа или ресурсы разных типов ((альтернативный) набор ресурсов). Детальное описание см. в статье про использование ресурсов.
Синтаксис: boolean seizeFromOnePool
Набор(ы) ресурсов
[Параметр виден, если Захватить: (Альтернативный) набор ресурсов]
Здесь вы можете задать требуемые наборы ресурсов (блоки ResourcePool). Вы можете добавить несколько наборов с помощью кнопки Добавить список. Ресурсы набираются согласно их доступности. Детальное описание см. в статье про использование ресурсов.
Локальная переменная: agent — агент
Тип ресурсов
[Параметр виден, если Захватить: Ресурсы одного типа]
Блок ResourcePool, задающий ресурсы, которые требуются для обслуживания агента. Детальное описание см. в статье про использование ресурсов.
Локальная переменная: agent — агент
Количество ресурсов
[Параметр виден, если Захватить: Ресурсы одного типа]
Выражение, возвращающее требуемое количество ресурсов для агента.
Тип значения: int
Значение по умолчанию: 1
Локальная переменная: agent — агент
Вместимость очереди
[Параметр виден, если не выбрана опция Максимальная вместимость]
Вместимость вложенной очереди queue.
Синтаксис: int queueCapacity
Значение по умолчанию: 100
Установить новое значение во время выполнения: set_queueCapacity(новое значение)
Максимальная вместимость
Если опция выбрана (true), то вместимость очереди queue будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity
Значение по умолчанию: false
Установить новое значение во время выполнения: set_maximumCapacity(новое значение)
Время задержки
Выражение, вычисляющее время задержки для агента.
Тип значения: double
Локальная переменная: agent — текущий агент
Пересылать захваченные ресурсы
Если опция выбрана ( true), захваченные ресурсы будут пересылаться в указанное местоположение.
Тип значения: boolean
Значение по умолчанию: false
Локальные переменные:
agent — агент
Agent unit — ресурс
Место назначения
[Параметр виден, если выбрана опция Пересылать захваченные ресурсы]
Задает место, куда будут пересылаться ресурсы. Ресурсы могут быть отправлены в следующее место назначения:
К агенту — ресурсы пересылаются в местоположение указанного агента
Узел сети — ресурсы пересылаются в указанный узел сети
Аттрактор — ресурсы пересылаются в указанный аттрактор
Имя: destinationType
Значение по умолчанию: К агенту (Service.DEST_ENTITY)
Допустимые значения:
Service.DEST_ENTITY — К агенту
Service.DEST_NODE — Узел сети
Service.DEST_ATTRACTOR — Аттрактор
Узел
[Параметр виден, если Место назначения: Узел сети]
Узел сети, куда отправляются агенты, созданные этим блоком.
Тип значения: Node
Локальные переменные:
T agent — агент
Agent unit — ресурс
Аттрактор
[Параметр виден, если Место назначения: Аттрактор]
Аттрактор, куда отправляются агенты, созданные этим блоком.
Тип значения: Attractor Локальные переменные:
T agent — агент
Agent unit — ресурс
По окончании, движущиеся ресурсы
Выберите, движущиеся ресурсы Возвращаются в базовую точку (если их сразу же не захватывает другой агент) или Остаются на месте.
Тип значения: boolean
Значение по умолчанию: true (Возвращаются в базовую точку)
Локальные переменные:
T agent — агент
Agent unit — ресурс
Место агентов (queue)
Фигура разметки ( узел или путь), где располагаются агенты, пока они находятся во вложенном блоке queue.
Синтаксис: entityLocationQueue
Место агентов (delay)
Фигура разметки ( узел или путь), где располагаются агенты, пока они находятся во вложенном блоке delay.
Синтаксис: entityLocationDelay

Приоритеты / вытеснение

Приоритет задачи
Приоритет задачи для поступающего агента.
Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T agent — агент
Может вытеснять другие задачи
Если опция выбрана, задача может вытеснять производимую в текущий момент задачу (если возможно согласно свойствам задачи, и приоритет задачи ниже).
Тип значения: boolean
Значение по умолчанию: true
Локальная переменная: T agent — агент
Правило вытеснения задач
Здесь вы можете выбрать, что будет происходить, если поступает какая-либо новая задача для занятых ресурсов.
Вытеснения нет — продолжает выполнять текущую задачу
Ожидать оригинал ресурса — прерывает задачу и ожидает, когда тот ресурс сможет ее закончить
Прекратить обслуживание — задача прерывается и более не возобновляется
Захватывать любой ресурс — прерывает задачу и пытается захватить любой ресурс указанного типа
Продолжать без ресурса — задача завершается без участия ресурса
Значение по умолчанию: Вытеснения нет
Допустимые значения:
Service.PP_NO_PREEMPTION) — Вытеснения нет
Service.PP_WAIT_FOR_ORIGINAL_RESOURCE — Ожидать оригинал ресурса
Service.PP_TERMINATE_SERVING — Прекратить обслуживание
Service.PP_SEIZE_ANY_RESOURCE — Захватывать любой ресурс
Service.PP_CONTINUE_WITHOUT_RESOURCE — Продолжать без ресурса
Локальная переменная: T agent — агент
Авто приостановка/возобновление
[Параметр виден, если Правило вытеснения задач: Ожидать оригинал ресурса или Захватывать любой ресурс]
Этим параметром задается, должен ли агент, выполнение задачи которого приостановлено, быть автоматически приостановлен в текущей диаграмме процесса и автоматически возобновлен, когда будут доступны ресурсы.
Синтаксис: boolean suspendResumeEntities
Значение по умолчанию: true
Вход для прекращенных агентов
[Параметр виден, если Правило вытеснения задач: Прекратить обслуживание]
Блок Enter для агентов, которые теряют все ресурсы, полученные ими в этом блоке из-за прекращения обслуживания, когда один из наборов ресурсов (заданных в этом блоке Service) оказывается захваченным задачей с более высоким приоритетом.
Локальные переменные:
T agent — агент
Agent unit — ресурс, который запустил прекращение
Возвращаться
[Параметр виден, если По окончании, движущиеся ресурсы: Возвращаются в базовую точку]
Выберите, должны ли освободившиеся ресурсы всегда возвращаться в базовую точку по окончании задачи, или же только если нет других задач, или же выберите другое и укажите приоритет задачи возвращения и правило вытеснения этой задачи другими задачами с помощью расположенных ниже параметров.
Локальные переменные:
T agent — агент
Agent unit — ресурс
Приоритет "завершения"
[Параметр виден, если Возвращаться: другое]
Здесь вы можете задать приоритет для задачи возвращения освободившихся ресурсов в их базовую точку по окончании задачи.
Тип значения: double
Локальные переменные:
T agent — агент
Agent unit — ресурс
Правило вытеснения
[Параметр виден, если Возвращаться: другое]
Здесь вы можете задать правило вытеснения для задачи возвращения освободившихся ресурсов в их базовую точку по окончании задачи.
Вытеснения нет — задача не может быть вытеснена другими задачами
Прекратить — задача будет вытеснена новой задачей и прекращена
Локальные переменные:
T agent — агент
Agent unit — ресурс

Специфические

Задать выбор ресурса
Если эта опция выбрана, вы можете указать для выполнения операции определенные ресурсы (используя параметр Условие выбора ресурса, расположенный ниже).
Синтаксис: boolean customizeResourceChoice
Значение по умолчанию: false
Условие выбора ресурса
[Параметр виден, если выбрана опция Задать выбор ресурса]
Здесь вы можете указать булево выражение, которое будет вычисляться, чтобы найти требуемые ресурсы для выполнения операции. Если нет доступных ресурсов, подходящих под условие (условие возвращает false), блок Service будет ожидать первый доступный ресурс, для которого выполняется условие. Обычно вы задаете какой-либо параметр внутри типа агента (например, myAssistant), помещаете туда ссылку на ресурс, когда он начинает работать с агентом (agent.myAssistant=unit), и затем указываете здесь условие, позволяющее только этому конкретному ресурсу продолжать работу с этим конкретным агентом.
Тип значения: boolean
Значение по умолчанию: true
Локальные переменные:
T agent — агент
Agent unit — ресурс
ResourcePool pool — набор ресурсов
Политика выбора ресурса
Здесь вы можете указать политику выбора ресурса.
Не применяется — политика выбора ресурса не применяется, просто выбирается какой-то из доступных ресурсов.
Ближайший к агенту — выбирается ресурс, ближайший к текущему агенту.
Ближайший к агенту по пути (ГИС) — выбирается ресурс, который при осуществлении движения по существующим путям в ГИС расположен ближе всего к текущему агенту.
Наиболее предпочтительный — ресурс выбирается путем сравнения ресурсов друг с другом. Алгоритм сравнения (или его вызов) помещается в поле "unit1 предпочтительнее unit2".
По рейтингу — выбирается ресурс с лучшим рейтингом. Рейтинг (или алгоритм его вычисления) задается пользователем в поле Рейтинг ресурса.
Значение по умолчанию: Не применяется
Допустимые значения:
Service.RESOURCE_SELECTION_SOME_UNIT) — Не применяется
Service.RESOURCE_SELECTION_NEAREST — Ближайший к агенту
Service.RESOURCE_SELECTION_NEAREST_BY_ROUTE — Ближайший к агенту по пути (ГИС)
Service.RESOURCE_SELECTION_BASED_ON_COMPARISON — Наиболее предпочтительный
Service.RESOURCE_SELECTION_BASED_ON_RATING_VALUE — По рейтингу
Локальные переменные:
agent — агент
ResourcePool pool — набор ресурсов
"unit1 предпочтительнее unit2"
[Параметр виден, если выбрана опция Выбор ресурса: Наиболее предпочтительный]
Вызов алгоритма для сравнения ресурсов для определения наиболее подходящего для выполнения задачи данного агента. Алгоритм должен возвращать true, если сравниваемый ресурс unit1 предпочтительнее, чем ресурс unit2 (а если наоборот, включая равенство при сравнении, то возвращается значение false). Алгоритм должен соблюдать транзитивность.
Тип значения: boolean
Локальные переменные:
Agent unit1 — первый ресурс для сравнения
Agent unit2 — второй ресурс для сравнения
agent — текущий агент
Рейтинг ресурса
[Параметр виден, если выбрана опция Выбор ресурса: По рейтингу]
Значение рейтинга ресурса (чем больше значение, тем выше рейтинг). С помощью рейтинга производится выбор ресурса для выполнения операции текущего агента — выбирается ресурс с высшим рейтингом. Чаще всего здесь помещается алгоритм или вызов функции, производящей подсчет рейтинга с помощью имеющихся в распоряжении локальных переменных.
Тип значения: double
Локальные переменные:
agent — агент
Agent unit — набор ресурсов
Разрешить уход по таймауту
Если опция выбрана (true), то агенты могут покидать очередь queue по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать блок через специальный порт outTimeout.
Синтаксис: boolean enableTimeout
Значение по умолчанию: false
Таймаут
[Параметр виден, если выбрана опция Разрешить уход по таймауту]
Выражение, вычисляющее значение таймаута (максимально допустимое время, которое агент может провести в очереди) для агента.
Тип значения: double
Локальная переменная: agent — агент
Разрешить вытеснение
Если опция выбрана (true), то агенты помещаются в очередь queue в соответствии с их приоритетами и могут быть вытеснены из очереди агентами с более высокими приоритетами.
Синтаксис: boolean enablePreemption
Значение по умолчанию: false
Вернуть агента в исходную точку
Если опция выбрана, агенты возвращаются в свое начальное местоположение (узел или путь, где они находились до того, как попали в блок Service), после того, как покинут фигуры разметки, заданные в параметрах Место агентов (queue, delay).
Синтаксис: boolean restoreEntityLocationOnExit
Значение по умолчанию: false
Включить сбор статистики
Блок содержит внутренние блоки, для которых собирается статистика. Если сбор статистики глобально отключен для всех блоков Библиотеки моделирования процессов с помощью блока PML Settings, то эта опция позволяет переопределить эту настройку и включить сбор статистики для этого конкретного блока. Иначе статистика собирается вне зависимости от этой настройки.
Синтаксис: boolean forceStatisticsCollection
Значение по умолчанию: false
Время возвращения
Выберите, должно ли учитываться время, затраченное на возвращение ресурсов в их базовое местоположение, как "занятое" время, или же как "свободное" время, или же оно не учитывается в статистике вовсе.
Локальные переменные:
agent — агент
Agent unit — ресурс

Действия

При входе
Код, выполняемый при поступлении агента в блок.
Локальная переменная: agent — агент
При выходе по таймауту
[Параметр виден, если выбрана опция Разрешить уход по таймауту]
Код, выполняемый, когда агент покидает блок по таймауту (прождав в очереди максимально допустимое время) через специальный порт outTimeout.
Локальная переменная: agent — агент
При вытеснении
[Параметр виден, если выбрана опция Разрешить вытеснение]
Код, выполняемый, когда агент покидает блок через порт outPreempted в результате вытеснения.
Локальная переменная: agent — агент
При захвате ресурса
Код, выполняемый при захвате ресурса.
Локальные переменные:
agent — агент
Agent unit — захваченный ресурс
При начале задержки
Код, выполняемый, когда агент поступает во вложенный блок delay.
Локальные переменные:
agent — агент
double delayTime — время задержки, вычисленное для агента
При подходе к выходу
Код, выполняемый, когда время задержки для агента заканчивается и агент готов покинуть блок.
Локальная переменная: agent — агент
При выходе
Код, выполняемый, когда агент покидает блок через порт out.
Локальная переменная: agent — агент
При приостановке задачи
[Параметр виден, если Правило вытеснения задач: Ожидать оригинал ресурса или Захватывать любой ресурс]
Код, выполняемый, когда задача агента приостановлена из-за этих правил вытеснения, когда его ресурс захватывается другой задачей с более высоким приоритетом.
Локальные переменные:
agent — агент
Agent unit — ресурс
При возобновлении задачи
[Параметр виден, если Правило вытеснения задач: Ожидать оригинал ресурса или Захватывать любой ресурс]
Код, выполняемый, когда агент возобновляет выполнение своей задачи после того, как был приостановлен из-за этих правил вытеснения.
Локальные переменные:
agent — агент
Agent unit — ресурс
При прекращении задачи
[Параметр виден, если Правило вытеснения задач: Прекратить обслуживание]
Код, выполняемый, когда агент теряет все ресурсы, полученные в этом блоке из-за правила вытеснения, когда один из наборов ресурсов (заданных в этом блоке) оказывается захваченным задачей с более высоким приоритетом.
Локальные переменные:
agent — агент
Agent unit — ресурс, который запустил прекращение
При извлечении
Код, выполняемый, когда агент умышленно извлекается из блока посредством вызова функции агента remove(). Этот код вызывается автоматически после вызова функции remove().
Локальная переменная: agent — агент

Функции

Функция Описание
int queueSize() Возвращает количество агентов во вложенном блоке queue.
T queueGet(int index) Возвращает агента, находящегося в очереди в позиции с номером index (ближайшая к выходу из очереди позиция имеет номер 0).
T queueRemove(Agent agent) Извлекает агента agent из очереди и возвращает его.
int delaySize() Возвращает количество агентов во вложенном блоке delay.
T delayGet(int index) Возвращает агента, находящегося во вложенном блоке Delay в позиции с номером index (самый "старый" агент находится в позиции с номером 0).
T delayRemove(Agent agent) Извлекает заданного агента agent из вложенного блока delay и возвращает его.
T remove(Agent agent) Извлекает заданного агента из блока и возвращает его. Если агента не было в блоке, возвращает null.
int size() Возвращает количество агентов в блоке.
T resume(Agent agent) Возобновляет ранее приостановленный блок delay (выдает ошибку, если не было приостановки).
T suspend(Agent agent) Приостанавливает вложенный блок delay на заданное время таймаута dt.
double utilization() Возвращает средний коэффициент загрузки этого блока. Возвращаемое значение — среднее количество обслуженных агентов, собранное за какое-то время.
List getResourceUnits(T agent) Возвращает ресурсы, которые обслуживают агента в этом блоке.
boolean isStatisticsCollected() Возвращает true, если блок собирает статистику.
resetStats() Обнуляет статистику, собранную для этого блока.
recalculateResourceChoiceConditions(Agent agent) Заново проверяет условия выбора ресурсов для заданного агента, который сейчас находится в очереди этого блока. Эту функцию можно использовать, когда некоторые ресурсы, ранее недоступные для захвата конкретным агентом, возможно, стали доступными, поскольку условия изменились.
recalculateResourceChoiceConditions() Заново проверяет условия выбора ресурсов для всех агентов, которые сейчас находится в очереди этого блока. Эту функцию можно использовать, когда некоторые ресурсы, ранее недоступные для захвата, возможно, стали доступными, поскольку условия изменились.

Внутренние блоки

Seize seize
Захватывает ресурсы. Этот блок в свою очередь содержит блок Queue, представляющий очередь, в которой агенты ждут свои ресурсы.
Delay delay
Задерживает агента.
Release release
Освобождает ранее захваченные этим блоком ресурсы.

Порты

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