Агенты, обитающие в одной среде, могут взаимодействовать, посылая друг другу сообщения.
Вы можете посылать сообщения вызовами любой из следующих функций.
- Отправление сообщений: 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 receive(Object msg) Мгновенно доставляет сообщение этому агенту. В качестве отправителя сообщения в этом случае задано null.
msg — сообщение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() выполняет доставку/получение прямо в теле текущего события. Если при обработке полученного сообщения получатели будут пытаться взаимодействовать с другими агентами, то использование метода deliver() может привести к нежелательным зацикливаниям, и поэтому рекомендуется использовать метод send().
У каждого агента, обитающего в среде, имеется видимый неудаляемый элемент connections, который содержит связи с контактами этого агента и задает настройки взаимодействия. Вы можете найти этот элемент над осью X в графическом редакторе:
Чтобы задать реакцию агента на получение сообщения
- Откройте диаграмму агента-получателя сообщения.
- Прокрутите страницу вверх, найдите и щелкните мышью элемент connections.
- Откройте секцию свойств Взаимодействие.
- Введите соответствующий код в свойстве Действие при получении сообщения. Полученное сообщение доступно здесь как msg (локальная переменная типа Object*), а агент-отправитель сообщения доступен как sender (если сообщение было послано централизованно с помощью среды, то эта переменная равна null).
* вы можете указать тип сообщения в свойстве Тип сообщения, расположенном чуть выше.
Как только сообщение будет доставлено агенту, будет выполнено Действие при получении сообщения, если оно для него задано.
Если, например, вы хотите перенаправить сообщение в диаграмму состояний агента, вам нужно будет выбрать эту диаграмму в таблице Перенаправлять сообщение в:
Таким образом вы можете включить обработку сообщений диаграммой состояния. Если в ней имеются какие-либо активные переходы, которые запускаются получением сообщения, то они заработают (если полученное сообщение удовлетворяет требованиям, заданным в свойствах переходов).
-
Как мы можем улучшить эту статью?
-