Prey / Predator with complex behavior

theory-sma
Des gazelles et des loups loin de leur maisons

Il s'agit d'une liste de chose à ajouter petit à petit, en complexifiant votre modèle.

A chaque fois j'ai ajouté les éléments du plus simple au plus complexe.

Par exemple, A.1 est à réaliser avant A.2 car A.1 est plus simple que A.2

Les gazelles et les loups possède un attribut d'énergie qui est lié à la nourriture qu'il consomme Les deux possèdent aussi un métabolisme qui leur fait consommer de l'énergie.

  • A. Les gazelles mangent et se déplacent

    • A.1 vers la ressource en herbe la plus proche
    • A.2 vers la ressource en herbe la plus proche et la plus grosse
  • B. Ajouter une proie Loup

    • B.0 qui se déplace aléatoirement et mange une gazelle
      • B.0.1 si la proie se situe sur un patch ou il y a une gazelle
      • B.0.2 si la proie a faim, ce qui suppose d'ajouter un seuil d'énergie à partir duquel la proie se met en chasse
    • B.1 sauf celles dans la maison
    • B.2 privilégie pour son repas la gazelle la plus proche, ce qui veut dire que la proie peut changer de cible si une autre gazelle passe et qu'elle est plus proche
  • C. Sans maison au départ,

    • C.1 les gazelles se déplace et vont la maison qui leur a été attribué au départ
    • C.2 reste dans la maison si elles ont assez mangées et ressortent si leur énergie est trop basse
    • C.3 reste dans la maison si elles ont assez mangées et ressortent si leur énergie est trop basse MAIS SI un loup est trop proche (ex > 2 à 3 patchs) elle ne sortent pas
breed [gazels gazel]
breed [houses house]
breed [wolfs wolf]

gazels-own [
  energie
  house-to-go
  target-pgrass
]

wolfs-own [
 energie
]

houses-own [
]

patches-own [
  grass-quantity
  grass-maximum
  on-fire
]



to setup

  ;; Effacer l'ecran
  clear-all

  reset-ticks

  ;; Creer des gazelles
  create-gazels nb-gazels [
    ;; forme tortue
    set shape "cow"
    ;; position xy aleatoire
    setxy random-xcor random-ycor
    set color red
    set energie random 100
  ]

  ;; Creer des loups
  create-wolfs nb-wolfes [
    set shape "wolf"
    setxy random-xcor random-ycor
    set color black
    set size 2
    set energie random 100
  ]

  ;; creer 3 maison
  create-houses 3 [
    set shape "house"

    let my-patch one-of patches ;; renvoie un patch au hasard
    set xcor [pxcor] of my-patch ;; attribue a xcor la variable pxcor du patch selectione precedemment
    set ycor [pycor] of my-patch

    ;;setxy random-xcor random-ycor
    set color black
    set size 0.5
  ]

  ;; attribue une maison a chaque gazelle
  ask gazels [
   ;; definit une maison aleatoire pour chaque gazelle
   set house-to-go one-of houses
  ]

  colore-tortues

  ;; FIXE LA QUANTITE
  ask patches [
   ;; le maximum correspond à cette valeur définit aléatoirement
   set grass-maximum random 100
   ;; quantité d'herbe définit aléatoirement
   set grass-quantity random grass-maximum
  ]

  ;; toute les maison
  ask houses [
   ;; pour chaque maison questionne le patche sur lequel je suis
   ask patch-here [
    set grass-quantity 0
    set grass-maximum 0
   ]
    ask neighbors [
     set grass-quantity 0
     set grass-maximum 0
    ]
  ]

  ;; COLORATION HERBE
  colore-grass

end

to colore-grass

  ask patches with [ pcolor != red ][
   (ifelse
      grass-quantity >= 75 [
        set pcolor 54
      ]
      grass-quantity >= 50 [
        set pcolor 55
      ]
      grass-quantity >= 1 [
        set pcolor 56
      ]
      [
        set pcolor white
      ]
    )
  ]

end

to colore-tortues

  ask gazels [
    (ifelse
      energie >= 75 [
        set color blue
      ]
      energie >= 50 [
        set color green
      ]
      energie >= 25 [
        set color yellow
      ]
      [
        set color red
      ]
    )
  ]

end

to ignite-fire
  ask one-of patches [
    set pcolor red
    set on-fire 3 ; le feu dure 3 pas de temps
  ]
end

to diffuse-fire

  ask patches with [pcolor = red]
  [
   set on-fire (on-fire - 1 )
    if on-fire = 0 [
      set pcolor black
    ]
  ]

  ask patches with [pcolor = red] [
    ask neighbors4 with [grass-quantity > 30 ] [
      set pcolor red
      set grass-quantity 0
      set on-fire 3
    ]
  ]

end

