Skip to content
theory-sma
Déplacement de dino entre refuges

Objectifs

  • Créer des espèces refuges et des dinosaures de façon aléatoire. Chaque refuge se situe au centroide sur le patch.
  • faire en sorte que chaque dinosaure se voit attribuer un refuge aléatoire au setup de la simulation,
  • le go fait en sorte que chaque dinosaure se déplace vers le refuge qui lui a été attribué.
  • le dinosaure doit s'arréter sur le refuge, au centroide du patch quand la distance au refuge < 1
  • créer un bouton relocation pour attribuer un nouveau refuge aux dinosaure qui sont arrivé à leur refuge, ce qui leur permet de se redéplacer.
  • bonus 1 : La relocation fixe pour chaque dinosaure concerné le refuge le plus proche en distance, on pourra s'aider de la procédure who-are-not qui permet de comparer un AgentSet (l'ensemble des refuges) avec un autre Agent (mon refuge) ou un autre AgentSet (si par exemple on veut établir une liste de refuges que l'on a déjà visité et où on ne veut pas repasser).
  • bonus 2 : Pour éviter le problème d'aller retour qui apparait dans (bonus 1), on va plutôt piocher au hasard un refuge dans les 3 refuges les plus proches en distance.

Acquis attendus

  • Créer des espèces : create-<breeds>
  • Calculer des distances : distance
  • Stocker des références vers des refuges dans les dinosaures, les renouveller
  • Utiliser des embranchements if et ifelse pour gérer les déplacements
  • Exclure des Agents d'un AgentSet avec who-are-not

Answer

Pour créer des espèces, on se réfère à la commande create-<breeds> :

breed [dinosaures dinosaure]
breed [refuges refuge]

Pour définir un lieu aléatoire, on peut utiliser les commandes random-xcor et random-ycor, mais on se rend compte que les refuges ne sont pas localisé au centroide. Pour se faire on va utiliser random-pxcor et random-pycor, qui chacune renvoie des valeurs entière et nous garantisse l'apparition au centroide du patch.

La plupart des modèles se structure en deux étapes : - une étape setup qui initialise le monde avec ses conditions initiales - une étape go qui met en mouvement le monde

On associe a ces deux étapes des boutons dans l'interface qui renvoie à des procédures dans l'onglet code de Netlogo

to setup
  clear-all

  create-refuges 5 [
    set xcor random-pxcor
    set ycor random-pycor
    set shape "house"
    set color blue
  ]
end

Pour créer des dinosaures on ajoute des commandes à cette même procédure setup, on les positionne aussi au centroide pour plus de facilité.

to setup
  clear-all

  create-refuges 5 [
    set xcor random-pxcor
    set ycor random-pycor  
    set shape "house"
    set color blue
  ]

  create-dinosaures 5 [
    set xcor random-pxcor
    set ycor random-pycor
    set shape "dot"
    set color red
  ]

end

Pour attribuer un refuge à chaque dinosaure, il nous faut définir un attribut en plus des attributs par défaut (xcor,ycor, color, etc.).

Nous appelons ce nouvel attribut my-refuge, celui-ci doit être placé dans un bloc de code <breeds>-own

dinosaures-own [
  my-refuge
]

Pour cet attribut, nous avons plusieurs choix, il est possible de :

  • stocker les coordonnées x / y du refuge
  • stocker l'identifiant du refuge
  • stocker la référence directe à l'agent refuge

La troisième est la plus facile et la plus élégante, on ajoute une ligne de commande durant la création des dinosaures.

create-dinosaures 5 [
    set xcor random-pxcor
    set ycor random-pycor  
    set shape "dot"
    set color red
    set my-refuge one-of refuges
  ]

Pour la partie dynamique, dans la procédure go, nous allons définir le comportement de nos dinosaures.

to go


  ask dinosaures [
    face my-refuge
    let refuge-distance 0
    ; calcul de la distance au refuge
    set refuge-distance (distance my-refuge)


    ; si la distance au dinosaure est < 0.5 alors
    ifelse refuge-distance < 0.5 [
      set xcor [pxcor] of my-refuge
      set ycor [pycor] of my-refuge
      ]
    [ ;sinon
      fd 1
    ]

  ]

end

Pour le bouton de relocation des dinosaures et pour éviter que l'on reprenne un refuge sur lequel on est déjà :

to relocation 

  ask dinosaures with [ one-of refuges-here = my-refuge][
    set my-refuge one-of (refuges who-are-not my-refuge)
  ]

end

Bonus