Среда

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

 Чтобы добавить среду

  1. Перетащите элемент Среда  из палитры Основная на диаграмму класса активного объекта.
Основные свойства

Имя – Имя объекта. Имя используется для идентификации объекта и доступа к нему из кода.
Это имя должно быть указано в свойстве Среда  вложенного объекта, моделирующего тех агентов, которых Вы хотите добавить в эту среду.

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

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

На презентации – Если опция выбрана, то этот объект "среда" будет отображаться на презентации во время выполнения модели.

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

Длительность шага (в единицах мод. времени) – [Доступно, если выбрана опция Выполнять шаги] Здесь пользователь может задать длительность дискретного шага для синхронного агентного моделирования (по умолчанию длительность равна 1 единице модельного времени). 

Действие перед выполнением шага – [Доступно, если выбрана опция Выполнять шаги] Код, выполняемый перед тем, как все агенты выполнят свои шаги.

Действие после выполнения шага – [Доступно, если выбрана опция Выполнять шаги] Код, выполняемый после того, как все агенты выполнят свои шаги.

Дополнительные свойства

Тип пространства – Группа кнопок, позволяющая задавать тип пространства, в котором будут обитать агенты.

Непрерывное2DНепрерывное пространство. Размерность пространства задается свойствами Ширина и Высота. В непрерывном пространстве есть возможность изменять местоположение агента и получать информацию о его текущем местоположении, перемещать агента с заданной скоростью из одного места в другое, выполнять действия по его прибытии в место назначения, рисовать анимацию (статического или движущегося) агента, устанавливать соединения согласно выбранному шаблону расположения агентов, и многие другие возможности. Местоположение агента в двумерном непрерывном пространстве задается двумя координатами (x,y) типа double.
Дискретное2DДискретное пространство. Двумерное дискретное пространство представляет собой прямоугольный массив ячеек, полностью или частично занятых агентами. В одной ячейке может находиться не больше одного агента. Поддержка этого типа пространства в AnyLogic включает в себя возможности по распределению агентов по ячейкам, их перемещению в соседние или любые другие ячейки, определению того, какие агенты являются соседями (согласно выбранной модели соседства), нахождению свободных ячеек и т.д.
ГИСПространство ГИС. ГИС пространство позволяет размещать агентов в геопространственной среде, заданной с помощью карты ГИС. Поддержка ГИС пространства  включает возможности помещения агента в новое место, получения информации о текущем местоположении, перемещения агента из текущего местоположения в новое с заданной скоростью, выполненяи определенного действия по прибытии, отображения анимации агента (статической или движущейся), установления связей между агентами в зависимости от их расположения и многое другое.

Карта ГИС - [Отображается, если выбрано ГИС пространство] Имя карты ГИС, задающей географическое пространство среды.

Ширина – [Доступно, если выбрано Непрерывное2D, Непрерывное3D или Дискретное2D пространство] Горизонтальная размерность области, визуально представляющей пространство на презентации (в пикселах).
В дискретном пространстве ширина ячейки высчитывается путем деления заданной Ширины на число Столбцов пространства.

Высота – [Доступно, если выбрано Непрерывное2D, Непрерывное3D или Дискретное2D пространство] Вертикальная размерность области, визуально представляющей пространство на презентации (в пикселах).
В дискретном пространстве высота ячейки высчитывается путем деления заданной Высоты на число Строк пространства.

Столбцы – [Доступно, если выбрано Дискретное2D пространство] Количество столбцов в дискретном пространстве.

Строки – [Доступно, если выбрано Дискретное2D пространство] Количество строк в дискретном пространстве.

Тип соседства – [Доступно, если выбрано Дискретное2D пространство] Задает модель соседства, определяющую, какие именно агенты будут считаться соседями агента в дискретном пространстве. Есть две модели соседства:

Мурово  - Соседями считаются агенты, располагающиеся в 8 соседних ячейках (к северу (Agent.NORTH), югу (Agent.SOUTH), востоку (Agent.EAST), западу (Agent.WEST), северо-востоку (Agent.NORTHEAST), северо-западу (Agent.NORTHWEST), юго-востоку (Agent.SOUTHEAST) и юго-западу (Agent.SOUTHWEST) от данной).
Евклидово  - Соседями считаются агенты, располагающиеся в 4 соседних ячейках (к северу (Agent.NORTH), югу (Agent.SOUTH), востоку (Agent.EAST) и западу (Agent.WEST) от данной).

