-
Notifications
You must be signed in to change notification settings - Fork 99
PredatorPrey_step11
benoitgaudou edited this page Apr 23, 2018
·
17 revisions
This 11th step Illustrates how to save data in a text file.
- At each simulation step, write in a text file:
- The time step
- The number of prey and predator agents
- The min and max energy of the prey and predator agents
GAMA provides several ways to write file.
A first ways consist in using the statement file in the output section: at each simulation step, the expression given is written in the given file.
file file_name type: file_type data: data_to_write;
With:
- file_name: string (by default the file in saved in the /models/ of your project directory)
- file_type: string
There are 2 possible types :
- ‘txt’ (text) : in that case, my_data is treated as a string, which is written directly in the file
- ‘csv’ : in that case, my_data is treated as a list of variables to write : ["var1", "var2", "var3"].
A second way to write file consists in using the save statement:
save my_data type: file_type to: file_name;
With:
- file_type : string
- file_name : string
There are 3 possible types :
- ‘shp’ (shapefile - GIS data) : in that case, my_data is treated as a list of agents : all their geometries are saved in the file (with some variables as attributes)
- ‘txt’ (text) : in that case, my_data is treated as a string, which is written directly in the file
- ‘csv’ : in that case, my_data is treated as a list of values : [val1, val2, val3].
We use this statement (in a global reflex called save_result) to write:
- The cycle step: use of the cycle keyword that returns the current simulation step.
- The number of prey and predator agents: use of nb_preys and nb_predators variables
- The min and max energy of the prey and predator agents: use of list min_of expression and list max_of expression keywords. In addition, we verify with the tertiary operator (condition ? val_if : val_else).
reflex save_result when: (nb_preys > 0) and (nb_predators > 0){
save ("cycle: "+ cycle + "; nbPreys: " + nb_preys
+ "; minEnergyPreys: " + ((prey as list) min_of each.energy)
+ "; maxSizePreys: " + ((prey as list) max_of each.energy)
+ "; nbPredators: " + nb_predators
+ "; minEnergyPredators: " + ((predator as list) min_of each.energy)
+ "; maxSizePredators: " + ((predator as list) max_of each.energy))
to: "results.txt" type: "text" ;
}
model prey_predator
global {
int nb_preys_init <- 200;
int nb_predators_init <- 20;
float prey_max_energy <- 1.0;
float prey_max_transfert <- 0.1 ;
float prey_energy_consum <- 0.05;
float predator_max_energy <- 1.0;
float predator_energy_transfert <- 0.5;
float predator_energy_consum <- 0.02;
float prey_proba_reproduce <- 0.01;
int prey_nb_max_offsprings <- 5;
float prey_energy_reproduce <- 0.5;
float predator_proba_reproduce <- 0.01;
int predator_nb_max_offsprings <- 3;
float predator_energy_reproduce <- 0.5;
int nb_preys -> {length (prey)};
int nb_predators -> {length (predator)};
init {
create prey number: nb_preys_init ;
create predator number: nb_predators_init ;
}
reflex save_result when: (nb_preys > 0) and (nb_predators > 0){
save ("cycle: "+ cycle + "; nbPreys: " + nb_preys
+ "; minEnergyPreys: " + ((prey as list) min_of each.energy)
+ "; maxSizePreys: " + ((prey as list) max_of each.energy)
+ "; nbPredators: " + nb_predators
+ "; minEnergyPredators: " + ((predator as list) min_of each.energy)
+ "; maxSizePredators: " + ((predator as list) max_of each.energy))
to: "results.txt" type: "text" ;
}
reflex stop_simulation when: (nb_preys = 0) or (nb_predators = 0) {
do halt ;
}
}
species generic_species {
float size <- 1.0;
rgb color ;
float max_energy;
float max_transfert;
float energy_consum;
float proba_reproduce ;
float nb_max_offsprings;
float energy_reproduce;
image_file my_icon;
vegetation_cell myCell <- one_of (vegetation_cell) ;
float energy <- (rnd(1000) / 1000) * max_energy update: energy - energy_consum max: max_energy ;
init {
location <- myCell.location;
}
reflex basic_move {
myCell <- choose_cell();
location <- myCell.location;
}
vegetation_cell choose_cell {
return nil;
}
reflex die when: energy <= 0 {
do die ;
}
reflex reproduce when: (energy >= energy_reproduce) and (flip(proba_reproduce)) {
int nb_offsprings <- 1 + rnd(nb_max_offsprings -1);
create species(self) number: nb_offsprings {
myCell <- myself.myCell ;
location <- myCell.location ;
energy <- myself.energy / nb_offsprings ;
}
energy <- energy / nb_offsprings ;
}
aspect base {
draw circle(size) color: color ;
}
aspect icon {
draw my_icon size: 2 * size ;
}
aspect info {
draw square(size) color: color ;
draw string(energy with_precision 2) size: 3 color: #black ;
}
}
species prey parent: generic_species {
rgb color <- #blue;
float max_energy <- prey_max_energy ;
float max_transfert <- prey_max_transfert ;
float energy_consum <- prey_energy_consum ;
float proba_reproduce <- prey_proba_reproduce ;
int nb_max_offsprings <- prey_nb_max_offsprings ;
float energy_reproduce <- prey_energy_reproduce ;
file my_icon <- file("../images/predator_prey_sheep.png") ;
reflex eat when: myCell.food > 0 {
float energy_transfert <- min([max_transfert, myCell.food]) ;
myCell.food <- myCell.food - energy_transfert ;
energy <- energy + energy_transfert ;
}
vegetation_cell choose_cell {
return (myCell.neighbours) with_max_of (each.food);
}
}
species predator parent: generic_species {
rgb color <- #red ;
float max_energy <- predator_max_energy ;
float energy_transfert <- predator_energy_transfert ;
float energy_consum <- predator_energy_consum ;
list<prey> reachable_preys update: prey inside (myCell);
float proba_reproduce <- predator_proba_reproduce ;
int nb_max_offsprings <- predator_nb_max_offsprings ;
float energy_reproduce <- predator_energy_reproduce ;
file my_icon <- file("../images/predator_prey_wolf.png") ;
reflex eat when: ! empty(reachable_preys) {
ask one_of (reachable_preys) {
do die ;
}
energy <- energy + energy_transfert ;
}
vegetation_cell choose_cell {
vegetation_cell myCell_tmp <- shuffle(myCell.neighbours) first_with (!(empty (prey inside (each))));
if myCell_tmp != nil {
return myCell_tmp;
} else {
return one_of (myCell.neighbours);
}
}
}
grid vegetation_cell width: 50 height: 50 neighbours: 4 {
float maxFood <- 1.0 ;
float foodProd <- (rnd(1000) / 1000) * 0.01 ;
float food <- (rnd(1000) / 1000) max: maxFood update: food + foodProd ;
rgb color <- rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))) update: rgb(int(255 * (1 - food)), 255, int(255 *(1 - food))) ;
list<vegetation_cell> neighbours <- (self neighbours_at 2);
}
experiment prey_predator type: gui {
parameter "Initial number of preys: " var: nb_preys_init min: 0 max: 1000 category: "Prey" ;
parameter "Prey max energy: " var: prey_max_energy category: "Prey" ;
parameter "Prey max transfert: " var: prey_max_transfert category: "Prey" ;
parameter "Prey energy consumption: " var: prey_energy_consum category: "Prey" ;
parameter "Initial number of predators: " var: nb_predators_init min: 0 max: 200 category: "Predator" ;
parameter "Predator max energy: " var: predator_max_energy category: "Predator" ;
parameter "Predator energy transfert: " var: predator_energy_transfert category: "Predator" ;
parameter "Predator energy consumption: " var: predator_energy_consum category: "Predator" ;
parameter 'Prey probability reproduce: ' var: prey_proba_reproduce category: 'Prey' ;
parameter 'Prey nb max offsprings: ' var: prey_nb_max_offsprings category: 'Prey' ;
parameter 'Prey energy reproduce: ' var: prey_energy_reproduce category: 'Prey' ;
parameter 'Predator probability reproduce: ' var: predator_proba_reproduce category: 'Predator' ;
parameter 'Predator nb max offsprings: ' var: predator_nb_max_offsprings category: 'Predator' ;
parameter 'Predator energy reproduce: ' var: predator_energy_reproduce category: 'Predator' ;
output {
display main_display {
grid vegetation_cell lines: #black ;
species prey aspect: icon ;
species predator aspect: icon ;
}
display info_display {
grid vegetation_cell lines: #black ;
species prey aspect: info ;
species predator aspect: info ;
}
display Population_information refresh:every(5) {
chart "Species evolution" type: series size: {1,0.5} position: {0, 0} {
data "number_of_preys" value: nb_preys color: #blue ;
data "number_of_predator" value: nb_predators color: #red ;
}
chart "Prey Energy Distribution" type: histogram background: rgb("lightGray") size: {0.5,0.5} position: {0, 0.5} {
data "]0;0.25]" value: prey count (each.energy <= 0.25) color:#blue;
data "]0.25;0.5]" value: prey count ((each.energy > 0.25) and (each.energy <= 0.5)) color:#blue;
data "]0.5;0.75]" value: prey count ((each.energy > 0.5) and (each.energy <= 0.75)) color:#blue;
data "]0.75;1]" value: prey count (each.energy > 0.75) color:#blue;
}
chart "Predator Energy Distribution" type: histogram background: rgb("lightGray") size: {0.5,0.5} position: {0.5, 0.5} {
data "]0;0.25]" value: predator count (each.energy <= 0.25) color: #red ;
data "]0.25;0.5]" value: predator count ((each.energy > 0.25) and (each.energy <= 0.5)) color: #red ;
data "]0.5;0.75]" value: predator count ((each.energy > 0.5) and (each.energy <= 0.75)) color: #red ;
data "]0.75;1]" value: predator count (each.energy > 0.75) color: #red;
}
}
monitor "Number of preys" value: nb_preys;
monitor "Number of predators" value: nb_predators;
}
}
- Installation and Launching
- Workspace, Projects and Models
- Editing Models
- Running Experiments
- Running Headless
- Preferences
- Troubleshooting
- Introduction
- Manipulate basic Species
- Global Species
- Defining Advanced Species
- Defining GUI Experiment
- Exploring Models
- Optimizing Model Section
- Multi-Paradigm Modeling
- Manipulate OSM Data
- Diffusion
- Using Database
- Using FIPA ACL
- Using BDI with BEN
- Using Driving Skill
- Manipulate dates
- Manipulate lights
- Using comodel
- Save and restore Simulations
- Using network
- Headless mode
- Using Headless
- Writing Unit Tests
- Ensure model's reproducibility
- Going further with extensions
- Built-in Species
- Built-in Skills
- Built-in Architecture
- Statements
- Data Type
- File Type
- Expressions
- Exhaustive list of GAMA Keywords
- Installing the GIT version
- Developing Extensions
- Introduction to GAMA Java API
- Using GAMA flags
- Creating a release of GAMA
- Documentation generation