This first step Illustrates how to write a model in GAMA. In particular, it describes how to structure a model and how to define species - that are the key components of GAMA models.
A GAMA model is composed of three type of sections:
More details about the different sections of a GAMA model can be found here.
A species represents a «prototype» of agents: it defines their common properties.
A species definition requires the definition of three different elements :
An attribute is defined as follows: type of the attribute and name. Numerous types of attributes are available: int (integer), float (floating point number), string, bool (boolean, true or false), point (coordinates), list, pair, map, file, matrix, espèce d’agents, rgb (color), graph, path…
In addition to the attributes the modeler explicitly defines, species “inherits” other attributes called “built-in” variables:
In this first model, we define one species of agents: the prey agents. For the moment, these agents will not have a particular behavior, they will just exist and be displayed.
An agent aspects have to be defined. An aspect is a way to display the agents of a species : aspect aspect_name {…} In the block of an aspect, it is possible to draw :
In order to display our prey agents we define two attributes:
For the moment, we only define an aspect for this species. We want to display for each prey agent a circle of radius size and color color. We then use the keyword draw with a circle shape.
species prey {
float size <- 1.0 ;
rgb color <- #blue;
aspect base {
draw circle(size) color: color ;
}
}
The global section represents a specific agent, called world. Defining this agent follows the same principle as any agent and is, thus, defined after a species. The world agent represents everything that is global to the model : dynamics, variables… It allows to initialize simulations (init block): the world is always created and initialized first when a simulation is launched (before any other agents). The geometry (shape) of the world agent is by default a square with 100m for side size, but can be redefined if necessary (see the Road traffic tutorial).
In the current model, we will only have a certain numbers of preys thus we need to hold this number in a global or world’s variable of type integer (int) which can be done as follows:
global {
int nb_preys_init <- 200;
}
The init section of the global block allows to initialize the model which is executing certain commands, here we will create nb_preys_init number of prey agents. We use the statement create to create agents of a specific species: create species_name + :
Definition of the init block in order to create nb_preys_init prey agents:
init {
create prey number: nb_preys_init ;
}
An experiment block defines how a model can be simulated (executed). Several experiments can be defined for a given model. They are defined using : experiment exp_name type: gui/batch {[input]
[output]
}
In our model, we define a gui experiment called prey_predator :
experiment prey_predator type: gui {
}
Experiments can define (input) parameters. A parameter definition allows to make the value of a global variable definable by the user through the graphic interface.
A parameter is defined as follows: parameter title var: global_var category: cat;
Note that the init, min and max values can be defined in the global variable definition.
In the experiment, definition of a parameter from the the global variable nb_preys_init :
experiment prey_predator type: gui {
parameter "Initial number of preys: " var: nb_preys_init min: 1 max: 1000 category: "Prey" ;
}
Output blocks are defined in an experiment and define how to visualize a simulation (with one or more display blocks that define separate windows). Each display can be refreshed independently by defining the facet refresh_every: nb (int) (the display will be refreshed every nb steps of the simulation).
Each display can include different layers (like in a GIS) :
Note that it is possible to define a opengl display (for 3D display) by using the facet type: opengl.
In our model, we define a display to draw the prey agents.
output {
display main_display {
species prey aspect: base ;
}
}
model prey_predator
global {
int nb_preys_init <- 200;
init {
create prey number: nb_preys_init ;
}
}
species prey {
float size <- 1.0 ;
rgb color <- #blue;
aspect base {
draw circle(size) color: color ;
}
}
experiment prey_predator type: gui {
parameter "Initial number of preys: " var: nb_preys_init min: 1 max: 1000 category: "Prey" ;
output {
display main_display {
species prey aspect: base ;
}
}
}