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

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

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

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

Отправление сообщений: 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)

Мгновенно доставляет сообщение случайному агенту в среде, если в ней имеются другие агенты.

Параметр:
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).

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

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

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


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