Des notions de priorité et des coefficients aléatoires ont bien sûr été ajoutées à ces actions afin que
le modèle soit le plus cohérent avec un modèle réel.
Ainsi, on récupère à chaque tour le nombre de proies et de prédateurs, ce qui permet de modéliser
l’évolution des populations dans un modèle de temps discret.
Solution parallèle
Bien que la solution précédente soit correcte, certains problèmes se posent par rapport au
modèle réel, tels que la gestion du temps en continu ou l’accès par plusieurs prédateurs à une même
proie. C’est en se tournant vers une approche concurrente que des solutions vont donc pouvoir être
trouvées.
Ainsi, dans cette solution parallèle, chaque animal, qu’il soit une proie ou un prédateur, va
être représenté par un thread, qui s’exécutera indépendamment des autres selon son propre modèle
de temps continu. Ceci permet de se soustraire aux contraintes de temps et d’ordre d’exécution et
de se rapprocher d’un comportement naturel.
Ces changements entrainent l’apparition de verrous afin de s’assurer du bon déroulement
des actions des différentes threads sur les cases du terrain.
L’algorithme global régissant le programme est le suivant :
Pour chaque action sur la case adjacente libre la plus proche de la case de coordonnées (0;
0), faire :
o Verrouillage de la case courante
o Verrouillage de la case adjacente choisie
o Exécution de l’action
o Libération de la case
L’affichage doit également suivre un modèle de synchronisation de ressources afin de rendre compte
de l’évolution asynchrone des populations. Ainsi, c’est le modèle producteur-consommateur qui le
régit ici.
Chaque thread est alors un producteur et l’interface est le consommateur. Toute action effectuée
par un animal est ajoutée à une file partagée ; Lorsque la file est pleine, toutes les threads voulant y
accéder après avoir effectué une action sont bloqués.