Имитационное моделирование на базе AnyLogic

Модель аэропорта. Часть 2

В лекции представлен практический процесс усложнения имитационной модели аэропорта в среде AnyLogic. Рассматривается пошаговое добавление новых элементов: пунктов досмотра с очередями, зоны ожидания у выхода на посадку и, наконец, механики распространения инфекции среди пассажиров. Логика изложения строится от геометрического размещения объектов и настройки времени обслуживания к программированию агентной логики. Кульминацией становится создание стейтчарта (диаграммы состояний) и написание кода, который заставляет «зараженных» агентов влиять на окружающих, что приводит к динамическому изменению цвета агентов и визуализации эпидемиологического процесса.

Основные мысли

В результате изучения лекции слушатель будет способен:
1. Воспроизвести последовательность добавления сервисных блоков с очередями для моделирования пунктов досмотра.
2. Объяснить назначение элемента «многоугольная область» и блока «Ожидание» для имитации зоны сбора пассажиров.
3. Применить переменную агента со случайным распределением для задания вероятностных характеристик (например, 5% инфицированных).
4. Настроить раздельное отображение агента в 2D- и 3D-анимации с динамическим цветом в зависимости от его состояния.
5. Разработать стейтчарт (диаграмму состояний) с переходами по условию для агента.
6. Написать Java-код внутри перехода стейтчарта для циклического воздействия на соседних агентов в заданном радиусе.
7. Создать логику накопления воздействия через получение сообщений, ведущую к изменению состояния агента.
8. Проанализировать влияние графического рендеринга в реальном времени на производительность модели.
Показывать лекцию целиком
Краткое изложение
 Добавление пунктов досмотра

Теперь мы дополняем картину пунктами досмотра. Это снова сервис с очередями. Нам нужно поместить точки обслуживания в металлодетектор (металлорамку), который находится на схеме. Мы разворачиваем объект сервиса и размещаем его в центре металлодетектора.

Затем отрисовываем очередь к этому сервису. Очередь одна, идет змейкой. Немного укорачиваем выход из нее, чтобы пешеходы могли нормально перемещаться. Металлодетектор и рентгеновский сканер добавляем как объекты анимации, которые будут визуализировать процесс досмотра.

Теперь нужно настроить обслуживание на втором уровне. Переименовываем очередь в Security Check Queue. После нее добавляем новый сервис с названием Security Check Service. Время обслуживания задаем равномерным распределением (uniform) от 15 до 120 секунд. В минутах это составляет диапазон от 0.25 до 2, что мы и указываем в свойствах.

Запускаем модель в 3D, чтобы проверить работу. Видно, как персонажи выстраиваются в очередь, проходят через металлодетектор и двигаются дальше. Очередь формируется корректно, модель работает.

Создание зоны ожидания у гейта

Это предпоследняя фаза. Мы нарисуем область ожидания возле выхода на посадку (гейта). Для этого используем элемент «Многоугольная область» (Polygonal Area). Это геометрический объект, который моделирует место, где люди ждут объявления посадки на рейс. Расположим его слева от колонны, так как выход у нас левый.

После того как пассажир прошел все проверки, он должен попасть в эту зону. Добавляем в процесс элемент «Ожидание» (Wait). В свойстве «Область» указываем нашу созданную зону area. Время задержки ставим конкретным значением — 2 часа (например, из-за задержки рейса).

Запускаем модель, чтобы увидеть, как люди собираются в зоне ожидания. Поскольку время задержки 2 часа, а время моделирования ограничено, мы уменьшаем его до 30 минут для теста. При этом важно помнить, что если мы меняем время ожидания, то при дальнейших настройках (например, инкубационного периода инфекции) это нужно будет синхронизировать.

Моделирование распространения инфекции

Это последняя фаза. Мы зададим логику заражения.

1. Создание переменной для заражения
В классе агента Passenger создаем переменную Infection. Тип значения — double (дробное число). Инициализируем ее случайным распределением: randomTrue(0.05). Это значит, что с вероятностью 5% агент получит значение 1 (инфицирован), в остальных случаях — 0 (здоров).

2. Настройка отображения агента
В свойствах фигуры агента разделяем отображение для 2D и 3D.

• В 3D будет отображаться фигурка человека.
• В 2D мы рисуем овал (кружок) в начале координат с радиусом 3.

Цвет заливки овала в 2D делаем динамическим в зависимости от статуса заражения. Используем функцию lerpColor, которая возвращает цвет на основе линейной интерполяции. Если Infection == 0, цвет будет голубым. Если Infection == 1, цвет будет красным. Так как у нас только два значения, промежуточных цветов не будет, но функция удобна для связи цвета и состояния.

