Задание связей между агентами

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

Тем не менее, вам может понадобиться задать больше сетей контаков или отдельные связи.

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

Person отец
Person мать
Person супруг
<коллекция типа Person> дети

Возможно, вам необходимо, чтобы ваш агент взиамодействовал только с теми агентами, с которыми он связан. Связь может быть одиночной или коллекцией связей, однонаправленной или двунаправленной.

Однонаправленные и двунаправленные связи

Вы можете установить контакты агента с помощью элемента Связь с агентами.

Чтобы создать новую связь с агентами

  1. Перетащите элемент Связь с агентами из палитры Основная на диаграмму агента.
  2. Щелкните мышью связь и в открывшейся панели Свойства укажите Имя связи, например, father.
  3. Выберите, будет ли эта связь одиночной (опция Одиночная связь) или множественной (опция Коллекция связей). Вы заметите, что вид иконки связи меняется в зависимости от выбранной опции.
  4. Вы можете задать отображение связей, соединяющих ваши агенты на анимации модели. Откройте секцию свойств Анимация и выберите опцию Рисовать связь соединения агентов. Далее настройте визуальное отображение связей с помощью свойств: выберите, хотите ли вы рисовать связи позади или поверх агентов, укажите цвет, толщину, стиль линии (сплошная, точечная, пунктирная) и тип и местоположение стрелки.

Свойства

Основные свойства

Имя – Имя связи.

Отображать имя – Если опция выбрана, имя связи отображается на диаграмме агента.

Исключить – Если опция выбрана, связь будет исключена из модели.

Видимость – Если опция выбрана, то фигура будет отображаться на анимации во время исполнения модели.

Тип агента – Выберите тип агента.

Коллекция связей – Если опция выбрана, то свзяь будет множественной: она будет соединять агента с несколькими другими агентами.

Одиночная связь – Если опция выбрана, связь является одиночной: она соединяет агента только с одним другим агентом.

Сделать двунаправленной/однонаправленной – Щелкните эту кнопку, если хотите сделать связь двунаправленной/однонаправленной. Пример двунаправленной связи: друг. Пример однонаправленной связи: мать.

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

Тип сообщения Здесь вы можете указать тип сообщений, которые будут получать эти связи. Вам это может понадобиться, чтобы иметь доступ к типу сообщений из кода в поле Действие при получении сообщения.

Вы можете выбрать один из часто используемых типов (int, double, boolean, String) из выпадающего списка. Но если ваши сообщения другого класса Java, выберите опцию Другой и укажите тип сообщений в поле справа.

Действие при получении сообщения – Код, выполняемый, когда агент получает сообщение от другого агента (или, возможно, от себя). Отправитель сообщения доступен в коде как sender, а полученное сообщение - как msg.

Перенаправлять сообщение в – Здесь вы можете указать диаграмму состояний получателя сообщения, которую вы хотели бы использовать для обработки сообщения. Для этого поставьте флажок напротив той диаграммы, которой вы хотите обрабатывать сообщения.

Анимация

Вы можете задать отображение связей, соединяющих ваши агенты на анимации модели. Откройте секцию свойств Анимация и выберите опцию Рисовать связь соединения агентов. Далее настройте визуальное отображение связей с помощью свойств: выберите, хотите ли вы рисовать связи позади или поверх агентов, укажите цвет, толщину, стиль линии (сплошная, точечная, пунктирная) и тип и местоположение стрелки.

Управление связями динамически

После того, как вы создали связь с агентами, вы должны указать эту связь в агентах.

Эти ссылки могут быть указаны при создании агентов или динамически во время имитации. Вы можете управлять связями "ручным методом" через функции агента, см. дополнительную информацию.

AnyLogic предоставляет следующие методы для изменения связей между агентами. Они различаются по типу связи:

Одиночная связь:

Agent getConnectedAgent() - возвращает связанного агента

connectTo( Agent a ) - добавляет указанного агента в список связей этого агента, и наоборот

boolean disconnect() - отсоединяет этого агента от агента, связанного с ним в данный момент

Коллекция связей:

LinkedList getConnections() - возвращает список всех связанных агентов или null, если связей установлено не было

int getConnectionsNumber() - возвращает количество связанных агентов

boolean isConnectedTo( Agent a ) - проверяет, связан ли этот агент с указанным агентом

Agent getConnectedAgent( int index ) - возвращает связанного агента с заданным номером index

Agent getRandomConnectedAgent() - возвращает одного случайно выбранного связанного агента

connectTo( Agent a ) - добавляет указанного агента в список связей этого агента, и наоборот

boolean disconnectFrom( Agent a ) - отсоединяет этого агента от указанного агента, возвращает false, если они не были связаны

disconnectFromAll() - отсоединяет этого агента от всех других агентов

Пример:

father.connectTo(people(0));

Отправление сообщений через связь

Создав и задав связь, вы можете посылать сообщения связанным агентам.

Одиночная связь:

send(Object msg) – отправляет сообщения связанному агенту

Коллекция связей:

send(Object msg, Agent dest) – отправляет сообщение по указанной связи

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

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

Пример:

Например, чтобы отправить сообщение "Hi!" связи с именем father, вызовите father.send("Hi!")