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

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

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

for( Person p : people )
    p.step();

где Person - это тип агента ваших агентов, people - их популяция диаграммы Main, а step - функция типа Person.

AnyLogic предоставляет встроенную поддержку синхронных агентных моделей. Предположим, что в вашей модели есть тип агента Person для агентов, среда задана на диаграмме Main и указанный вложенный объект people принадлежит этой среде.

  Чтобы добавить синхронизацию в агентную модель

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

В моменты времени 0, 1, 2, 3, ... будет гарантировано выполнение событий в следующем порядке: 

  1. Выполняется Действие перед выполнением шага среды.
  2. У всех агентов выполняются Действия перед выполнением шага (в каком-то определенном порядке).
  3. В том же самом порядке у всех агентов выполняются Действия на шаге.
  4. Выполняется Действие после выполнения шага среды.

Обычно две стадии действия среды используются для подготовки модели к шагу и для "обертывания" шага, например, для обновления статистики. Две стадии действия агента используются для сбора информации и для принятия некоторых решений. Например, в известной игре Жизнь каждая ячейка считает количество живых соседей в коде Действия перед выполнением шага и изменяет свое состояние в коде Действия на шаге.

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