Prey / Predator with complex behavior

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
- B.0 qui se déplace aléatoirement et mange une gazelle
-
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