L'écosystème Wator
un modèle de simulation du
phénomène proie/prédateur
Après nous être
intéressé au jeu de la vie, nous allons continuer
à explorer le monde passionnant des automates celullaires. Pour
cela, nous allons étudier ou plutôt simuler un
écosystème "océanographique" simplifié :
wator ! Le but de cette simulation est d'illustrer les dynamiques
d'évolution de population formée de proies et de
prédateurs. Ce modèle a été décrit
initialement par A. K. Dewdney dans le magazine Scientific American
(l'équivalent de notre Pour la Science ).
Comme dans le jeu de la vie, la simulation se passe sur une grille
à deux dimensions, dont chacune des cases peut contenir soit un
poisson, soit un requin ou ... de l'eau :) Les poissons ont un
comportement extrèmement simple : ils se déplacent
aléatoirement tout au long de leur vie et se reproduisent au
bout d'un certain nombre de tours (si il y a une case disponible dans
leur voisinage). Les requins sont un peu plus malins car ils peuvent
percevoir leur environnement : ils ont la même notion de
voisinage que celle du jeu de la vie. Ainsi, lorsqu'ils ne
perçoivent pas de poissons à proximité, ils se
déplacent aléatoirement. Dans le cas contraire, ils se
précipitent sur le malheureux poissons qui se trouve
mangé ... Comme les poissons, les requins peuvent se reproduire
au bout d'un certain nombre de tours, mais en plus ils peuvent aussi
mourir de faim.
Pour que la simulation soit donc intéressante, il faudra
préciser 5 paramètres :
- le nombre de poissons,
- le nombre de requins,
- le nombre de tours nécessaires pour qu'un poisson se
reproduise,
- le nombre de tours nécessaires pour qu'un requin se
reproduise,
- le nombre de tours au bout desquels le requin meure si il n'a pas
mangé de poisson.
Avec un choix judicieux de ces 5
paramètres, il est possible d'observer la régulation qui
s'opére dans l'évolution des populations de poissons et
de requins. En effet, lorsque la population de poisson croît, les
requins trouvent plus facilement leur nourriture et peuvent ainsi se
développer. Cependant, une fois un certain seuil atteint, les
requins étant plus nombreux, ils consomment plus de poissons, ce
qui fait chuter dramatiquement leur population. Les poissons
étant devenus plus rares, les requins meurent de faim. Et
l'effet s'inverse : plus les requins disparaîssent, plus la
population de poissons s'accroît.
En ce qui concerne la dynamique de la simulation, nous
réaliserons deux approches :
- un tirage aléatoire de la case à faire
évoluer (pas terrible),
- un balayage alternatif des poissons et des requins dans un ordre
aléatoire (beaucoup mieux !).
Maintenant que nous disposons de l'ensemble des informations, nous
pouvons passer à l'analyse et à la conception de cette
simulation.
* Quelle(s) structure(s) de données utiliser ?
* Comment décomposer le problème en procédures
pour le simplifier ? (sachant que dans un premier temps, on ne
travaillera qu'avec des procédures non
paramétrées)
En ce qui concerne la structure de données, cela dépend
fortement de la dynamique de simulation choisie.
A.
Nous allons dans un premier temps nous intéresser à la
première dynamique, et pour cela nous allons utiliser un tableau
à trois dimensions. En effet, deux dimensions sont
nécessaires pour représenter la grille où
évoluent les poissons et requins. La troisième est
nécessaire pour représenter les informations propres aux
poissons et requins :
- pour les poissons, il ne faut se rappeler que de leur nombre de
tours avant reproduction.
- pour les requins, il faut se rappeler de la même
information, mais aussi du nombre de tours passés sans se
nourrir.
Ainsi, la troisième dimension peut être utilisée de
la manière suivante :
Interprétation
|
Nature
de la case
|
Nb
de tours avant reproduction
|
Nb
de tour avant famine
|
Type de
donnée
|
Entier
|
Entier
|
Entier
|
Valeurs
par défaut
|
eau
= 0
poisson = 1
requin = 2
|
unEntier
|
unEntier
|
Ainsi, dans la troisième
dimension, la première case représente la nature de
l'élément (eau, poisson ou requin), la deuxième
case le nombre de tours avant reproduction et la troisième case
le nombre de tours avant le décès pour cause de famine
(case utilisée uniquement dans le cas d'une case contenant un
requin). Une extension possible sera d'utiliser la case "reproduction"
dans le cas de l'eau pour simuler la croissance du plancton pour lequel
le poisson est un prédateur (mais c'est une autre histoire ;)
A chaque tour, un couple d'entier sera tiré aléatoirement
et indiquera la case à faire évoluer.
B.
Pour la deuxième approche, où l'on désire garantir
une équité entre les poissons et les requins, nous allons
devoir utiliser une structure de données beaucoup plus complexe.
En effet, il faut que l'on puisse accéder directement à l'ensemble des
poissons et à l'ensemble des requins. Si de plus on veut pouvoir
choisir de faire évoluer alternativement un poisson puis un
requin, il faudra utiliser deux structures de données
différentes : un premier tableau pour les poissons, un
deuxième pour les requins. Il nous faudra aussi toujours
représenter la grille, ce qui introduit la troisième et
dernière structure de données !
Si l'on résume la situation :
- nous pouvons conserver la même structure de données
que dans la première approche : un tableau d'entiers à
trois dimensions pour représenter la grille et son contenu.
- deux tableaux d'entiers à deux dimensions pour stocker les
coordonnées des poissons et des requins.
Les tableaux représentant les coordonnées des poissons et
requins pourront avoir la structure suivante :
coordonnées
en ligne
|
3
|
13
|
...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
coordonnées
en colonne
|
2
|
34
|
...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ainsi, lors de l'initialisation de la
grille, il faudra veiller à mettre à jour
simultanément les informations dans la grille en 3D et dans le
tableau en 2D correspondant (poisson ou requin).
A chaque tour, on commencera par mélanger les coordonnées
contenues dans les tableaux poissons et requins (à l'aide de
l'algorithme vu en DS :), puis on parcourera alternativement les deux
tableaux pour déterminer la case (une fois poisson, une fois
requin) à faire évoluer.
Vous avez toutes les clés en main, il n'y a plus qu'à
écrire l'algorithme ;)