Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- model Epidemie
- global {
- //geometry shape <- rectangle(200#m,200#m);
- int nombre_humains <- 50;
- /** Définition des caractéristiques de l’environnement */
- init {
- create humains number:nombre_humains; // au moment où le modèle est initialisé, on veut créer un nombre n d'agents
- }
- reflex termine when: time = 5000 {
- do pause;
- }
- }
- /** On déclare notre famille d'agents "humains" */
- species humains skills:[moving] { // En plus de la déclaration "humain", on indique également quel(s) "skills" pré-programmés (en voici la liste complète https://gama-platform.github.io/wiki/BuiltInSkills) seront employés. Dans notre cas, on utilise le skill "move" pour déplacer les agents.
- bool malade <- flip(0.1); // Les agents doivent avoir un état initial "malade" qui est vrai ou faux. On utilise "flip" (comme dans "to flip a coin"), une fonction de GAMA pour décider aléatoirement si l'agent est malade au départ de la simulation (10% de probabilité)
- int dist <- 2; // Définir une nouvelle variable pour déterminer la distance à partir de laquelle les agents se contamines
- /** Création d'une action "reflex" (activée à chaque pas de temps de la simulation) */
- reflex moving { // remarquez que le nom ("moving") du reflex correspond à un "skill" préprogrammé dans GAMA et déjà initialisé à la ligne 11
- do wander(amplitude: 90.0); //le type de déplacement sera "wander". À chaque itération, les agents se déplacent aléatoirement d'un pas dans une direction donnée.
- }
- /** Création d'une deuxième action "reflex" (activée à chaque pas de temps de la simulation). Cette fois, on veut vérifier à chaque pas d etemps si les agents sont à moins de 2m, afin de les faire se contaminer */
- reflex contamine when: !empty(humains at_distance dist) { // "Activer la fonction réflex si la liste des agents qui sont à moins de 2m l'un de l'autre n'est pas vide"
- ask humains at_distance dist { // "Pour chaque humain (appelé "myself") ayant un ou plusieurs autres humains (appelé "self") à moins de 2 mètres, activer l'action suivante :"
- if (self.malade) { //"Si l'humain "self" est malade"...
- myself.malade <- true; // "... alors l'humain "myself" devient malade"
- }
- else if (myself.malade) { //"Autrement, si l'humain "myself" est malade"...
- self.malade <- true; // "... alors l'humain "self" devient malade"
- }
- }
- }
- /** Donner des informations sur l'aspect des agents */
- aspect base {
- draw circle(1) color: (malade) ? #red : #grey;// ils seront rouges s'ils sont malades, et gris s'ils sont sains
- }
- }
- /** Déclaration d'une expérience */
- experiment une_experience type: gui {
- /** Définition de l’interface du modèle */
- parameter "Nombre de personnes :" var:nombre_humains;
- output {
- display le_monde { // Création D'un onlet "le_monde"
- species humains aspect:base;
- }
- display graphique { // Création D'un onlet "graphique"
- chart "Nombre de personnes malades" {
- data "Individus malades" value: length (humains where (each.malade = true));
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement