Реплицированные объекты
AnyLogic поддерживает репликацию
объектов – очень простой и удобный способ создания заданного
количества активных объектов одного типа. AnyLogic
избавляет от необходимости добавления на диаграмму большого
количества идентичных объектов, поскольку
такой подход является утомительным и позволяет создавать только системы
с постоянным количеством объектов. Вместо этого, Вы можете просто
создать реплицированный объект, который будет представлять собой сразу
несколько активных объектов одного класса.
С помощью репликации объектов можно:
- Создавать заданное количество активных объектов одного типа
одним объектом.
- Создавать масштабируемые системы, задавая количество элементов
реплицированного объекта с помощью параметра.
- Создавать сложные структуры объектов с нетривиальными
топологиями (такие, как вектор, сеть, тор и т.д.), программно
устанавливая соединения между элементами реплицированного объекта.
- Моделировать системы с динамически изменяющейся структурой, добавляя
и удаляя элементы реплицированного объекта во время работы
Создание реплицированного объекта
Вначале Вам нужно добавить на диаграмму вложенный объект того класса,
который Вы хотите реплицировать.
Чтобы сделать вложенный
объект реплицированным
- В графическом редакторе или в панели Проекты выделите тот вложенный
объект, который Вы хотите сделать реплицированным.
- На вкладке Основные
панели Свойства задайте
требуемое количество экземпляров этого объекта, которое Вы хотите
создать, в поле Количество.
Вы можете задать количество элементов реплицированного объекта
с помощью параметра активного объекта типа integer
или double.
Такая параметризация может понадобиться при необходимости
одновременного изменения количества элементов сразу нескольких
реплицированных объектов.
Если Вы зададите количество элементов реплицированного объекта с
помощью параметра, то AnyLogic создаст количество элементов, равное
начальному значению параметра (или его округленному значению - в случае
параметра типа double). AnyLogic не
будет автоматически изменять
количество элементов объекта в случае изменения значения параметра во
время работы модели. Вы можете сами задать соответствующие действия в
обработчике события изменения значения этого параметра (свойство
параметра Действие при изменении).
Доступ к элементам реплицированного объекта
Получить доступ к отдельному элементу реплицированного объекта anObject можно с помощью метода anObject.get(),
которому в качестве аргумента нужно передать номер этого элемента в
векторе реплицированных элементов (нумерация начинается с 0, номер
последнего элемента можно получить как anObject.size()
– 1).
Сбор агрегированной статистики по коллекции
объектов
Реплицированные объекты поддерживают удобный способ сбора
статистики. Поскольку чаще всего эта функциональность требуется в
агентных моделях, мы будем далее именовать элементы реплицированного объекта агентами.
Поддерживается следующие типы функций сбора статистики: Кол-во, Сумма, Среднее, Мин. и Макс.
- Кол-во.
Подсчитывает количество агентов, для которых будет выполнено
заданное Условие.
- Сумма.
Последовательно проходит по всем агентам и вычисляет заданное Выражение для каждого агента.
Возвращает сумму полученных значений.
- Среднее. Последовательно
проходит по всем агентам и вычисляет заданное Выражение для каждого агента.
Возвращает среднее полученных значений.
- Мин. Последовательно
проходит по всем агентам и вычисляет заданное Выражение для каждого агента.
Возвращает минимальное из полученных значений.
- Макс. Последовательно
проходит по всем агентам и вычисляет заданное Выражение для каждого агента.
Возвращает максимальное из полученных значений.
При необходимости Сумма, Среднее, Мин. и Макс. значения могут вычисляться
только для тех агентов, для которых будет выполнено дополнительное Условие.
Например, мы хотим сосчитать средний возраст потребителей продукта в
агентной модели Диффузии по Бассу. Пусть агенты в нашей модели
представлены реплицированным объектом класса Person. У этого класса есть
диаграмма состояний с состояниями PotentialAdopter
и Adopter и параметр age, задающий возраст человека. В
этом случае наша функция сбора статистики должны выглядеть так:

Чтобы задать у
реплицированного объекта новую функцию сбора статистики
- Выделите реплицированный объект в графическом редакторе или в
панели Проекты.
- Перейдите на страницу Статистика
панели Свойства.
- Щелкните мышью по кнопке Добавить
ф-ю сбора статистики. При этом откроется новый раздел свойств, в
котором Вы сможете задать свойства создаваемой функции.
- Измените имя функции в поле Имя.
Это имя будет использоваться для вызова данной функции.
-
Выберите тип функции сбора статистики с помощью группы кнопок Тип.
-
Задайте Выражение
и/или Условие с
помощью расположенных ниже элементов управления. Текущий элемент
реплицированного объекта (т.е. тот, по которому в текущий момент
проходит итерационный цикл функции сбора статистики) доступен в этих
полях как item.
- Чтобы добавить другие функции сбора статистики, пожалуйста,
повторите шаги 3-6. Если какая-то ранее заданная функция Вам больше не
нужна, Вы можете удалить ее, щелкнув по кнопке
в
соответствующем разделе свойств.
Заданную функцию сбора статистики можно будет вызывать, как и любую
другую функцию: написав ее имя, после которого должны следовать круглые
скобки. То есть, чтобы произвести сбор статистики с помощью заданной на
приведенном выше рисунке функции, нужно будет написать peopleStat()
Оптимизация производительности реплицированного объекта
Реплицированные объекты реализованы в AnyLogic как коллекции
элементов. Начиная с версии 6.4 AnyLogic позволяет выбрать тот или
иной тип
коллекции в зависимости то того, какой тип операций Вы планируете
наиболее часто применять при работе с реплицированныым объектом (и
соответственно, какую именно операцию по работе с элементами
реплицированного объекта Вы хотите оптимизировать по быстродействию).
Подробную информацию о типах коллекций Вы можете найти здесь.
Чтобы сменить тип
коллекции, используемой AnyLogic для хранения элементов
реплицированного объекта
- В графическом редакторе или в панели Проекты
выделите реплицированный
объект.
- На вкладке Основные
панели Свойства выберите
нужный Вам тип коллекции с помощью переключателя Оптимизировать. Опции этого
переключателя имеют интуитивные имена:
Память и поиск по индексу
(ArrayList) - реплицированный объект будет представлять собой
коллекцию типа ArrayLIst, что обеспечит более быстрое выполнение
операций поиска элементов по индексу и более экономное расходование
памяти.
Удаление/добавление элементов
(LinkedHashSet) - реплицированный объект будет представлять
собой коллекцию типа
LinkedHashSet, что обеспечит более быстрое выполнение операций
динамического удаления и добавления элементов реплицированного объекта.
См. также
Анимация
реплицированных объектов
Динамическое
добавление/удаление элементов реплицированного объекта