;; boucle principale
to go

  diffuse-fire

  ;; PREMIERE ACTION : DEPLACEMENT ET ENERGIE
  ask gazels [

    ;; je vais vers la maison si jamais j'ai assez d'énergie
    ;; sinon je me deplace aleatoirement
    ifelse energie > 50 [
      face house-to-go
    ][
        ;; je gère le cas ou target-pgrass pas encore initialisé
        ifelse target-pgrass != 0 [
          face target-pgrass
        ][
          set heading (heading - 45 + random 90)
        ]
    ]

    ;; je veux récupérer dans un radius de 3 les 5 patchs qui contiennent le plus d'herbes
    let all-patch-with-max-quantity-of-grass max-n-of 5 (patches in-radius 5) [grass-quantity]

    let p-with-distance-min-max-quantity-of-grass min-one-of all-patch-with-max-quantity-of-grass [distance myself]

    ;; stocke mon patch target dans un attribut de la gazelle
    set target-pgrass p-with-distance-min-max-quantity-of-grass

    ;; recupere la quantité maximum d'herbe sur le patch
    let max-quantity [grass-quantity] of patch-here

    ;; tire au hasard la quantité du prochain repas de ma gazelle
    let eat-quantity random 5

    ;; herbe mange par la vache entre 0 et eat-quantity
    let herbe-reelemment-mange min (list max-quantity eat-quantity)

    ;show (word "texte " nom-de-ma-variable) permet d'afficher le contenu des variables dans la console pour debuger
    ;show (word "quantite mange par la vache = " eat-quantity)
    ;show (word "herbe rellement mange = " herbe-reelemment-mange)

    ;; j'enleve la quantité mangée au carré d'herbe sous moi
    ask patch-here [
     set grass-quantity grass-quantity - herbe-reelemment-mange
      ;show (word "quantite d'herbe restante = " grass-quantity)

    ]

    ;; j'ajoute la quantité d'herbe mangé à mon énergie
    set energie energie + herbe-reelemment-mange

    ;; je suis dans le contexte d'une gazelle (ask gazel)
    ;; et je calcule la distance à la maison qui m'a été attribué
    ifelse distance house-to-go <= 1 and energie > 50 [
      ;; si c'est le cas je fixe mes coordonnee à celle xy ( centroide ) du patch sous house-to-go
      set xcor [pxcor] of house-to-go
      set ycor [pycor] of house-to-go
    ][
      ;sinon je continue à me deplacer

      ifelse any? houses-here [
        ;; si l'energie < 50, avant de me deplacer je vais regarder si un loup est dans le voisinnage de 4
        let wolf-in-the-neigborhood wolfs in-radius 6

        ;; Si je n'ai pas de loup dans mon voisinnage alors
        ifelse not any? wolf-in-the-neigborhood  [
          forward 1 ;; se déplace de 1 unité
        ][
          ;show (word "il y a un loup dans ma maison, je ne bouge pas !!" houses-here)
        ]
      ][
        forward 1
      ]
    ]

    set energie energie - 1 ;; enleve 1 energie
  ]

  ;; COMPORTEMENT DES LOUPS
  ask wolfs [

    ;; recupere les gazelles dans un radius de distance 3
    let gazels-in-radius gazels in-cone 3 60

    ;; gazelle qui ne sont pas dans une maison
    let gazels-not-in-house gazels-in-radius with [not any? houses-here ]

    ;; si il y'en a, alors je vais vers la plus proche
    ifelse any? gazels-not-in-house [

      ;; je calcule la distance du loup (myself) a chacune des gazelles et je prend celle qui minimise
      let choosen-gazel-to-follow min-one-of gazels-not-in-house [distance myself]

      ;; je suis la gazelle
      face choosen-gazel-to-follow
    ]
    [
      set heading (heading - 45 + random 90)
    ]


    forward 1

    ;; est ce qu'il y a une gazelle ici ?

    ;; première version
    ;; je demande au patch sous le loup (patch-here dans le contexte du loup)
    ask patch-here [
      ;; si il y a des gazelles sur le patch (gazel-on)
      if any? gazels-on self and not any? houses-here [
        ;; je les tue toutes
        ;show (word "J'ai tué les gazelles : " [self] of (gazels-on self) ) ;; ici le premier self renvoie à patch-here
        ask gazels-here [die]
      ]
    ]

    ;; deuxième version du même code au dessus mais plus court
    ;; on recupere les gazels qui sont sur le patch et on les tue
    ;;let gazels-to-die [gazels-on self] of patch-here
    ;;ask gazels-to-die [die]

  ]

  ;; COMPORTEMENT DE L'HERBE
  ask patches [
   ;; ajouter 1 à l'herbe (cad grass-quantity)
   ;; si je suis pas déjà au maximum de l'herbe (cad <= grass-maximum)
   if grass-quantity < grass-maximum [
      set grass-quantity grass-quantity + 1
    ]
  ]

  ;; TROISIEME ACTION : MORT
  ask gazels with [energie <= 0][
      die
  ]

  ;show (word "modulo = " (ticks mod 400))
  ;; Je déclenche un feu tout les 400 pas de temps
  ;; car tous les 400 pas de temps modulo de ticks renvoie 0
  if (ticks mod 400 = 0) [
    ignite-fire
  ]

  ;;DEUXIEME ACTION : COLORER TORTUE
  colore-tortues

  ;; COLORATION HERBE
  colore-grass


  tick
end