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

Динамическое создание и удаление агентов

AnyLogic позволяет динамически добавлять и удалять агенты. Чтобы иметь возможность динамического добавления или создания агентов, вложенный агент должен быть популяцией, то есть, в его свойстве Начальное количество агентов должно быть задано количество экземпляров данного типа агента (либо 0, если вы не хотите, чтобы экземпляры агента создавались при запуске модели, а хотите добавить их позднее самостоятельно).

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

Person add_people() // добавляет новый объект типа Person в популяцию (и возвращает его для того, чтобы вы могли произвести дополнительную инициализацию этого объекта)
void remove_people(Person personToRemove) // удаляет заданного агента из популяции и уничтожает его.

Обратите внимание, что эти методы создаются в типе агента Main, так что они могут быть вызваны напрямую из любого места типа Main (например, из его действия При запуске или из Действия события и т.д.). При необходимости создания или удаления агента из другого агента, нужно вначале получить доступ к агенту Main. Например, если один человек рождает другого, то вы должны написать такой код в агенте "родителя":

main.add_people() или, что эквивалентно, ((Main)getOwner()).add_people();

Другой часто используемый случай: агент хочет уничтожить сам себя:

main.remove_people(this);

Если у динамически созданного или уничтоженного вложенного агента есть порты или переменные, соединенные с портами или переменными других агентов, то эти соединения будут автоматически установлены для динамически созданного агента и разорваны при его динамическом удалении.

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

Динамическое добавление/удаление нескольких агентов

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

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

Нужный вам код можно найти в действии кнопки с меткой “GO” на диаграмме типа агента Main. Здесь используются два разных цикла Java.

Цикл while удаляет всех существующих агентов из популяции aircrafts. Поскольку популяция названа aircrafts, то имя функции, удаляющей из нее агентов, образовано как remove_aircrafts. В качестве аргумента функции передается первый агент этой же популяции (aircrafts.get(0)). Функция вызывается несколько раз внутри цикла, пока популяция не станет пустой (т.е, функция aircrafts.size(), возвращающая количество ее элементов, не вернет значение 0).

      
while ( aircrafts.size() > 0 ){
  remove_aircrafts( aircrafts.get(0) );
}      
    

Для добавления нескольких агентов в популяцию здесь используется цикл for. В этом примере в популяцию aircrafts добавляются 20 агентов - самолетов. Аналогично предыдущему примеру, имя функции в данном случае образовано от имени популяции как add_aircrafts.

      
for ( int i = 0; i < 20; ++i ){
  add_aircrafts();
}      
    

Динамическое перемещение агента в другую популяцию

Вы можете динамически изменить популяцию, в которой живет агент, во время симуляции модели, с помощью функции агента goToPopulation(). Новая популяция должна содержать агентов того же (или совместимого) типа, что и перемещаемый агент.

goToPopulation(AgentList newPopulation) - Перемещает агента в другую популяцию. Агент покинет текущую среду (если он находился в среде) и перейдет в среду новой популяции (если в ней есть среда).

newPopulation - новая популяция, куда переместится данный агент. Если значение newPopulation равно null, то агент перейдет в созданную по умолчанию популяцию в агенте верхнего уровня модели и покинет свою текущую среду (если он находился в среде).

Как мы можем улучшить эту статью?