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 :
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 :
  1. un tirage aléatoire de la case à faire évoluer (pas terrible),
  2. 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 :
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 :
  1. 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.
  2. 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 ;)