Advertisement
rodolpheg

Untitled

Nov 12th, 2020
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. model Epidemie
  2. global {
  3. /** Définition des caractéristiques de l’environnement */
  4.  
  5. int nombre_humains <- 50;
  6.  
  7. init {
  8. create humains number:nombre_humains; // au moment où le modèle est initialisé, on veut créer un nombre n d'agents
  9. }
  10. reflex termine when: time = 2000 {
  11. do pause;
  12. }
  13. }
  14.  
  15. /** On déclare notre famille d'agents "humains" */
  16. 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.
  17. 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é)
  18. int dist <- 2; // Définir une nouvelle variable pour déterminer la distance à partir de laquelle les agents se contamines
  19. int date_conta <- 0; // Définir une variable pour mettre la date (le cycle, dans GAMA) de la contamination
  20. 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.
  21. int date_immu <- 0; // Date à partir de laquelle l'agent est devenu immunisé
  22.  
  23. /** Création d'une action "reflex" (activée à chaque pas de temps de la simulation) */
  24. reflex moving { // remarquez que le nom ("moving") du reflex correspond à un "skill" préprogrammé dans GAMA et déjà initialisé à la ligne 11
  25. 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.
  26. }
  27.  
  28. /** 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 */
  29. reflex contamine { // "Fonction réflex"
  30. 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 :"
  31. if (self.malade and myself.immunise = false) { //"Si l'humain "self" est malade"...
  32. myself.malade <- true; // "... alors l'humain "myself" devient malade"
  33. myself.date_conta <- cycle; // Enregistre la "date" (le pas de temps) de la contamination dans la variable date_conta
  34. }
  35. else if (myself.malade and self.immunise = false) { //"Autrement, si l'humain "myself" est malade"...
  36. self.malade <- true; // "... alors l'humain "self" devient malade"
  37. self.date_conta <- cycle; // Enregistre la "date" (le pas de temps) de la contamination dans la variable date_conta
  38. }
  39. }
  40. }
  41.  
  42. /** Création d'un troisième "reflex" pour vérifier si les agents peuvent guérir */
  43. reflex guerir {
  44. 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)
  45. malade <- false; // Si la condition est vérifiée, la variable "malade" devient "faux"...
  46. immunise <- true; // ... et "immunisé" devient "vrai"
  47. date_immu <- cycle;
  48. }
  49. //else if (immunise = true and cycle > date_immu + 200) {
  50. // immunise <- false;
  51. //}
  52. }
  53.  
  54. /** Donner des informations sur l'aspect des agents */
  55. aspect base {
  56. draw circle(1) color: (malade) ? #red : #grey;// ils seront rouges s'ils sont malades, et gris s'ils sont sains
  57. }
  58. }
  59.  
  60. /** Déclaration d'une expérience */
  61. experiment une_experience type: gui {
  62. /** Définition de l’interface du modèle */
  63. parameter "Nombre de personnes :" var:nombre_humains; // création d'un espace dans l'interface pour changer le paramètre nombre_humains
  64.  
  65. output {
  66. layout #split;
  67. display le_monde { // Création d'un onlet "le_monde"
  68. species humains aspect:base;
  69. }
  70. display graphique { // Création d'un onlet "graphique"
  71. chart "Nombre de personnes malades" {
  72. data "Individus malades" value: length (humains where (each.malade = true));
  73. data "Individus immunisés" value: length (humains where (each.immunise = true));
  74. }
  75. }
  76. }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement