AnyLogic
Развернуть
Размер шрифта

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

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

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

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

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

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

  • double spaceHeight() — Возвращает высоту пространства.
  • double spaceWidth() — Возвращает ширину пространства.
  • double spaceCellHeight() — Возвращает высоту ячейки.
  • double spaceCellWidth() — Возвращает ширину ячейки.
  • int spaceColumns() — Возвращает количество столбцов в пространстве.
  • int spaceRows() — Возвращает количество строк в пространстве.

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

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

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

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

  1. В панели Проекты щелкните тип агента, в котором обитают ваши агенты (например, Свойства этого типа агентов.
  2. В секции Пространство и сеть свойств типа агента выберите Тип расположения и, если вы выберете не тип Задается пользователем, то установите флажок Применить при запуске.

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

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

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

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

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

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

Параметр type может принимать следующие значения:

Environment.LAYOUT_RANDOM
Environment.LAYOUT_ARRANGED
Environment.LAYOUT_USER_DEFINED

Обратите внимание, что если количество агентов начнет превосходить количество ячеек, то возникнет ошибка.

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

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

Вы можете задать начальное положение агента с помощью этой функции:

void setCell(int r, int c) — Помещает агента в заданную ячейку. Эта функция используется только для задания начального положения. Агент помещается в двумерное дискретное пространство, предполагается, что эта ячейка должна быть пуста, и агенту еще не было назначено местоположение.

r — строка ячейки
c — столбец ячейки

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

Параметр, задающий направление перемещения агента, может принимать следующие значения:

Agent.NORTH
Agent.SOUTH
Agent.EAST
Agent.WEST
Agent.NORTHEAST
Agent.NORTHWEST
Agent.SOUTHEAST
Agent.SOUTHWEST

(соответствующие северу, югу, востоку, западу, северо-востоку, северо-западу, юго-востоку и юго-западу).

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

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

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

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

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

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

Agent getAgentNextToMe(CellDirection dir) — возвращает агента из соседней ячейки в заданном направлении (NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)

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

  1. В панели Проекты щелкните тип агента, в котором обитают ваши агенты (например, Свойства этого типа агентов.
  2. Откройте секцию Пространство и сеть.
  3. Выберите нужный тип из выпадающего списка Тип соседства.

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

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

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

Дополнительно

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

  • Если вы хотите задать пространство в виде тора, а не в виде прямоугольника, то вам нужно будет переопределить методы, выполняющие перемещение и агентов и определение соседних ячеек
  • Если вам нужно связать с каждой ячейкой дополнительную информацию (такую, как, например, высота), то вам нужно завести специальный двумерный массив (double[][] altitude) в агенте верхнего уровня и позволить вашим агентам работать с содержимым этого массива во время выполнения модели.
Как мы можем улучшить эту статью?