3. Создание стейтчарта агента (Statechart)

Возвращаемся к агенту Passenger и рисуем его стейтчарт (диаграмму состояний). Добавляем два основных состояния и переход между ними.

• Первое состояние: Susceptible (Восприимчивый). Это начальное состояние для всех неинфицированных.
• Второе состояние: Infected (Зараженный).
• Переход: между состояниями срабатывает по условию (Condition). Условие: Infection > 0.5. Пока значение Infection меньше или равно 0.5, агент считается восприимчивым, как только превышает — становится зараженным.

4. Логика заражения других агентов

К состоянию «Зараженный» добавляем внутренний переход (Internal Transition). Называем его Infect Others.

• Срабатывает по тайм-ауту (Timeout) каждую 1 секунду.
• В действии пишем Java-код. Мы используем цикл for, чтобы пробежаться по всем агентам в радиусе 30 от текущего зараженного агента. Для этого используем функцию getNeighbors(30). Каждому агенту p, попавшему в этот радиус, отправляется сообщение с текстом "infection".

Фактически, зараженный агент каждую секунду «облучает» всех окружающих его пассажиров, отправляя им сообщения.

5. Обработка полученного сообщения

В свойствах агента переходим в раздел «Соединения» (Connections) и настраиваем «Действия при получении сообщения» (On message received). Здесь мы пишем код, который увеличивает значение переменной Infection на 0.001 за каждое полученное сообщение.

Таким образом, если рядом с зараженным агентом кто-то стоит, он будет получать дозу инфекции каждую секунду. Постепенно его значение Infection накопится, превысит порог 0.5, и он сам перейдет в состояние «Зараженный», начав заражать других.

Проверка и результат

Запускаем модель. Изначально все агенты синие. Постепенно появляются первые красные (5%). Мы наблюдаем, как красные точки начинают влиять на синих вокруг себя. Цвета агентов меняются, и красный цвет начинает распространяться по зоне ожидания. Инфекция визуализируется в реальном времени.

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

Краткие итоги

Построение имитационной модели в данной работе демонстрирует восходящий принцип разработки: от статичного размещения объектов к программированию сложного, эмерджентного поведения системы. Ключевая ценность изложенного подхода заключается в связывании физического пространства и логики агентов. Сначала решается инженерная задача по организации потоков — корректное расположение зон обслуживания и очередей задает топологию процесса, которая сама по себе может выявить «узкие горлышки» в пропускной способности аэропорта. Однако качественный скачок в аналитических возможностях происходит при внедрении агентной логики на примере распространения инфекции. Здесь демонстрируется техника, превращающая модель из дискретно-событийной в агентную. Использование стейтчартов и механизма обмена сообщениями между агентами в заданном радиусе позволяет моделировать нелинейные процессы, где поведение толпы не задано извне, а является результатом множества локальных взаимодействий. Важен сам принцип накопления воздействия: переменная агента меняется не скачкообразно, а инкрементально, под влиянием длительного контакта, что гораздо ближе к реальной эпидемиологии, чем мгновенная передача состояния. С практической точки зрения, такая модель является инструментом для сценарного анализа. Изменяя время ожидания в зоне посадки, радиус взаимодействия или интенсивность «облучения», можно количественно оценить, как архитектурные и операционные решения влияют на эпидемиологическую безопасность. Это показывает, что ценность модели — не в финальной анимации, а в способности стать «цифровым полигоном» для проверки гипотез, которые невозможно или неэтично тестировать в реальности. Наконец, затронута и инженерная проблема визуализации: разделение 2D- и 3D-графики с помощью функции lerpColor — это не просто эстетика, а способ создавать эффективные и информативные панели мониторинга, которые не перегружают вычислительные ресурсы при масштабировании модели.
Настройка пунктов досмотра

Модель аэропорта усложняется добавлением пунктов досмотра. Для этого используется блок Service с очередью. Сервис нужно геометрически разместить в области металлодетектора и отрисовать для него очередь. Для сервиса досмотра задается название Security Check Service, а время обслуживания определяется равномерным распределением (uniform) от 15 до 120 секунд (или от 0.25 до 2 минут). Проверка в 3D-окне показывает корректное формирование очереди и движение агентов.

Создание зоны ожидания у гейта

Для моделирования места, где пассажиры ждут посадки, используется элемент «Многоугольная область» (Polygonal Area). Она рисуется в нужной части схемы. Затем в процесс добавляется блок «Ожидание» (Wait). В его свойствах указывается созданная область area и задается время задержки — 2 часа. Это заставляет агентов собираться в зоне и находиться там заданное время.

Реализация логики заражения

