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

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

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

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

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

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