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

Match

Синхронизирует два потока агентов путем нахождения пар агентов, удовлетворяющих заданному критерию соответствия. Агенты, для которых не было найдено пары, для которой выполнялось бы заданное условие, хранятся в двух очередях (по одной на каждый входящий поток агентов). По прибытии нового агента в один из двух входных портов он проверяется на соответствие со всеми агентами, находящимися в очереди, хранящей агентов другого потока. Если соответствие будет найдено, будет выполнена функция 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
Приоритет агента 1
[Параметр виден, если Приоритет queue1: По приоритету]
Приоритет поступающего агента (чем больше тем выше).
Тип значения: double
Значение по умолчанию: 0
Локальная переменная: T1 agent — агент
"agent1 предпочтительнее agent2" 1
[Параметр виден, если Приоритет 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 — Сравнение агентов
Приоритет агента 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 — агент

Функции

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
Выходной порт для агентов, покидающих вторую очередь, если они вытеснены другим агентом.
Как мы можем улучшить эту статью?