Queue


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

Поступающие агенты помещаются в очередь в определенном порядке: либо согласно правилу FIFO (в порядке поступления в очередь - по умолчанию), LIFO, либо согласно приоритетам агентов. Приоритет может либо явно храниться в агенте, либо вычисляться согласно свойствам агента и каким-то внешним условиям. Очередь с приоритетами всегда примет нового входящего агента, вычислит его приоритет и поместит его в очередь в позицию, соответствующую его приоритету. Если очередь будет заполнена, то приход нового агента вынудит последнего хранящегося в очереди агента покинуть объект через порт outPreempted (но если приоритет нового агента не будет превышать приоритет последнего агента, то тогда вместо него будет вытеснена именно этот новый агент).

В режиме таймаута агент покинет очередь через порт outTimeout, если проведет в очереди заданное количество времени.

Вы можете извлекать любых агентов из очереди с помощью метода remove(). В некоторых случаях, например, когда объект Queue используется для моделирования хранилища с произвольным доступом, имеет смысл оставлять порт out несоединенным и извлекать агентов из очереди с помощью метода remove() . Извлеченные из очереди агенты могут быть вставлены в другие процессы с помощью объектов Enter.

Вы можете расширять функциональность объекта Queue, выполняя необходимые вам действия в момент помещения агента в очередь, при достижении им начала очереди, а также при уходе агента из объекта через любой из его портов. Пожалуйста, обратите внимание, что на момент вызова кода параметра onEnter агент уже будет помещен в очередь, а на момент вызова кода параметров onExit или onExitTimeout будет удален из очереди.

Вы можете динамически изменять вместимость очереди.

Агенты в очереди могут отображаться на презентации как стоящими один за другим (тип анимации Путь), так и стоящими в как-то по-другому заданных местах.

Параметры

Вместимость
[Параметр виден, если не выбрана опция Максимальная вместимость] Вместимость объекта Queue.
Синтаксис: int capacity
Значение по умолчанию: 100
Максимальная вместимость
Если опция выбрана (true), то вместимость очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity
Значение по умолчанию: false
Место агентов
Фигура разметки (узел или путь), где располагаются агенты, пока они обрабатываются объектом Delay.
Синтаксис: AnimationStaticLocationProvider entityLocation
Специфические
Очередь
Порядок поступления в очередь. Может быть FIFO (по умолчанию), LIFO, По приоритету, либо Сравнение агентов (в последнем случае булево выражение вычисляется для каждого агента: этот агент сравнивается с агентами, которые уже находятся в очереди и определяет для него место согласно результату).
Имя: queuing
Допустимые значения: Queue.QUEUING_FIFO - FIFO
Queue.QUEUING_PRIORITY - По приоритету
Queue.QUEUING_COMPARISON - Сравнение агентов
Queue.QUEUING_LIFO - LIFO
Приоритет агента [динамический]
[Параметр виден, если Очередь: По приоритету] Приоритет поступающего агента (чем больше тем выше).
Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T agent - агент.
"agent1 предпочтительнее agent2" [динамический]
[Параметр виден, если Очередь: Сравнение агентов] Здесь вы можете указать булево выражение, которое вычисляется для каждого агента, поступающего в очередь. Выражение сравнивает этого агента с агентами, которые уже находятся в очереди и находит для него место согласно результату. Если выражение возвращает true, новый агент располагается ближе к началу очереди, чем агент из очереди, с которым его сравнивали.
Тип значения: boolean
Локальные переменные: T agent1 - агент.
T agent2 - агент, который сравнивается с входящим агентом.
Разрешить уход по таймауту
Если опция выбрана (true), то агенты могут покидать очередь по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать объект через специальный порт outTimeout.
Синтаксис: boolean enableTimeout
Значение по умолчанию: true
Таймаут [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту] Выражение, вычисляющее значение таймаута (максимально допустимое время, которое агент может провести в очереди) для агента.
Тип значения: double
Локальная переменная: T agent - агент.
Разрешить вытеснение
Если опция выбрана (true), то агенты помещаются в очередь в соответствии с их приоритетами и могут быть вытеснены из очереди агентами с более высокими приоритетами.
Синтаксис: boolean enablePreemption
Значение по умолчанию: false
Вернуть агента в исходную точку
Если опция выбрана, агенты возвращаются в свое начальное местоположение (узел или путь, где они находились до того, как попали в этот блок), после того, как покинут фигуру разметки, заданную в параметре Место агентов.
Синтаксис: boolean restoreEntityLocationOnExit
Включить сбор статистики
По умолчанию, статистика собирается для всех блоков Библиотеки Моделирования Процессов. Тем не менее, вы можете настроить этот параметр и выключить сбор статистики, чтобы улучшить динамику модели. Для этого добавьте блок PML Settings и отключите опцию Включить статистику по умолчанию. Таким образом, вы отключите сбор статистики для всех блоков диаграммы процесса в этой модели. Но вы можете включить статистику для некоторых конкретных блоков, включив эту опцию Включить сбор статистики в свойствах самого блока.
Синтаксис: boolean forceStatisticsCollection
Значение по умолчанию: false
Действие
Во всех этих действиях актуальный агент доступен как локальная переменная agent.
При входе [код]
Код, выполняемый, когда агент поступает в объект (и помещается в очередь).
При подходе к выходу [код]
Код, выполняемый, когда агент достигает начала очереди (позиции с номером 0), что может случиться, как только агент входит в очередь.
При выходе [код]
Код, выполняемый, когда агент покидает объект через порт out (обычным способом).
При уходе по таймауту [код]
[Параметр виден, если выбрана опция Разрешить уход по таймауту] Код, выполняемый, когда агент покидает объект по таймауту (прождав в очереди максимально допустимое время) через специальный порт outTimeout.
При вытеснении [код]
[Параметр виден, если выбрана опция Разрешить вытеснение] Код, выполняемый, когда агент покидает объект через порт outPreempted в результате вытеснения.
При извлечении [код]
Код, выполняемый, когда агент умышленно извлекается из блока посредством вызова функции агента remove(). Этот код вызывается автоматически после вызова функции remove().
Локальная переменная: T agent - агент.

