D'après le cours de Frédéric Mandon sous licence Creative Commons BY NC SA, http://creativecommons.org/licenses/by-nc-sa/3.0/fr/.
On veut modéliser le fonctionnement d’un écosystème, avec de l’herbe, des moutons et des loups : les moutons mangent l'herbe, les loups mangent les moutons.
Cette simulation est discrète : tous les « tours de jeu », les moutons ainsi que les loups se déplacent, mangent éventuellement, meurent parfois, et l’herbe pousse.
L’intérêt est d'observer l'évolution de la "population" de chaque protagoniste, l'herbe, les moutons et les loups.
Monde
Cette classe est la carte sur laquelle évoluent les moutons.
Elle a pour attribut ( entre autres ) un tableau carré carte de dimension 50 x 50 (ou plus), qui représente une prairie.
Chaque case du tableau représente une zone sur laquelle pousse de l’herbe.
Ce tableau contient des coefficients entiers qui codent la présence ou pas d'herbe :
Le coefficient dans une case du tableau est réinitialisé à 0 lorsqu’un mouton « occupe » la case et mange l’herbe.
A chaque "battement d’horloge" modélisant l'évolution du temps, on augmente la valeur dans chaque case de 1 pour modéliser la pousse de l'herbe ( vous verrez la gestion du temps dans la classe Simulation
).
herbePousse()
herbeMangee(x,y)
, où x et y sont les coordonnées d'une case de la carte.nbHerbe()
qui renvoie le nombre de carrés de la carte qui contiennent de l'herbe.getCoefCarte(x,y)
, où x et y sont les coordonnées d'une case de la carte. C’est une méthode qui renvoie la valeur du coefficient de la case (x, y) de la carte.On pourra initialiser les coefficients des cases de carte avec 50% de carrés herbus, et pour ceux qui n’ont pas d’herbe on initialisera le coefficient du tableau entre 0 et durée_repousse aléatoirement.
Mouton
variationEnergie()
: diminue de 1 l’énergie du mouton s’il n’est pas sur un carré d’herbe, sinon augmente l'énergie de gain_energie . Renvoie la valeur de energie .deplacement()
: le mouton se déplace aléatoirement dans une des huit cases adjacentes de celle où il se trouve.Il y a plusieurs façons de gérer les éventuelles sorties des moutons de la carte, mais la plus astucieuse consiste à utiliser l'opérateur modulo %
( = reste de la division entière ) sur les coordonnées du mouton;
par exemple, que vaut 50 % 50 ? -1 % 50 ? A vous d'utiliser ceci judicieusement !
Une classe Simulation
, comme son nom l’indique, gèrera la simulation.
Mouton
( il y en a nombre_moutons...)Monde
Une seule méthode, simMouton()
gère la simulation en créant une boucle qui remplira plusieurs fonctions les unes après les autres :
variationEnergie()
pour chaque mouton. Si l’énergie d’un mouton est nulle, l’instance de celui-ci est supprimée ( suppression de l'élément correspondant dans la liste des moutons );On peut arrêter la simulation s’il n’y a plus de moutons, ou s’il y en a plus qu’un nombre fixé (qu’on rajoutera en attribut). Dans ce dernier cas, les moutons ont conquis le monde...
On l’arrête dans tous les cas lorsque l’horloge sonne la fin du monde.
La méthode renvoie les deux listes de résultats.
Pour les tests, mettre fin_du_monde à 10. Réfléchissez aussi si à ce qui peut se passer en ce qui concerne le nombre de moutons d’une génération à la suivante. Les tests peuvent être longs dès que l’on dépasse 100 "battements" d’horloge suivant votre ordinateur.
Pour visualiser les résultats, vous pouvez utiliser le module Matplotlib pour tracer les courbes montrant l'évolution de l'herbe et des moutons au cours du "temps".
Les loups "fonctionnent" comme les moutons, sauf qu’ils ne mangent pas d’herbe mais plutôt des moutons...Un loup ne mange qu’un seul mouton par tour.
On peut leur mettre un taux de reproduction de 5, et un gain sur la nourriture de 19. Si le gain est trop petit les loups meurent tous, s’il est trop grand les loups se multiplient trop, et avec les données de naissances la croissance devient exponentielle .
Il est logique de mettre au moins deux fois moins de loups que de moutons. Avec ces données et les précédentes, on obtient un système qui se stabilise.
Il est intéressant de trouver des valeurs initiales qui donnent un système pseudo-périodique (des sortes de sinusoïdes décalées ), ou bien des systèmes chaotiques.
Bonne simulation !