Понимание и предсказание развития сложных систем является ключевой целью имитационного моделирования. Такие системы, конечно, можно исследовать по-разному, используя различные парадигмы при разработке модели.
В исследовании экономических и социальных систем широкое применение получил подход системной динамики, рассматривающий систему на высоком уровне абстракции. Как мы видели в главе 13, системная динамика абстрагируется от единичных событий. Причинно-следственные зависимости
параметров и характеристик системы являются основным средством выражения структуры и функционирования систем в концепции системной динамики. Обыкновенные дифференциальные уравнения описывают законы функционирования системы интегрально, агрегированно, как законы изменения взаимозависимых потоков вещества, денег, заказов, людей и т. п. При таком агрегировании могут быть упущены существенные особенности моделируемых явлений. Например, в "модели развития мира", построенной Ме-доузом в рамках парадигмы системной динамики [MD71] с целью моделирования сценариев развития человечества и его взаимоотношений с биосферой, обобщеннные переменные не учитывали особенности и традиции различных культур, за что эта модель подвергалась критике.
Агентный подход, напротив, использует совершенно другую парадигму моделирования: он основан на представлении именно единичных объектов системы, каждый со своим поведением и своими параметрами, на использовании единичных событий и реакций на них конкретных активных объектов. Глобальные законы поведения коллектива активных объектов "выводятся" в агентных моделях как интегральные характеристики индивидуальных поведений агентов и их взаимодействий.
В некоторых случаях эти подходы взаимозаменяемы. Рассмотрим пример того, как системно-динамическая модель может быть представлена в виде агентной модели.
Рисунок 16.1 является аналогом рис. 13.1, который представляет структуру зависимостей переменных и параметров в системно-динамической модели распространения инфекции. Очевидно, что вместо жидкости в накопителях можно рассматривать дискретные множества людей, нахождение конкретного человека в том или ином накопителе можно рассматривать как состояние
этого человека, а уровни жидкости в накопителях можно рассматривать как количества людей в соответствующих состояниях. Прохождение дискретного объекта между накопителями можно смоделировать изменением состояния объекта.
Для рис. 16.1 факт нахождения каждого индивидуального объекта в накопителях susceptible, infected И recovered МОЖНО представить соответствующим состоянием (здоровый, инфицированный, выздоровевший) этого объекта, а переходы объектов между накопителями естественно моделируются изменениями состояния объекта.
В рамках AnyLogic два этих подхода иногда взаимозаменяемы. Для построения агентной модели в AnyLogic по системно-динамической модели, следует системно-динамическую модель представить как набор накопителей, интенсивность потоков между которыми определяется функциональными зависимостями между параметрами модели. В агентной модели в стейтчарте соответствующего класса активных объектов (агентов) предусмотрим свое состояние для каждого накопителя. В модели распространения инфекций следует определить стейтчарт с тремя состояниями: "здоров", "инфицирован" и "выздоровел".
Рассмотрим, как интенсивность потоков между накопителями в системно-динамической модели может быть выражена переходами стейтчартов из одного состояния в другое в агентной модели. Пусть, например, известно, что интенсивность потока такова, что за единичный интервал времени количество объектов, которые переходят из накопителя а в накопитель в, пропорционально числу объектов в накопителе а, причем коэффициент пропорциональности равен р. Это означает, что за единицу времени часть р агентов переходит из состояния а в состояние в, и эта часть как раз составляет р. Это именно то правило, которое используется в модели распространения инфекции (рис. 16.1): число заболевших в единицу времени пропорционально количеству оставшихся неинфицированных людей, а число выздоровевших пропорционально числу больных:
R=susceptible*infection_rate, a Rl=infected*recovery_rate.
Как определить переход между состояниями агента в случае, когда каждый раз по прошествии единичного интервала времени р-я часть агентов переходит из одного состояния в другое? Рисунок 16.2 показывает два варианта возможной реализации такого перехода.
Самый простой путь — это построить синхронный стейтчарт, в котором на каждом единичном шаге по времени каждый агент с вероятностью р изменит свое состояние. При этом в массе агентов именно р-я их часть за единицу времени перейдет в состояние в (конечно, можно одновременно уменьшить шаг по времени и вероятность перехода). Второй путь, более эффективный с вычислительной точки зрения, состоит в том, что для каждого агента время перехода из состояния а в состояние в рассчитывается
заранее. В нашем случае нетрудно видеть, что если каждый агент независимо от других агентов за единицу времени должен перейти с вероятностью р из состояния а в состояние в, то время нахождения его в состоянии а распределено по экспоненциальному закону с параметром р. Именно это показано на рис. 16.2.
В общем случае всегда можно найти достаточно простой метод предварительного определения условия, при котором каждый агент переходит из состояния в состояние, а вся совокупность агентов ведет себя в соответствии с системно-динамической моделью, в которой изменение состояний множества дискретных объектов в потоке представлено накопителями. Это условие может затем пересчитываться. Более подробно данный вопрос рассматривается в работе [АБ04]. Приход нового объекта из внешнего источника в системно-динамической модели можно реализовать как порождение нового агента, попадание объекта в сток естественно реализуется как уничтожение агента. Соответствующие операции нами обсуждались ранее в главе 15.