Синхронизирует два потока агентов путем нахождения пар агентов, удовлетворяющих заданному критерию соответствия. Агенты, для которых не было найдено пары, для которой выполнялось бы заданное условие, хранятся в двух очередях (по одной на каждый входящий поток агентов). По прибытии нового агента в один из двух входных портов он проверяется на соответствие со всеми агентами, находящимися в очереди, хранящей агентов другого потока. Если соответствие будет найдено, будет выполнена функция onMatch, и оба агента сразу же покинут блок Match через два соответствующих выходных порта. При необходимости поведение очередей может быть настроено на вашу конкретную задачу с помощью таймаутов, вытеснения, приоритетов и т.д.
По умолчанию задано простейшее условие true. Оно означает, что любые два агента будут соответствовать друг другу и блок Match будет работать как простой синхронизатор потоков: он будет выдавать пары агентов.
Предположим, что в одном из потоков проходят агенты типа Passenger, а в другом — типа Baggage, и у обоих этих типов есть параметр id. Тогда для того, чтобы найти соответствие между агентом, моделирующим пассажира и агентом его багажа, вы можете написать agent1.id == agent2.id (при этом нужно не забыть задать типы агентов Passenger и Baggage).
Демо-модель: Match Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.- Условие, вычисляемое при поступлении нового агента. Вычисляется для пары агентов (только что прибывший агент и агент из противоположной очереди).
Тип значения: boolean
Локальные переменные:
T1 agent1 — агент в очереди queue1
T2 agent2 — агент в очереди queue2
Значение по умолчанию: true - Вместимость 1
- [Параметр виден, если не выбрана опция Максимальная вместимость 1]
Вместимость первой очереди queue1.Синтаксис: int capacity1
Значение по умолчанию: 100
Установить новое значение во время выполнения: set_capacity1(новое значение) - Максимальная вместимость 1
- Если опция выбрана (true), то вместимость первой очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity1
Значение по умолчанию: false
Установить новое значение во время выполнения: set_maximumCapacity1(новое значение) - Вместимость 2
- [Параметр виден, если не выбрана опция Максимальная вместимость 2]
Вместимость второй очереди queue2.Синтаксис: int capacity2
Значение по умолчанию: 100
Установить новое значение во время выполнения: set_capacity2(новое значение) - Максимальная вместимость 2
- Если опция выбрана (true), то вместимость второй очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity2
Значение по умолчанию: false
Установить новое значение во время выполнения: set_maximumCapacity2(новое значение) - Место агентов (queue1)
- Фигура разметки (узел или путь), где располагаются агенты, пока они находятся в queue1.
Синтаксис: AnimationStaticLocationProvider entityLocation1
- Место агентов (queue2)
- Фигура разметки (узел или путь), где располагаются агенты, пока они находятся в queue2.
Синтаксис: AnimationStaticLocationProvider entityLocation2
- Приоритет queue1
- Политика, согласно которой агенты помещаются в первую очередь. Может быть:
FIFO — Выбранная по умолчанию политика. Первый добавленный в очередь агент будет и извлекаться первым (First In, First Out).
По приоритету — Агенты будут помещаться в очередь согласно их приоритетам (заданным в поле Приоритет агента 1).
Сравнение агентов — В этом режиме для каждого поступающего в первую очередь агента вычисляется булево выражение. Этот агент сравнивается с теми агентами, которые уже находятся в этой очереди, и место в очереди для этого агента определяется по результатам сравнения.
LIFO — Первым будет извлекаться последний добавленный в очередь агент (Last In, First Out).
Имя: queuing1
Допустимые значения:Queue.QUEUING_FIFO — FIFO
Queue.QUEUING_PRIORITY — По приоритету
Queue.QUEUING_COMPARISON — Сравнение агентов
Queue.QUEUING_LIFO — LIFO - [Параметр виден, если Приоритет queue1: По приоритету]
Приоритет поступающего агента (чем больше тем выше).Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T1 agent — агент - [Параметр виден, если Приоритет queue1: Сравнение агентов]
Здесь вы можете указать булево выражение, которое вычисляется для каждого агента, поступающего в очередь. Выражение сравнивает этого агента с агентами, которые уже находятся в очереди и находит для него место согласно результату. Если выражение возвращает true, новый агент располагается ближе к началу очереди, чем агент из очереди, с которым его сравнивали.Тип значения: boolean
Локальные переменные:
T1agent1 — агент
T1agent2 — агент, который сравнивается со входящим агентом - Приоритет queue2
- Политика, согласно которой агенты помещаются во вторую очередь. Может быть:
FIFO — Выбранная по умолчанию политика. Первый добавленный в очередь агент будет и извлекаться первым (First In, First Out).
По приоритету — Агенты будут помещаться в очередь согласно их приоритетам (заданным в поле Приоритет агента 2).
Сравнение агентов — В этом режиме для каждого поступающего во вторую очередь агента вычисляется булево выражение. Этот агент сравнивается с теми агентами, которые уже находятся в этой очереди, и место в очереди для этого агента определяется по результатам сравнения.
LIFO — Первым из очереди будет извлекаться агент, добавленный в очередь позже остальных (Last In, First Out).
Имя: queuing2
Допустимые значения:Queue.QUEUING_FIFO — FIFO
Queue.QUEUING_LIFO — LIFO
Queue.QUEUING_PRIORITY — По приоритету
Queue.QUEUING_COMPARISON — Сравнение агентов - [Параметр виден, если Приоритет queue2: По приоритету]
Приоритет поступающего агента (чем больше тем выше).Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T2 agent — агент - [Параметр виден, если Приоритет queue2: Сравнение агентов]
Здесь вы можете указать булево выражение, которое вычисляется для каждого агента, поступающего в очередь. Выражение сравнивает этого агента с агентами, которые уже находятся в очереди и находит для него место согласно результату. Если выражение возвращает true, новый агент располагается ближе к началу очереди, чем агент из очереди, с которым его сравнивали.Тип значения: boolean
Локальные переменные:
T2agent1 — агент
T2agent2 — агент, который сравнивается со входящим агентом - Разрешить уход по таймауту 1
- Если опция выбрана (true), то агенты могут покидать очередь queue1 по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать блок через специальный порт outTimeout1.
Синтаксис: boolean enableTimeout1
Значение по умолчанию: true - [Параметр виден, если выбрана опция Разрешить уход по таймауту 1]
Выражение, вычисляющее значение таймаута для агента в очереди queue1.Тип значения: double
Локальная переменная: T1 agent — агент - Разрешить уход по таймауту 2
- Если опция выбрана (true), то агенты могут покидать очередь queue2 по таймауту. После проведения в очереди максимально допустимого времени агенты будут покидать блок через специальный порт outTimeout2.
Синтаксис: boolean enableTimeout2
Значение по умолчанию: true - [Параметр виден, если выбрана опция Разрешить уход по таймауту 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 — агент
int size1() | Возвращает количество агентов, находящихся в данный момент в очереди queue1. |
int size2() | Возвращает количество агентов, находящихся в данный момент в очереди queue2. |
T1 remove1( T1 agent ) | Извлекает агента agent из очереди queue1 и возвращает его. Если такого агента в очереди обнаружено не будет, функция вернет null. |
T2 remove2( T2 agent ) | Извлекает агента agent из очереди queue2 и возвращает его. Если такого агента в очереди обнаружено не будет, функция вернет null. |
boolean isStatisticsCollected() | Возвращает true, если блок собирает статистику. |
- Queue queue1
- Верхняя внутренняя очередь.
- Queue queue2
- Нижняя внутренняя очередь.
- in1
- Первый входной порт.
- in2
- Второй входной порт.
- out1
- Первый выходной порт.
- out2
- Второй выходной порт.
- outTimeout1
- Выходной порт для агентов, покидающих первую очередь из-за истечения допустимого времени ожидания.
- outTimeout2
- Выходной порт для агентов, покидающих вторую очередь из-за истечения допустимого времени ожидания.
- outPreempted1
- Выходной порт для агентов, покидающих первую очередь, если они вытеснены другим агентом.
- outPreempted2
- Выходной порт для агентов, покидающих вторую очередь, если они вытеснены другим агентом.
-
Как мы можем улучшить эту статью?
-