Match


Синхронизирует два потока агентов путем нахождения пар агентов, удовлетворяющих заданному критерию соответствия. Агенты, для которых не было найдено пары, для которой выполнялось бы заданное условие, хранятся в двух очередях (по одной на каждый входящий поток агентов). По прибытии нового агента в один из двух входных портов он проверяется на соответствие со всеми агентами, находящимися в очереди, хранящей агентов другого потока. Если соответствие будет найдено, будет выполнен метод onMatch, и оба агента сразу же покинут объект Match через два соответствующих выходных порта. При необходимости поведение очередей может быть настроено на вашу конкретную задачу с помощью таймаутов, вытеснения, приоритетов и т.д.

По умолчанию задано простейшее условие true. Оно означает, что любые два агента будут соответствовать друг другу и объект Match будет работать как простой синхронизатор потоков: он будет выдавать пары агентов.

Предположим, что в одном из потоков проходят агенты типа Passenger, а в другом - типа Baggage, и у обоих этих типов есть параметр id. Тогда для того, чтобы найти соответствие между агентом, моделирующим пассажира и агентом его багажа, вы можете написать agent1.id ==agent2.id (при этом нужно не забыть задать типы агентов Passenger и Baggage).

Демо модель: Match

Параметры

Условие соответствия [динамический]
Условие, вычисляемое при поступлении нового агента. Вычисляется для пары агентов (только что прибывший агент и агент из противоположной очереди).
Тип значения: boolean
Локальные переменные: T1agent1 - агент в очереди queue1.
T2agent2 - агент в очереди queue2.
Значение по умолчанию: true
Вместимость 1
[Параметр виден, если не выбрана опция Максимальная вместимость 1] Вместимость первой очереди queue1.
Синтаксис: int capacity1
Значение по умолчанию: 100
Максимальная вместимость 1
Если опция выбрана (true), то вместимость первой очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity1
Значение по умолчанию: false
Вместимость 2
[Параметр виден, если не выбрана опция Максимальная вместимость 2] Вместимость второй очереди queue2.
Синтаксис: int capacity2
Значение по умолчанию: 100
Максимальная вместимость 2
Если опция выбрана (true), то вместимость второй очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity2
Значение по умолчанию: false
Место агентов (queue1)
Фигура разметки (узел или путь), где располагаются агенты, пока они находятся в queue1.
Синтаксис: AnimationStaticLocationProvider entityLocation1
Место агентов (queue2)
Фигура разметки (узел или путь), где располагаются агенты, пока они находятся в queue2.
Синтаксис: AnimationStaticLocationProvider entityLocation2
Специфические
Приоритет queue1
Порядок поступления в очередь. Может быть FIFO (по умолчанию), LIFO, По приоритету, либо Сравнение агентов (в последнем случае булево выражение вычисляется для каждого агента: этот агент сравнивается с агентами, которые уже находятся в очереди и определяется для него место согласно результату).
Имя: queuing1
Допустимые значения: Queue.QUEUING_FIFO - FIFO
Queue.QUEUING_PRIORITY - По приоритету
Queue.QUEUING_COMPARISON - Сравнение агентов
Queue.QUEUING_LIFO - LIFO
Приоритет агента 1 [динамический]
[Параметр виден, если Приоритет queue1: По приоритету] Приоритет поступающего агента (чем больше тем выше).
Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T1 agent - агент.
"agent1 предпочтительнее agent2" 1 [динамический]
[Параметр виден, если Приоритет queue1: Сравнение агентов] Здесь вы можете указать булево выражение, которое вычисляется для каждого агента, поступающего в очередь. Выражение сравнивает этого агента с агентами, которые уже находятся в очереди и находит для него место согласну результату. Если выражение возвращает true, новый агент располагается ближе к началу очереди, чем агент из очереди, с которым его сравнивали.
Тип значения: boolean
Локальные переменные: T1agent1 - агент.
T1agent2 - агент, который сравнивается со входящим агентом.
Приоритет queue2
Порядок поступления в очередь. Может быть FIFO (по умолчанию), LIFO, По приоритету, либо Сравнение агентов (в последнем случае булево выражение вычисляется для каждого агента: этот агент сравнивается с агентами, которые уже находятся в очереди и определяется для него место согласно результату).
Имя: queuing2
Допустимые значения: Queue.QUEUING_FIFO - FIFO
Queue.QUEUING_PRIORITY - По приоритету
Queue.QUEUING_COMPARISON - Сравнение агентов
Queue.QUEUING_LIFO - LIFO
Приоритет агента 2 [динамический]
[Параметр виден, если Приоритет queue2: По приоритету] Приоритет поступающего агента (чем больше тем выше).
Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T2 agent - агент.
"agent1 предпочтительнее agent2" 2 [динамический]
[Параметр виден, если Приоритет queue2: Сравнение агентов] Здесь вы можете указать булево выражение, которое вычисляется для каждого агента, поступающего в очередь. Выражение сравнивает этого агента с агентами, которые уже находятся в очереди и находит для него место согласно результату. Если выражение возвращает true, новый агент располагается ближе к началу очереди, чем агент из очереди, с которым его сравнивали.
Тип значения: boolean
Локальные переменные: T2agent1 - агент.
T2agent2 - агент, который сравнивается со входящим агентом.
Разрешить уход по таймауту 1
Если опция выбрана (true), то агенты могут покидать очередь queue1 по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать объект через специальный порт outTimeout1.
Синтаксис: boolean enableTimeout1
Значение по умолчанию: true
Таймаут 1 [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 1] Выражение, вычисляющее значение таймаута для агента в очереди queue1.
Тип значения: double
Локальная переменная: T1 agent - агент.
Разрешить уход по таймауту 2
Если опция выбрана (true), то агенты могут покидать очередь queue2 по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать объект через специальный порт outTimeout2.
Синтаксис: boolean enableTimeout2
Значение по умолчанию: true
Таймаут 2 [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 2] Выражение, вычисляющее значение таймаута для агента в очереди queue2.
Тип значения: double
Локальная переменная: T2 agent - агент.
Разрешить вытеснение 1
Если опция выбрана (true), то агенты помещаются в очередь queue1 в соответствии с их приоритетами и могут быть вытеснены из очереди агентами с более высокими приоритетами.
Синтаксис: boolean enablePreemption1
Значение по умолчанию: false
Разрешить вытеснение 2
Если опция выбрана (true), то агенты помещаются в очередь queue2 в соответствии с их приоритетами и могут быть вытеснены из очереди агентами с более высокими приоритетами.
Синтаксис: boolean enablePreemption2
Значение по умолчанию: false
Вернуть агента в исходную точку
Если опция выбрана, агенты возвращаются в свое начальное местоположение (узел или путь, где они находились до того, как попали в этот блок), после того, как покинут фигуры разметки, заданные в параметрах Место агентов (queue 1, queue2).
Синтаксис: boolean restoreEntityLocationOnExit
Включить сбор статистики
По умолчанию, статистика собирается для всех блоков Библиотеки Моделирования Процессов. Тем не менее, вы можете настроить этот параметр и выключить сбор статистики, чтобы улучшить динамику модели. Для этого добавьте блок PML Settings и отключите опцию Включить статистику по умолчанию. Таким образом, вы отключите сбор статистики для всех блоков диаграммы процесса в этой модели. Но вы можете включить статистику для некоторых конкретных блоков, включив эту опцию Включить сбор статистики в свойствах самого блока.
Синтаксис: boolean forceStatisticsCollection
Значение по умолчанию: false
Действия
При входе 1 [код]
Код, выполняемый, когда агент поступает в объект через порт in1 (и помещается в очередь queue1).
Локальная переменная: T1 agent - агент.
При входе 2 [код]
Код, выполняемый, когда агент поступает в объект через порт in2 (и помещается в очередь queue2).
Локальная переменная: T2 agent - агент.
При соответствии [код]
Код, выполняемый при нахождении соответствия у двух агентов.
Локальные переменные: T1agent1 - текущий агент в очереди queue1.
T2agent2 - текущий агент в очереди queue2.
При выходе 1 [код]
Код, который выполняется, когда объект покидает агент из первого потока, для которого было выполнено заданное условие соответствия.
Локальная переменная: T1 agent - агент.
При выходе 2 [код]
Код, который выполняется, когда объект покидает агент из второго потока, для которого было выполнено заданное условие соответствия.
Локальная переменная: T2 agent - агент.
При уходе по таймауту 1 [код]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 1] Код, выполняемый, когда агент покидает объект по таймауту (прождав в очереди queue1 максимально допустимое время) через специальный порт outTimeout1.
Локальная переменная: T1 agent - агент.
При уходе по таймауту 2 [код]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 2] Код, выполняемый, когда агент покидает объект по таймауту (прождав в очереди queue2 максимально допустимое время) через специальный порт outTimeout2.
Локальная переменная: T2 agent - агент.
При вытеснении 1 [код]
[Параметр виден, если выбрана опция Разрешить вытеснение 1] Код, выполняемый, когда агент покидает объект через порт outPreempted1 в результате вытеснения.
Локальная переменная: T1 agent - агент.
При вытеснении 2 [код]
[Параметр виден, если выбрана опция Разрешить вытеснение 2] Код, выполняемый, когда агент покидает объект через порт outPreempted2 в результате вытеснения.
Локальная переменная: T2 agent - агент.

Functions

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

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

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

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

Порты

in1
Первый входной порт.
in2
Второй входной порт.
out1
Первый выходной порт.
out2
Второй выходной порт.
outTimeout1
Выходной порт для агентов, покидающих первую очередь из-за истечения допустимого времени ожидания.
outTimeout2
Выходной порт для агентов, покидающих вторую очередь из-за истечения допустимого времени ожидания.
outPreempted1
Выходной порт для агентов, покидающих первую очередь, если они вытеснены другим агентом.
outPreempted2
Выходной порт для агентов, покидающих вторую очередь, если они вытеснены другим агентом.