Дискретное пространство

Агенты могут обитать в различных типах пространств. AnyLogic Advanced поддерживает два типа пространств: двумерное непрерывное и двумерное дискретное. AnyLogic Professional также поддерживает геопространственное ГИС пространство. 

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

  Чтобы сделать пространство среды дискретным

  1. На странице Дополнительные панели свойств среды выберите Дискретное из выпадающего списка Тип пространства.
  2. Затем перейдите на страницу свойств Агент класса активного объекта, задающего агента в Вашей модели, и также выберите опцию Дискретное из группы кнопок Тип пространства.

Размерности пространства (количество Строк и Столбцов) задаются на той же странице. Свойства Ширина и Высота используются для визуализации пространства. Например, если есть пространство 100x100 ячеек, шириной 500 и высотой 500, то каждая ячейка будет иметь на презентации размер 5x5.

Местоположение агента в дискретном пространстве определяется двумя координатами (строка, столбец) типа int.

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

Начальное расположение агентов. Шаблоны расположения

Начальное расположение агентов может задаваться либо в классе агента, либо "централизованно" средой. 

Чтобы задать начальное расположение агентов в среде

  1. На странице Дополнительные панели свойств среды выберите Тип расположения и, если Вы выберете не тип Задается пользователем, то установите флажок Применить при запуске.
  2. На странице Агент панели свойств класса агента установите флажок Начальное расположение задается средой

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

AnyLogic поддерживает следующие стандартные типы расположения агентов в дискретном пространстве:

Случайное (Environment.LAYOUT_RANDOM) 
агенты случайно распределяются по ячейкам (в каждой ячейке может находиться максимум один агент)

Упорядоченное (Environment.LAYOUT_ARRANGED) 
агенты упорядоченно распределяются по ячейкам строка за строкой (слева направо и сверху вниз)

Тип расположения агентов в пространстве может быть также изменен динамически во время выполнения модели посредством программного интерфейса среды, например, с помощью методов:

environment.setLayoutType( type ); //устанавливает принятый по умолчанию тип расположения, агенты при этом не изменяют своих местоположений
environment.applyLayout(); //производит перестановку агентов согласно текущему типу сети

Параметр type может принимать следующие значения: Environment.LAYOUT_RANDOM, Environment.LAYOUT_ARRANGED или Environment.LAYOUT_USER_DEFINED. Обратите внимание, что если количество агентов начнет превосходить количество ячеек, то возникнет ошибка.

  Чтобы задать начальное местоположение агента в классе агента
  1. На странице Агент панели свойств класса агента сбросьте флажок Начальное расположение задается средой.
  2. Задайте номера строки и столбца той ячейки, в которую будет помещен агент, в полях Строка и Столбец соответственно.

Анимация агентов

Презентация агента будет отображаться в точке (x,y), соответствующей координатам его ячейки относительно своего начала координат. Это означает, что если во время разработки модели презентация агента была помещена в в точку (50,100) на диаграмме класса объекта-владельца (например,.Main), и в данный момент времени агент располагается в ячейке с координатами (10, 20), а размер ячейки 5 x 5, то агент будет отображен в точке с координатами ( 50 + 10*5, 100 + 20 *5), то есть в точке (100, 200). Поэтому если Вы создадите какой-то визуальный фон для Вашего пространства, то нужно будет добавлять вложенные презентации объектов, моделирующих Ваших агентов, в верхний левый угол этого фонового рисунка.

Передвижение и перемещение "скачком"

Класс Agent предоставляет богатый программный интерфейс для перемещения агентов в двумерном дискретном пространстве:

int getR() - возвращает строку ячейки текущего расположения агента

int getC() - возвращает столбец ячейки текущего расположения агента

jumpToCell( int r, int c ) - помещает агента в ячейку с заданными координатами, если эта ячейка занята, то выдает ошибку

moveToNextCell( int direction ) - помещает агента в соседнюю ячейку, располагающуюся в заданном направлении от его текущей ячейки (возможные значения направлений (NORTH, SOUTH и т.д.) описаны ниже)

int[] findRandomEmptyCell() - возвращает координаты {строка, столбец} псевдослучайно выбранной свободной ячейки или null, если все ячейки заняты

boolean jumpToRandomEmptyCell() - помещает агента в псевдослучайно выбранную свободную ячейку, возвращает false, если все ячейки заняты

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

Параметр, задающий направление перемещения агента, может принимать следующие значения: Agent.NORTH, Agent.SOUTH, Agent.EAST, Agent.WEST, Agent.NORTHEAST, Agent.NORTHWEST, Agent.SOUTHEAST, Agent.SOUTHWEST (соответствующие северу, югу, востоку, западу, северо-востоку, северо-западу, юго-востоку и юго-западу).

Соседи. Типы соседства

У агента есть методы для получения информации о том, кто находится в соседних ячейках или в какой-то определенной ячейке:

Agent getAgentAtCell( int r, int c ) - возвращает агента, занимающего заданную ячейку, или null, если ячейка пуста

Agent getAgentNextToMe( int dir ) - возвращает агента из соседней ячейки в заданном направлении (см. константы, соответствующие возможным направлениям выше (NORTH, SOUTH и т.д.))

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

Mодель Мура (Environment.NEIGHBORHOOD_MOORE) - соседними считаются 8 ячеек, располагающиеся к северу, югу, востоку, западу, северо-востоку, северо-западу, юго-востоку и юго-западу от данной (NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)

Модель Евклида (Environment.NEIGHBORHOOD_EUCLIDEAN) - соседними считаются 4 ячейки, располагающиеся к северу, югу, востоку и западу от данной (NORTH, SOUTH, EAST и WEST).

  Чтобы задать тип соседства

  1. На странице Дополнительные панели свойств среды выберите нужный тип из выпадающего списка Тип соседства

В зависимости от выбранной модели соседства изменится результат работы метода:

Agent[] getNeighbors() - возвращает массив агентов, находящихся в соседних ячейках

а также методов send() и deliver(), если они вызываются с параметром ALL_NEIGHBORS или RANDOM_NEIGHBOR (см. Взаимодействие агентов).