Modèle proie-prédateur sans équations
Etudiant : Delamézière Lucas
Tuteur : Mouloud Kessar
Introduction au problème
Les équations de Lotka-Volterra permettent d’étudier et de prédire mathématiquement l’évolution des populations de proies et de prédateurs au sein d’un même environnement.
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ? C’est ce que nous allons examiner aujourd'hui.
règles
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des "règles" qui régirons notre environnement.
règles de base
Les règles les plus importantes (celles qui sont imposées) sont les suivantes :
- nr_pred, nr_proie deux variables traduisant le nombre d'itération que prennent chaque espèces à se reproduire
- n_faim traduisant le nombre d'itération que prend un prédateur à mourir sans manger de prédateur
- La marche aléatoire, un concept très simple et portant très important pour notre simulation : chaque entité se déplacera aléatoirement (si possible) dans une de ces quatre directions (haut, bas, gauche, droite)
- Une proie est mangée lorsqu'elle se trouve au même endroit qu'un prédateur
autres règles
Il existe également d'autres règles moins évidentes, qu'il est important de définir avant l'implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l'implémentation :
- Que faire si une entité essaie de sortir de l'environnement ?
- Que faire si deux entités de la même espèce vont au même endroit ?
- Priorité de reproduction, de déplacement ?
Réponses :
- rebond sur les bords.
- pas de superposition.
- les prédateurs auront la priorité.
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l'implémentation, à la différence des règles de base)
Pseudo code
Avant de se lancer directement dans l'implémentation, il est intelligent d'utiliser les règles que nous avons définit ci-dessus afin de réaliser un pseudo code, qui nous permettra de gagner du temps lors de l'implémentation.
##### Phase d'initialisation #####
Créer une liste `tab_proie` vide
Créer une liste `tab_predateur` vide
POUR i allant de 1 à `nb_proies_initiale` FAIRE :
Trouver une coordonnée vide dans `environnement`
SI une coordonnée est trouvée :
Ajouter une nouvelle Proie à `tab_proie`
FIN POUR
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :
Trouver une coordonnée vide dans `environnement`
SI une coordonnée est trouvée :
Ajouter un nouveau Prédateur à `tab_predateur`
FIN POUR
##### début de la simulation #####
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :
Réinitialiser la grille `environnement` (remplir de 0)
##### Phase d'action #####
POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :
Déplacer le prédateur en fonction de l’environnement et des proies
Vérifier s’il mange une proie, sinon décrémenter sa faim
SI faim == 0 :
Supprimer le prédateur de `tab_predateur`
SI le prédateur est toujours vivant :
Afficher ses informations
Afficher le prédateur sur la grille
FIN POUR
POUR chaque proie DANS `tab_proie` :
Déplacer la proie en fonction de l’environnement et des prédateurs
Afficher la proie sur la grille
FIN POUR
##### Phase de reproduction #####
SI c’est un tour de reproduction des prédateurs :
POUR chaque prédateur existant :
Trouver une coordonnée vide dans `environnement`
SI une coordonnée est trouvée :
Ajouter un nouveau Prédateur à `tab_predateur`
Afficher tous les prédateurs mis à jour
Afficher un message "Reproduction des prédateurs !"
SI c’est un tour de reproduction des proies :
POUR chaque proie existante :
Trouver une coordonnée vide dans `environnement`
SI une coordonnée est trouvée :
Ajouter une nouvelle Proie à `tab_proie`
Afficher toutes les proies mises à jour
Afficher un message "Reproduction des proies !"
##### Fin de la phase de reproduction #####
Afficher l’environnement mis à jour
FIN POUR
Implémentation
Pour ce projet, l'implémentation sera réalisé en python à l'aide de programmation orienté objet
Le programme sera divisé en quatre parties qui sont les suivantes :
Le programme principal
C'est ici qu'est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.
def execution_environnement(largeur:int,longueur:int,nb_itérations:int,nb_predateurs_initiale:int,faim_predateur_initale:int,nb_proies_initiale:int,nrpred:int,nrproie:int):
environnement = [[0 for j in range(largeur)] for i in range(longueur)]
csv_file=f"pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}"
csv_file+=f"_faim_{faim_predateur_initale}"
csv_file+=f"_nrpred_{nrpred}_nrproie_{nrproie}.csv"
csv_columns=["population_predateurs","population_proies"]
######################################################################################
# Programme principal
#Creation des entités
tab_proie = []
tab_predateur = []
for i in range(nb_proies_initiale):
coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)
if coord != None:
tab_proie.append(Proie(coord[0], coord[1], nrproie))
for j in range(nb_predateurs_initiale):
coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)
if coord != None:
tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))
############################
with open(csv_file, mode="w", newline="") as file:
writer = csv.writer(file, delimiter=";")
writer.writerow(csv_columns)
for i in range(1,nb_itérations):
writer.writerow([len(tab_predateur), len(tab_proie)])
environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]
for proie in tab_proie:
proie.se_deplacer(environnement,tab_proie,tab_predateur)
proie.afficher(environnement)
nouveau_tab_predateurs = []
for predateur in tab_predateur:
predateur.se_deplacer(environnement, tab_proie, tab_predateur)
if predateur.décompte_faim > 0:
nouveau_tab_predateurs.append(predateur) # Garde le prédateur en vie
predateur.afficher(environnement)
tab_predateur = nouveau_tab_predateurs
###### reproduction ########
if est_iteration_apparition(i,nrproie):
for _ in range(len(tab_proie)):
coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)
if coord != None:
tab_proie.append(Proie(coord[0], coord[1], nrproie))
for proie in tab_proie:
proie.afficher(environnement) # On affiche les nouvelles proies sur la grille
print("reproduction proies !",i)
if est_iteration_apparition(i,nrpred):
for i in range(len(tab_predateur)):
coord=(randint(0,largeur-1),randint(0,longueur-1))
tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))
for proie in tab_proie:
if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:
tab_proie.remove(proie)
for predateur in tab_predateur:
predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille
print("reproduction predateurs !",i)
###### fin reproduction ########
afficher_environnement(environnement)
print("les proies sont au nombre de:",len(tab_proie),"à la fin de la simulation")
print("les predateurs sont au nombre de:",len(tab_predateur),"à la fin de la simulation")