Тип расположения – [Доступно, если выбрано Дискретное2D или Непрерывное2D пространство] Задает тип расположения агентов (то, как агенты будут изначально расположены в пространстве). 
Если Вы хотите, чтобы агенты были расставлены по своим местам в соответствии с выбранным типом их расположения прямо при запуске модели, то установите флажок Применить при запуске справа.

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

Задается пользователем - при выборе этой опции пользователь должен будет сам расположить агентов в пространстве, например, в Действии при запуске корневого класса эксперимента.

Случайное - агенты случайно и равномерно распределяются в пределах размерностей пространства

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

Кольцо - агенты равномерно распределяются по кольцу, диаметр которого меньше самой маленькой размерности пространства

Пружинящая масса - агенты располагаются аналогично системе с пружинящими массами, где агенты представляют собой массы, а их соединения - пружины. Этот тип зависит от выбранного типа сети

Тип сети – [Доступно, если выбрано Непрерывное2D, Непрерывное3D или Дискретное2D пространство] Тип сети, определящий, между какими агентами будут устанавливаться связи. Ни один тип сети не требует того, чтобы агенты имели только те связи, которые были установлены данным типом сети. Вы можете самостоятельно установить любое количество дополнительных связей между агентами.
Если Вы хотите, чтобы сеть создавалась прямо при запуске модели, то установите флажок Применить при запуске справа.

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

Задается пользователем - при выборе этой опции пользователь должен будет сам установить связи между агентами, например, в Действии при запуске корневого класса эксперимента.
Случайное - агенты соединяются случайно, у каждого агента устанавливается заданное количество связейt.
Согласно расстоянию - друг с другом соединяются те агенты, расстояние между которыми не больше заданного  радиуса соединения (только в непрерывном пространстве).
Решеточно упорядоченное кольцо - связи агентов образуют кольцо, в котором каждый агент соединяется с заданным количеством ближайших агентов.
Малый мир - представляет собой решеточно упорядоченное кольцо, где некоторые связи были разорваны и установлены с удаленными агентами.
Безразмерная - некоторые агенты являются "хабами" (или концентраторами) с множествами соединений, а некоторые -  "отшельниками" с небольшим числом соединений. Подход описан в научной статье Barabasi, A. L. and R. Albert. 1999. Emergence of scaling in random networks. Science 286(5439): 509-512.

Кол-во связей у агента – [Доступно, если Тип сети: СлучайноеМалый мир или Решеточно упорядоченное кольцо] Среднее (или точное) количество связей у агента.

Радиус соединения – [Доступно, если Тип сети: Согласно расстоянию] Задает радиус области соединения для агента. Агент будет соединен со всеми агентами, которые будут располагаться от данного агента на расстоянии, не превосходящим заданный радиус.

Доля соседей – [Доступно, если Тип сети: Малый мир] Параметр типа сети Малый мир.

M – [Доступно, если Тип сети: Безразмерная] Параметр типа сети Безразмерная (начальное количество концентраторов ("хабов")).

  Чтобы задать среду для агентов

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

Доступ к агентам из среды

Среда обеспечивает унифицированный доступ (например, для посылки сообщения какому-то агенту) ко всем агентам, обитающим в данной среде (не имеет значения, принадлежат ли агенты одному и тому же реплицированному (или нереплицированному) вложенному активному объекту). Программный интерфейс следующий:

class AgentCollection extends AbstractCollection<Agent> - специальный класс коллекции, позволяющий последовательно проходить по всем агентам и находить агента по его номеру

AgentCollection getAgentCollection() - возвращает коллекцию всех агентов, населяющих среду

size() - возвращает количество агентов, населяющих среду

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

deliverToAll( Object msg ) - немедленно доставляет сообщение всем агентам, населяющих среду

deliverToRandom( Object msg ) - немедленно доставляет сообщение случайно выбранному агенту

Для того, чтобы выполнить с каждым агентом какое-то действие, Вам нужно будет написать подобный код:

for( Agent a : environment.getAgentCollection() )
a.<действие>;

Синхронизация агентов

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

Пространство

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

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

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

Сети

Среда может создавать сети разных типов. Соответствующие свойства и программный интерфейс описаны в разделе Связи агентов и сети.