Функции

int size() - возвращает количество агентов, находящихся в данный момент в очереди.

boolean canEnter() - возвращает true, если в очередь может быть добавлен еще один агент.

T get(int index) - возвращает агента, находящегося в позиции с номером index (ближайшая к выходу из очереди позиция имеет номер 0).

T getLast() - возвращает последнего агента в очереди или null, если очередь пуста.

T getFirst() - возвращает первого агента в очереди или null, если очередь пуста.

T removeFirst() - извлекает первого агента (из позиции с номером 0) из очереди и возвращает его.

T remove(Agent agent) - извлекает агента agent из очереди и возвращает его. Если такого агента в очереди обнаружено не будет, метод вернет null.

T remove(int index) - извлекает агента из данной позиции в очереди и возвращает его.

boolean release(T agent) - Сообщает очереди отпустить данного агента и направить его к выходному порту. При вызове этой функции, агент может покинуть блок Queue через выходной 'out' порт, но он будет "входить" во вместимость очереди, пока его не выкинет из этого блока. Кроме того, если блок Queue имеет соответствующую конфигурацию, данный агент может быть вытеснен или может покинуть очередь по таймауту во время ожидания у порта 'out'.
Код "При подходе к выходу" вызывается для данного агента.

void sortAgents() - перераспределяет агентов в очереди, сортируя их соответственно правилам очереди. Если очередь определяется способом FIFO или LIFO, то вызов этой функций не производит никаких действий. Если порядок поступления в очередь определяется По приоритету, то заново высчитываются приоритеты агентов. Если порядок поступления в очередь определяется как Сравнение агентов, то агенты сравниваются друг с другом.

void resetStats() - удаляет статистику, собранную объектом к текущему моменту времени.

Iterator iterator() - возвращает итератор агентов (в порядке: первый - у выхода, последний - самое большое время, оставшееся до его задержки).

Переменные

StatisticsContinuous statsSize
Статистика длины очереди. Статистика собирается если выбрана опция объекта Включить статистику по умолчанию в блоке PML Settings.

Порты

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