Агенты могут обитать в различных типах пространств. AnyLogic Advanced поддерживает два типа пространств: двумерное непрерывное и двумерное дискретное. AnyLogic Professional также поддерживает геопространственное ГИС пространство.
Двумерное дискретное пространство представляет собой прямоугольный массив ячеек, полностью или частично занятых агентами. В одной ячейке может находиться не больше одного агента. Поддержка этого типа пространства в AnyLogic включает в себя возможности по распределению агентов по ячейкам, их перемещению в соседние или любые другие ячейки, определению того, какие агенты являются соседями (согласно выбранной модели соседства), нахождению свободных ячеек и т.д. Чтобы иметь доступ к этой функциональности, Вы должны объявить Ваш класс активного объекта агентом (см. Агент), и поместить Ваших агентов в среду с дискретным типом пространства.
Чтобы сделать пространство среды
дискретным
Размерности пространства (количество Строк и Столбцов) задаются на той же странице. Свойства Ширина и Высота используются для визуализации пространства. Например, если есть пространство 100x100 ячеек, шириной 500 и высотой 500, то каждая ячейка будет иметь на презентации размер 5x5.
Местоположение агента в дискретном пространстве определяется двумя координатами (строка, столбец) типа int.
При необходимости помещения агентов в пространство с функциональностью, отличной от имеющейся, Вы можете создать его самостоятельно на базе предлагаемого стандартного дискретного пространства. Например:
Начальное расположение агентов может задаваться либо в классе агента, либо "централизованно" средой.
Чтобы задать начальное
расположение агентов
в среде
Тип расположения Задается пользователем подразумевает, что Вы сами берете на себя ответственность за расположение агентов и напишете соответствующий код, например, в свойстве Действие при запуске объекта Main.
AnyLogic поддерживает следующие стандартные типы расположения агентов в дискретном пространстве:
|
Случайное
(Environment.LAYOUT_RANDOM) |
Упорядоченное
(Environment.LAYOUT_ARRANGED) |
Тип расположения агентов в пространстве может быть также изменен динамически во время выполнения модели посредством программного интерфейса среды, например, с помощью методов:
Параметр type может принимать следующие значения: Environment.LAYOUT_RANDOM, Environment.LAYOUT_ARRANGED или Environment.LAYOUT_USER_DEFINED. Обратите внимание, что если количество агентов начнет превосходить количество ячеек, то возникнет ошибка.
Чтобы задать начальное местоположение агента в
классе агентаПрезентация агента будет отображаться в точке (x,y), соответствующей координатам его ячейки относительно своего начала координат. Это означает, что если во время разработки модели презентация агента была помещена в в точку (50,100) на диаграмме класса объекта-владельца (например,.Main), и в данный момент времени агент располагается в ячейке с координатами (10, 20), а размер ячейки 5 x 5, то агент будет отображен в точке с координатами ( 50 + 10*5, 100 + 20 *5), то есть в точке (100, 200). Поэтому если Вы создадите какой-то визуальный фон для Вашего пространства, то нужно будет добавлять вложенные презентации объектов, моделирующих Ваших агентов, в верхний левый угол этого фонового рисунка.
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).
Чтобы
задать
тип соседства
В зависимости от выбранной модели соседства изменится результат работы метода:
Agent[] getNeighbors() - возвращает массив агентов, находящихся в соседних ячейках
а также методов send() и deliver(), если они вызываются с параметром ALL_NEIGHBORS или RANDOM_NEIGHBOR (см. Взаимодействие агентов).