Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- model Epidemie
- global {
- /** Définition des caractéristiques de l’environnement */
- int nombre_humains <- 50;
- 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 = 2000 {
- 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
- int date_conta <- 0; // Définir une variable pour mettre la date (le cycle, dans GAMA) de la contamination
- bool immunise <- false; // Définir une variable pour déterminer si l'agent est immunisé ou non. Au départ, il ne l'est pas.
- int date_immu <- 0; // Date à partir de laquelle l'agent est devenu immunisé
- /** 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 { // "Fonction réflex"
- 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 and myself.immunise = false) { //"Si l'humain "self" est malade"...
- myself.malade <- true; // "... alors l'humain "myself" devient malade"
- myself.date_conta <- cycle; // Enregistre la "date" (le pas de temps) de la contamination dans la variable date_conta
- }
- else if (myself.malade and self.immunise = false) { //"Autrement, si l'humain "myself" est malade"...
- self.malade <- true; // "... alors l'humain "self" devient malade"
- self.date_conta <- cycle; // Enregistre la "date" (le pas de temps) de la contamination dans la variable date_conta
- }
- }
- }
- /** Création d'un troisième "reflex" pour vérifier si les agents peuvent guérir */
- reflex guerir {
- if (malade and cycle >= date_conta + 100) { // Est-ce que la date actuelle est postérieure à la date de contamination plus un certain nombre de pas de temps (ici, nous prenons 100 pas)
- malade <- false; // Si la condition est vérifiée, la variable "malade" devient "faux"...
- immunise <- true; // ... et "immunisé" devient "vrai"
- date_immu <- cycle;
- }
- //else if (immunise = true and cycle > date_immu + 200) {
- // immunise <- false;
- //}
- }
- /** 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; // création d'un espace dans l'interface pour changer le paramètre nombre_humains
- output {
- layout #split;
- 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));
- data "Individus immunisés" value: length (humains where (each.immunise = true));
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement