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

Иерархическое моделирование в системной динамике

AnyLogic позволяет не только разделить структуру сложной модели на секторы, но и предоставляет все преимущества объектно-ориентированного подхода в Системной динамике. Вы можете создавать сложные модели с внутренней иерархией, помещая логически обособленные части диаграммы потоков и накопителей в различные типы агентов и вынося в интерфейс объекта лишь определенный набор переменных, которые будут связывать эти отдельные части.

Компоненты Системной динамики можно поместить в типы агентов AnyLogic, параметризовать, сделать их частью более сложных структур и многократно использовать при необходимости.

Демо-модель: Population Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

На примере модели ниже видно, как можно иерархически структурировать модель в системной динамике.

В этой модели две логические части, каждая из которых сфокусирована на определенном аспекте: жилищный сектор и население. Для каждой части в отдельных типах агентов нарисованы отдельные диаграммы потоков и накопителей в разных типах агентов: HousingSector и PopulationSector.

Диаграмма HousingSector

Диаграмма PopulationSector

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

«Интерфейсом» для двух секторов выступают две переменные:

  • Накопитель Houses из сектора Housing используется в секторе Population
  • Переменная HouseholdsToHousesRatio из сектора Population используется в секторе Housing

Для каждой такой переменной существует «оригинальный» элемент в одном из секторов и «копия» в других секторах.

Давайте посмотрим, как создавались эти переменные.

Создание «выходной» интерфейсной переменной для Houses

  1. Добавьте элемент  Динамическая переменная из палитры  Системная динамика на диаграмму HousingSector.
  2. Назовите эту переменную HousesOut.
  3. В Свойствах этой переменной установите флажок для параметра Отображается на верхнем агенте. Таким образом мы объявляем эту переменную интерфейсной переменной, которая будет видна в агенте, который соединяет две части (на диаграмме Main).
  4. В поле HousesOut= укажите Houses в качестве значения переменной. Таким образом мы говорим переменной взять значение накопителя Houses (и поместить его в интерфейс агента).

Создание копии переменной для HouseholdsToHousesRatio

  1. Перетащите элемент  Копия из палитры  Системная динамика на диаграмму HousingSector.
  2. Выберите из списка «оригинальную» переменную HouseholdsToHousesRatio.

Создайте интерфейс жилищного сектора

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

  3. Поместите переменную HousesOut на границу иконки.
  4. Нарисуйте связь от Houses к HousesOut.
  5. Переместите «оригинальную»s переменную HouseholdsToHousesRatio на границу иконки.
  6. В свойствах этой переменной выберите опцию Отображается на верхнем агенте, чтобы вынести эту переменную на интерфейс агента.
  7. Установите флажок напротив Зависимая. Таким образом мы сообщаем этой переменной, что значение она будет получать «извне», в нашем случае — от внешней интерфейсной переменной сектора Population, которая будет связана с ней на диаграмме Main.
  8. Перенесите связь с этой переменной на ее копию, <HouseholdsToHousesRatio>, чтобы диаграмма потоков и накопителей хорошо выглядела.

То же самое проделайте с диаграммой PopulationSector.

Затем перетащите оба агента (HousingSector и PopulationSector) из дерева Проекты на диаграмму Main и соедините их интерфейсные переменные соединителями, как показано ниже.

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

Демо-модель: Population Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.
Как мы можем улучшить эту статью?