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

Взаимодействие агентов

Агенты, обитающие в одной среде, могут взаимодействовать, посылая друг другу сообщения.

Функции взаимодействия агентов

Вы можете посылать сообщения вызовами любой из следующих функций.

Отправление сообщений: send() /*рекомендуется*/
Функция Описание
void sendToAll(Object msg) Отправляет сообщение всем агентам в среде, в которой находится данный агент.

msg — сообщение
void sendToRandom(Object msg) Отправляет сообщение случайно выбранному агенту в среде, в которой находится данный агент.

msg — сообщение
void sendToAllConnected(Object msg) Отправляет сообщение всем связанным агентам.

msg — сообщение
void sendToRandomConnected(Object msg) Отправляет сообщение случайно выбранному из связанных агентов.

msg — сообщение
void sendToAllNeighbors(Object msg) Отправляет сообщение всем соседям. Доступно, только если агент находится в дискретном пространстве.

msg — сообщение
void sendToRandomNeighbor(Object msg) Отправляет сообщение случайно выбранному соседу. Доступно, только если агент находится в дискретном пространстве.

msg — сообщение
void send(Object msg, Agent dest) Отправляет сообщение заданному агенту.

msg — сообщение
dest — агент-получатель
void send(Object msg, MessageDeliveryType mode) Отправляет сообщение агенту или группе агентов, указанных в параметре режима отправки.

msg — сообщение
mode — указывает режим отправки сообщения:
ALL — сообщение будет отправлено всем агентам, обитающим в среде
ALL_CONNECTED — сообщение будет отправлено всем связанным агентам
RANDOM — сообщение будет отправлено случайно выбранному агенту из среды обитания данного агента (это может быть в том числе и агент, который и послал это сообщение)
RANDOM_CONNECTED — сообщение будет отправлено случайно выбранному связанному агенту (если таковой будет)
ALL_NEIGHBORS — (только в дискретном пространстве) сообщение будет отправлено всем агентам, находящимся в соседних ячейках, в соответствии с текущей моделью соседства
RANDOM_NEIGHBOR — (только в дискретном пространстве) сообщение будет отправлено случайно выбранному соседу
Мгновенная доставка сообщений: deliver()
Функция Описание
void deliverToAllAgentsInside(Object msg) Мгновенно доставляет сообщение всем агентам в среде.

msg — сообщение
void deliverToRandomAgentInside(Object msg) Мгновенно доставляет сообщение случайному агенту в среде, если в ней имеются другие агенты.

0 msg — сообщение
void deliverToAllConnected(Object msg) Мгновенно доставляет сообщение всем связанным агентам.

msg — сообщение
void deliverToRandomConnected(Object msg) Мгновенно доставляет сообщение случайно выбранному из связанных агентов.

msg — сообщение
void deliverToAllNeighbors(Object msg) Мгновенно доставляет сообщение всем соседям.

msg — сообщение
void deliverToRandomNeighbor(Object msg) Мгновенно доставляет сообщение одному случайно выбранному соседу.

msg — сообщение
void deliver(Object msg, Agent dest) Мгновенно доставляет сообщение заданному агенту.

msg — сообщение
dest — агент-получатель
void deliver(Object msg, MessageDeliveryType mode) Доставляет сообщение агенту или группе агентов, указанных в параметре режима доставки.

msg — сообщение
mode — указывает режим отправки сообщения:
ALL — сообщение будет доставлено всем агентам, обитающим в среде
ALL_CONNECTED — сообщение будет доставлено всем связанным агентам
RANDOM — сообщение будет доставлено случайно выбранному агенту из среды обитания данного агента (это может быть в том числе и агент, который и послал это сообщение)
RANDOM_CONNECTED — сообщение будет доставлено случайно выбранному связанному агенту (если таковой будет)
ALL_NEIGHBORS — (только в дискретном пространстве) сообщение будет доставлено всем агентам, находящимся в соседних ячейках, в соответствии с текущей моделью соседства
RANDOM_NEIGHBOR — (только в дискретном пространстве) сообщение будет доставлено случайно выбранному соседу

Пример:

people(0).sendToRandom("Hi!");

Выбор функции send() или deliver()

Разница между методами send() и deliver() заключается в следующем: send() планирует доставку/получение с помощью отдельного события, которое будет выполнено сразу после окончания текущего события (спустя нулевое модельное время), в то время, как deliver() выполняет доставку/получение прямо в теле текущего события. Если при обработке полученного сообщения получатели будут пытаться взаимодействовать с другими агентами, то использование метода deliver() может привести к нежелательным зацикливаниям, и поэтому рекомендуется использовать методsend().

Реакция на получение сообщения

У каждого агента, обитающего в среде, имеется видимый неудаляемый элемент connections, который содержит связи с контактами этого агента и задает настройки взаимодействия. Вы можете найти этот элемент над осью X в графическом редакторе:

Чтобы задать реакцию агента на получение сообщения

  1. Откройте диаграмму агента-получателя сообщения.
  2. Прокрутите страницу вверх, найдите и щелкните мышью элемент connections.
  3. Откройте секцию свойств Взаимодействие.
  4. Введите соответствующий код в свойстве Действие при получении сообщения. Полученное сообщение доступно здесь как msg (локальная переменная типа Object*), а агент-отправитель сообщения доступен как sender (если сообщение было послано централизованно с помощью среды, то эта переменная равна null).

* вы можете указать тип сообщения в свойстве Тип сообщения, расположенном чуть выше.

Как только сообщение будет доставлено агенту, будет выполнено Действие при получении сообщения, если оно для него задано.

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

Таким образом вы можете включить обработку сообщений диаграммой состояния. Если в ней имеются какие-либо активные переходы, которые запускаются получением сообщения, то они заработают (если полученное сообщение удовлетворяет требованиям, заданным в свойствах переходов).

Как мы можем улучшить эту статью?