Advertisement
rodolpheg

Untitled

Nov 12th, 2020 (edited)
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. model Epidemie
  2. global {
  3. //geometry shape <- rectangle(200#m,200#m);
  4. int nombre_humains <- 50;
  5. /** Définition des caractéristiques de l’environnement */
  6. init {
  7. create humains number:nombre_humains; // au moment où le modèle est initialisé, on veut créer un nombre n d'agents
  8. }
  9. reflex termine when: time = 5000 {
  10. do pause;
  11. }
  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.  
  20. /** Création d'une action "reflex" (activée à chaque pas de temps de la simulation) */
  21. reflex moving { // remarquez que le nom ("moving") du reflex correspond à un "skill" préprogrammé dans GAMA et déjà initialisé à la ligne 11
  22. 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.
  23. }
  24.  
  25. /** 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 */
  26. 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"
  27. 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 :"
  28. if (self.malade) { //"Si l'humain "self" est malade"...
  29. myself.malade <- true; // "... alors l'humain "myself" devient malade"
  30. }
  31. else if (myself.malade) { //"Autrement, si l'humain "myself" est malade"...
  32. self.malade <- true; // "... alors l'humain "self" devient malade"
  33. }
  34. }
  35. }
  36.  
  37. /** Donner des informations sur l'aspect des agents */
  38. aspect base {
  39. draw circle(1) color: (malade) ? #red : #grey;// ils seront rouges s'ils sont malades, et gris s'ils sont sains
  40. }
  41. }
  42.  
  43. /** Déclaration d'une expérience */
  44. experiment une_experience type: gui {
  45. /** Définition de l’interface du modèle */
  46. parameter "Nombre de personnes :" var:nombre_humains;
  47.  
  48. output {
  49. display le_monde { // Création D'un onlet "le_monde"
  50. species humains aspect:base;
  51. }
  52. display graphique { // Création D'un onlet "graphique"
  53. chart "Nombre de personnes malades" {
  54. data "Individus malades" value: length (humains where (each.malade = true));
  55. }
  56. }
  57. }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement