AnyLogic gives you the ability to dynamically create and destroy agents living in a population. To enable dynamic creation or destruction, in the agent properties, the Population of agents option should be selected. The Initial number of agents field in the population properties is used to specify the initial number of agents that will be created when the container object is created and can be 0 if you do not want to have any agents of this type at that time.
Assume you have declared a population people of agents of type Person within the Main agent. Then AnyLogic automatically generates two functions (at the Main level) for adding and removing agents to that population during the model execution:
- Person add_people() — this function creates a new agent of type Person and adds it into the population (and returns it so you can do additional setup)
- void remove_people( Person personToRemove ) — this function removes the given agent from the population and destroys it.
To create or destroy an agent from another agent of the same population or from itself, access the Main agent first. For example, if a person gives birth to another person, you should write within the “parent” person:
main.add_people();
Another frequently used pattern: an object wishes to destroy itself:
main.remove_people( this );
You may take a look at the given simple model. It demonstrates how to create agents dynamically (in this model they are generated using an event).
Demo model: Event Generating New Agents Open the model page in AnyLogic Cloud. There you can run the model or download it (by clicking Model source files).If you need to add several agents to population at once, you may use any Java loop. In the following model, you can find examples of both adding and removing multiple agents dynamically at the model runtime.
Demo model: Aircraft Fleet Planning Open the model page in AnyLogic Cloud. There you can run the model or download it (by clicking Model source files).Examine the action code of the button with the “GO” label in the Main agent type. You will find two different loops there.
The while loop removes the existing aircraft agents from the aircrafts population. Since the population is named aircrafts, the name of the function removing the agents from it is remove_aircrafts. The function is called several times inside the loop, until the population becomes empty (i.e., aircrafts.size() returns 0). Each time the function deletes the first agent of the population accessed as aircrafts.get(0).
while ( aircrafts.size() > 0 ){
remove_aircrafts( aircrafts.get(0) );
}
To add multiple agents into the population, for loop is used here. In this example, 20 agents are created and added into the aircrafts population. Similarly, the name of the function is constructed from the population name: add_aircrafts.
for ( int i = 0; i < 20; ++i ){
add_aircrafts();
}
You can dynamically change the population of an existing agent during the model simulation using the goToPopulation() function of the agent. The new population must contain agents of the same (or compatible) agent type.
goToPopulation(AgentList newPopulation) — Moves the agent to a new population. Agent will leave its current environment (if it has belonged to any) and join environment of the new population (if it lives in an environment).
newPopulation — the new population to move to. If newPopulation is null then the agent will go into the default population of the top-level agent of the model and will leave its environment (if it has lived in any).
-
How can we improve this article?
-