Ключевой этап — создание агентной модели распространения инфекции.

1. Переменная агента.
В класс Passenger добавляется переменная Infection типа double. При создании агента она инициализируется значением randomTrue(0.05). Это дает 5% изначально инфицированных агентов (значение 1) и 95% здоровых (значение 0).

2. Динамическая анимация.
Настраивается раздельная графика. В 3D используется фигурка человека, а для 2D рисуется овал с динамическим цветом заливки. Используется функция lerpColor.

• Если Infection == 0, цвет заливки голубой.
• Если Infection == 1, цвет заливки красный.

3. Стейтчарт (Statechart) агента.
Создается диаграмма состояний с двумя основными блоками:
• Susceptible (Восприимчивый) — начальное состояние для здоровых.
• Infected (Зараженный).
Переход между ними срабатывает по условию (Condition): Infection > 0.5.

4. Механизм заражения.
В состоянии Infected создается внутренний переход Infect Others, который срабатывает по тайм-ауту каждую 1 секунду. В его действии написан Java-код с циклом for, который перебирает всех агентов, полученных с помощью метода getNeighbors(30), и отправляет каждому сообщение "infection".

5. Накопление заражения.
В свойствах агента в разделе «Соединения» (Connections) настраивается реакция на получение сообщения. При получении сообщения "infection" переменная Infection увеличивается на 0.001. Здоровый агент, долго находящийся рядом с зараженным, накапливает «дозу» и, когда значение Infection превысит 0.5, его стейтчарт переводит его в состояние Infected. После этого он сам начинает заражать других.

Проверка и результат.
При запуске модели изначально почти все агенты синие. Затем появляются первые красные и начинают воздействовать на окружение. Красный цвет постепенно распространяется по скоплению агентов в зоне ожидания. Выявлена проблема производительности: сильное масштабирование 3D-вида вызывает интенсивный рендеринг, замедление симуляции и может привести к переполнению памяти, поэтому для наблюдения за процессом лучше использовать вид без большого увеличения.

Выводы

1. Очереди в сервисах типа «металлодетектор» моделируются с помощью стандартных блоков библиотеки моделирования процессов.
2. Время обслуживания задается вероятностным распределением, например равномерным (uniform), отражая вариативность реальных операций.
3. Зона ожидания пассажиров перед гейтом моделируется с помощью элемента «Многоугольная область» и блока «Ожидание» (Wait).
4. Задание конкретного времени задержки в блоке Wait имитирует фиксированные события, такие как ожидание посадки.
5. Свойства агентов, например склонность к инфекции, задаются через переменные с вероятностной инициализацией (randomTrue).
6. Разделение анимации агента на 2D (схема) и 3D (реалистичный вид) оптимизирует восприятие и производительность модели.
7. Функция lerpColor позволяет динамически менять цвет фигуры агента в зависимости от значения любой его непрерывной переменной.
8. Стейтчарт (диаграмма состояний) является основным инструментом для моделирования смены состояний агента под воздействием условий.
9. Логика заражения реализуется через отправку сообщений соседним агентам, что запускает у них процесс накопления «дозы» инфекции.
10. Инкрементальное изменение внутренней переменной при получении множества сообщений симулирует эффект накопления при длительном контакте.
11. Интенсивный рендеринг графики, особенно в 3D, напрямую влияет на скорость симуляции и потребление памяти.
12. Сочетание процессного моделирования и агентной логики позволяет создавать многоуровневые модели сложных социотехнических систем.

Вопросы для самопроверки

1. Какой тип распределения и с какими параметрами используется для моделирования времени прохождения пункта досмотра?
2. Для чего в модели нужен элемент «Многоугольная область» и с каким блоком процесса он взаимодействует?
3. Каким образом задается и инициализируется переменная, определяющая статус заражения пассажира?
4. В чем преимущество разделения 2D- и 3D-графики для одного агента?
5. Какую функцию и с какими аргументами используют для динамической смены цвета заливки в зависимости от статуса агента?
6. Какие состояния предусмотрены в стейтчарте агента для моделирования заражения и как осуществляется переход между ними?
7. Каким образом зараженный агент циклически воздействует на окружающих?
8. Какую операцию выполняет здоровый агент при получении сообщения от зараженного?
9. Почему для изменения состояния агента используется условие Infection > 0.5, а не проверка на точное равенство единице?
10. Почему агент становится зараженным не мгновенно после контакта, а с задержкой?
11. Какие негативные последствия для производительности модели возникают при сильном масштабировании 3D-вида?
12. Зачем может понадобиться корректировать время инкубационного периода при изменении времени ожидания в модели?
Вернуться к учебному плану