<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Delameziere</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Delameziere"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Delameziere"/>
	<updated>2026-04-11T05:56:49Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16016</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16016"/>
		<updated>2025-05-18T12:47:01Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png|600px|]]&lt;br /&gt;
&lt;br /&gt;
=== Perspectives ===&lt;br /&gt;
&lt;br /&gt;
A la suite de ce projet, on pourrait se demander ce que cela donnerait avec la superposition des entités.&lt;br /&gt;
On pourrait également penser à optimiser le programme en remplaçant le parcours de la liste de toutes les proies et des prédateurs par un parcours des cases avoisinantes seulement.&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16015</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16015"/>
		<updated>2025-05-18T12:44:15Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png|600px|]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16014</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16014"/>
		<updated>2025-05-18T12:44:08Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png|500px|]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16013</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16013"/>
		<updated>2025-05-18T12:44:01Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png|100px|]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16012</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16012"/>
		<updated>2025-05-18T12:43:44Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png|5px|]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16011</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16011"/>
		<updated>2025-05-18T12:42:18Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16010</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16010"/>
		<updated>2025-05-18T12:42:00Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Equation.png]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Equation.png&amp;diff=16009</id>
		<title>Fichier:Equation.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Equation.png&amp;diff=16009"/>
		<updated>2025-05-18T12:41:44Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16008</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16008"/>
		<updated>2025-05-18T12:40:51Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
On remarque donc que nous avons bien réussit à obtenir les mêmes résultats qu&#039;avec les équations de Lotka-Volterra&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16007</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16007"/>
		<updated>2025-05-18T12:39:34Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Possibilité d&amp;#039;agrandit la grille */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16006</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16006"/>
		<updated>2025-05-18T12:39:15Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Possibilité d&amp;#039;agrandit la grille */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble pratiquement à la même que pour une taille moins élevée avec les mêmes paramètres&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16005</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16005"/>
		<updated>2025-05-18T12:29:47Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Possibilité d&amp;#039;agrandit la grille */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;br /&gt;
&lt;br /&gt;
on obtient la grille suivante après simulation : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 5.png]]&lt;br /&gt;
&lt;br /&gt;
On obtient donc une courbe qui ressemble praiquement à la même que pour une taille mois élevé avec les mêmes paramètres&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16004</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16004"/>
		<updated>2025-05-18T12:27:45Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Possibilité d&amp;#039;agrandit la grille */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux‎&amp;lt;br/&amp;gt;&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16003</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16003"/>
		<updated>2025-05-18T12:27:14Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Possibilité d&amp;#039;agrandit la grille */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
(le n de la taille du carré et le n des proies et prédateurs ne sont pas les mêmes)&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 20 x 20&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 200&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 100&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 6&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a maintenant une grille 100 × 100&lt;br /&gt;
donc b = 5&lt;br /&gt;
&lt;br /&gt;
5 × 5 × 30 = 750 prédateurs initiaux&lt;br /&gt;
5 × 5 × 100 = 2500 proies initiales&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16002</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16002"/>
		<updated>2025-05-18T12:23:12Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Résultats obtenus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;br /&gt;
&lt;br /&gt;
=== Possibilité d&#039;agrandit la grille ===&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite tester nos paramètres avec une grille plus grande tout en gardant une certaine cohérence entre les paramètres initiaux et la nouvelle taille de la grille, on effectue la formule suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Formule taille.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on fait ça par exemple avec les paramètres du troisième résultat qui était :&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Formule_taille.JPG&amp;diff=16001</id>
		<title>Fichier:Formule taille.JPG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Formule_taille.JPG&amp;diff=16001"/>
		<updated>2025-05-18T12:18:53Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16000</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=16000"/>
		<updated>2025-05-18T12:17:24Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Résultats obtenus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre principaux types de résultats différents parmi les milliers de résultat obtenus&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15999</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15999"/>
		<updated>2025-05-18T12:16:45Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Résultats obtenus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre types de résultats différents &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;br /&gt;
&lt;br /&gt;
Bien qu&#039;assez différents, ces résultats confirment une chose, l&#039;équilibre qui se met en place pour qu&#039;aucune des 2 espèce ne disparaissent est très fragile.&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15998</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15998"/>
		<updated>2025-05-18T12:15:40Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Exploration paramétrique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le job qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces job vont donc être tous êtres tous exécutés par une machine possédant 2 Intel Xeon Gold 6430 avec 32 cœurs chacun (hyperthread x2) et c&#039;est comme ça que nous allons générer tout ces résultats.&lt;br /&gt;
&lt;br /&gt;
=== Résultats obtenus ===&lt;br /&gt;
&lt;br /&gt;
On observe quatre types de résultats différents &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stat 1.png]]&lt;br /&gt;
[[Fichier:Stat 2.png]]&lt;br /&gt;
[[Fichier:Stat 3.png]]&lt;br /&gt;
[[Fichier:Stat 4.png]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_5.png&amp;diff=15997</id>
		<title>Fichier:Stat 5.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_5.png&amp;diff=15997"/>
		<updated>2025-05-18T12:11:22Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_4.png&amp;diff=15996</id>
		<title>Fichier:Stat 4.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_4.png&amp;diff=15996"/>
		<updated>2025-05-18T12:11:14Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_3.png&amp;diff=15995</id>
		<title>Fichier:Stat 3.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_3.png&amp;diff=15995"/>
		<updated>2025-05-18T12:11:05Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_2.png&amp;diff=15994</id>
		<title>Fichier:Stat 2.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_2.png&amp;diff=15994"/>
		<updated>2025-05-18T12:10:58Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_1.png&amp;diff=15993</id>
		<title>Fichier:Stat 1.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Stat_1.png&amp;diff=15993"/>
		<updated>2025-05-18T12:10:51Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15992</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15992"/>
		<updated>2025-05-18T12:05:18Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Utilisation de bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script va donc nous permettre de générer cette arborescence et d&#039;exécuter également le script qui suit pour executer la simulation en elle même &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=ProjetLuca&lt;br /&gt;
#SBATCH --partition=weekend&lt;br /&gt;
#SBATCH --ntasks=1&lt;br /&gt;
#SBATCH --cpus-per-task=1&lt;br /&gt;
#SBATCH --mem=4GB&lt;br /&gt;
#SBATCH --time=24:00:00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
python3 script.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15991</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15991"/>
		<updated>2025-05-18T12:03:30Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Utilisation de bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
largeur=100;&lt;br /&gt;
longueur=100;&lt;br /&gt;
iterations=200;&lt;br /&gt;
job=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/job.sh&amp;quot;&lt;br /&gt;
simu=&amp;quot;/home/kessar/projet_VISI_LUCAS/large_simus/simu.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in 750 &lt;br /&gt;
do&lt;br /&gt;
    mkdir predateurs_$i&lt;br /&gt;
    cd predateurs_$i&lt;br /&gt;
    for j in 2500 &lt;br /&gt;
    do&lt;br /&gt;
        mkdir proies_$j&lt;br /&gt;
        cd proies_$j&lt;br /&gt;
&lt;br /&gt;
        for t in 3 5 10 20&lt;br /&gt;
        do&lt;br /&gt;
            mkdir faim_$t&lt;br /&gt;
            cd faim_$t&lt;br /&gt;
&lt;br /&gt;
            for x in   4 6 10 20 30 40 50 &lt;br /&gt;
            do&lt;br /&gt;
                mkdir nrpred_$x&lt;br /&gt;
                cd nrpred_$x&lt;br /&gt;
&lt;br /&gt;
                for y in 6 10 20 30 40 50  &lt;br /&gt;
                do&lt;br /&gt;
                    mkdir nrproie_$y&lt;br /&gt;
                    cd nrproie_$y&lt;br /&gt;
&lt;br /&gt;
                    echo &amp;quot;$largeur&amp;quot; &amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$longueur&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$iterations&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$i&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$j&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$t&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$x&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
                    echo &amp;quot;$y&amp;quot; &amp;gt;&amp;gt; input.txt;&lt;br /&gt;
&lt;br /&gt;
                    ln -s $simu script.py&lt;br /&gt;
                    cp $job job.sh&lt;br /&gt;
		    sbatch job.sh&lt;br /&gt;
		    cd ../&lt;br /&gt;
                done&lt;br /&gt;
                cd ../&lt;br /&gt;
            done&lt;br /&gt;
	    cd ..&lt;br /&gt;
        done&lt;br /&gt;
       cd ../&lt;br /&gt;
    done&lt;br /&gt;
    cd ..&lt;br /&gt;
done&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15990</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15990"/>
		<updated>2025-05-18T11:58:49Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Exploration paramétrique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arborescence.png]]&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15989</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15989"/>
		<updated>2025-05-18T11:58:14Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Exploration paramétrique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;br /&gt;
Dans cette partie, nous allons voir comment générer une grande quantité de simulations afin de pouvoir tester un grands nombre de paramètres.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de bash ===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir effectuer toutes ces simulations automatiquement, nous allons utiliser le script bash ci-dessous qui va nous permettre de stocker nos résultats sous la forme d&#039;une arborescence de dossiers dont chaque dossiers contiendra plusieurs sous-dossiers, ces sous dossiers seront différentes valeurs testés pour un paramètre.&lt;br /&gt;
&lt;br /&gt;
Arborescence.png&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Arborescence.png&amp;diff=15988</id>
		<title>Fichier:Arborescence.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Arborescence.png&amp;diff=15988"/>
		<updated>2025-05-18T11:58:07Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15987</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15987"/>
		<updated>2025-05-18T11:52:55Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Erreurs rencontrées */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:erreur graph.png]]&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
Cette erreur ce produit lorsque ‎n faim &amp;gt; nr pred ce qui provoque le fait que les prédateurs se reproduisent avant de mourir de faim, ils ne disparaissent donc pas.&lt;br /&gt;
‎&amp;lt;br/&amp;gt;&lt;br /&gt;
On peux citer également une autre erreur qui nous a forcer cette fois ci à donner la priorité d&#039;apparition et de déplacement aux proies.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Erreur_graph.png&amp;diff=15986</id>
		<title>Fichier:Erreur graph.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Erreur_graph.png&amp;diff=15986"/>
		<updated>2025-05-18T11:35:59Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15985</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15985"/>
		<updated>2025-05-18T11:33:43Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Erreurs rencontrées */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
On a également remarqué que certaines configurations posaient problème : &lt;br /&gt;
un exemple serait ce graphique qui ne fait aucun sens car les prédateurs continuent de subsister alors que les proies ont disparus.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15908</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15908"/>
		<updated>2025-05-11T12:04:35Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Implémentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erreurs rencontrées ====&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15907</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15907"/>
		<updated>2025-05-11T12:02:53Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Quelques résultats avec les mêmes paramètres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
Ici, les paramètres utilisés sont les suivants:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre!! Valeur&lt;br /&gt;
|-&lt;br /&gt;
| Taille || 10 x 10&lt;br /&gt;
|-&lt;br /&gt;
| Itérations || 100&lt;br /&gt;
|-&lt;br /&gt;
| Prédateurs initiaux || 30&lt;br /&gt;
|-&lt;br /&gt;
| Proies initiales || 50&lt;br /&gt;
|-&lt;br /&gt;
| n_faim || 4&lt;br /&gt;
|-&lt;br /&gt;
| nr_pred || 5&lt;br /&gt;
|-&lt;br /&gt;
| nr_proie || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15905</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15905"/>
		<updated>2025-05-11T11:54:52Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Quelques résultats avec les mêmes paramètres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on a cité les règles de bases, l&#039;une d&#039;entre elles était la &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, et bien cette règle impacte aussi les résultats.&lt;br /&gt;
Comme vous pouvez le voir, avec les mêmes paramètres initiaux, on arrive à générer de nouveaux résultats tous différents à chaque simulation.&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15901</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15901"/>
		<updated>2025-05-11T11:49:55Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Extractions de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme de deux colonnes : | population prédateurs | population proies | stockées dans un fichier .csv (dont vous pouvez voir l&#039;implémentation dans le programme principale).&lt;br /&gt;
&lt;br /&gt;
Nous n&#039;avons plus qu&#039;à extraire ces données du .csv les afficher à l&#039;aide de matplotlib de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import csv&lt;br /&gt;
&lt;br /&gt;
def extraction_donnees_csv(fichier):&lt;br /&gt;
    population_predateurs = []&lt;br /&gt;
    population_proies = []&lt;br /&gt;
&lt;br /&gt;
    with open(fichier, mode=&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        reader = csv.reader(f, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        next(reader)&lt;br /&gt;
&lt;br /&gt;
        for ligne in reader:&lt;br /&gt;
            if len(ligne) &amp;gt;= 2:&lt;br /&gt;
                population_predateurs.append(int(ligne[0]))&lt;br /&gt;
                population_proies.append(int(ligne[1]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return population_predateurs, population_proies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fichier_csv = &amp;quot;pred_30_proies_50_faim_4_nrpred_5_nrproie_3.csv&amp;quot;&lt;br /&gt;
preds, proies = extraction_donnees_csv(fichier_csv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preds = np.array(preds)&lt;br /&gt;
proies = np.array(proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
iterations = np.arange(len(proies))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Population prédateurs :&amp;quot;, preds)&lt;br /&gt;
print()&lt;br /&gt;
print(&amp;quot;Population proies :&amp;quot;, proies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(iterations, proies, label=&amp;quot;Proies&amp;quot;, color=&amp;quot;green&amp;quot;)&lt;br /&gt;
plt.plot(iterations, preds, label=&amp;quot;Prédateurs&amp;quot;, color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Itérations&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Population&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Évolution des populations dans l&#039;environnement&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15900</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15900"/>
		<updated>2025-05-11T11:44:57Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Le programme principal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme d&#039;un fichier .csv&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15899</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15899"/>
		<updated>2025-05-11T11:42:48Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Extractions de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que notre simulation fonctionne à première vue, nous allons extraire nos données sous la forme d&#039;un fichier .csv&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15898</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15898"/>
		<updated>2025-05-11T11:38:53Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Implémentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Extractions de données ===&lt;br /&gt;
&lt;br /&gt;
=== Premiers résultats ===&lt;br /&gt;
&lt;br /&gt;
==== Quelques résultats avec les mêmes paramètres ====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15897</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15897"/>
		<updated>2025-05-11T11:37:43Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Quelques résultats avec les mêmes paramètres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Quelques résultats avec les mêmes paramètres ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:marche 1.png]]&lt;br /&gt;
[[Fichier:marche 2.png]]&lt;br /&gt;
[[Fichier:marche 3.png]]&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Marche_3.png&amp;diff=15896</id>
		<title>Fichier:Marche 3.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Marche_3.png&amp;diff=15896"/>
		<updated>2025-05-11T11:36:29Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Marche_2.png&amp;diff=15895</id>
		<title>Fichier:Marche 2.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Marche_2.png&amp;diff=15895"/>
		<updated>2025-05-11T11:36:21Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Marche_1.png&amp;diff=15894</id>
		<title>Fichier:Marche 1.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Marche_1.png&amp;diff=15894"/>
		<updated>2025-05-11T11:36:10Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15893</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15893"/>
		<updated>2025-05-11T11:32:20Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Implémentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
=== Quelques résultats avec les mêmes paramètres ===&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15892</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15892"/>
		<updated>2025-05-11T11:29:21Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Vérification de l&amp;#039;implémentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
Voici 3 itérations d&#039;une simulation sur une grille 5x5 avec 5 proies et 2 prédateurs (proie = 1, prédateur = 2, case vide = 0)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test implémentaion 1.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 2.png]]&lt;br /&gt;
[[Fichier:Test implémentaion 3.png]]&lt;br /&gt;
&lt;br /&gt;
On remarque bien que tout fonctionne comme prévu, sachant que n_faim était ici égal à 2, les prédateurs qui n&#039;ont pas eu le temps de manger une proie en 2 itérations (ici tous) disparaissent&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15891</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15891"/>
		<updated>2025-05-11T11:18:10Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Implémentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15890</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15890"/>
		<updated>2025-05-11T11:17:43Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Le programme principal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
=== Vérification de l&#039;implémentation ===&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15889</id>
		<title>Modèle proie-prédateur sans équations</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Mod%C3%A8le_proie-pr%C3%A9dateur_sans_%C3%A9quations&amp;diff=15889"/>
		<updated>2025-05-11T11:17:03Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : /* Implémentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Delamézière Lucas&lt;br /&gt;
&lt;br /&gt;
Tuteur : Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
== Introduction au problème ==&lt;br /&gt;
&lt;br /&gt;
Les [https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra é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.&lt;br /&gt;
&lt;br /&gt;
Mais est-il possible d’obtenir les mêmes résultats avec des déplacements aléatoires sur une grille ?&lt;br /&gt;
C’est ce que nous allons examiner aujourd&#039;hui.&lt;br /&gt;
&lt;br /&gt;
=== règles ===&lt;br /&gt;
&lt;br /&gt;
Afin de créer une simulation correctement, il va falloir dans un premier temps mettre en place des &amp;quot;règles&amp;quot; qui régirons notre environnement. &lt;br /&gt;
&lt;br /&gt;
==== règles de base ====&lt;br /&gt;
&lt;br /&gt;
Les règles les plus importantes (celles qui sont imposées) sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;nr_pred&#039;&#039;&#039;, &#039;&#039;&#039;nr_proie&#039;&#039;&#039; deux variables traduisant le nombre d&#039;itération que prennent chaque espèces à se reproduire&lt;br /&gt;
*&#039;&#039;&#039;n_faim&#039;&#039;&#039; traduisant le nombre d&#039;itération que prend un prédateur à mourir sans manger de prédateur &lt;br /&gt;
*La &#039;&#039;&#039;marche aléatoire&#039;&#039;&#039;, 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)&lt;br /&gt;
*Une proie est mangée lorsqu&#039;elle se trouve au même endroit qu&#039;un prédateur&lt;br /&gt;
&lt;br /&gt;
==== autres règles ====&lt;br /&gt;
&lt;br /&gt;
Il existe également d&#039;autres règles moins évidentes, qu&#039;il est important de définir avant l&#039;implémentation afin de gagner du temps sur ces problématiques qui peuvent se poser lors de l&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
*Que faire si une entité essaie de sortir de l&#039;environnement ?&lt;br /&gt;
*Que faire si deux entités de la même espèce vont au même endroit ?&lt;br /&gt;
*Priorité de reproduction, de déplacement ?&lt;br /&gt;
&lt;br /&gt;
Réponses :&lt;br /&gt;
&lt;br /&gt;
*rebond sur les bords.&lt;br /&gt;
*pas de superposition.&lt;br /&gt;
*les prédateurs auront la priorité.&lt;br /&gt;
&lt;br /&gt;
(Ces règles sont établies temporairement et peuvent être modifiées si besoin lors de l&#039;implémentation, à la différence des règles de base)&lt;br /&gt;
&lt;br /&gt;
=== Pseudo code ===&lt;br /&gt;
&lt;br /&gt;
Avant de se lancer directement dans l&#039;implémentation, il est intelligent d&#039;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&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##### Phase d&#039;initialisation #####&lt;br /&gt;
&lt;br /&gt;
Créer une liste `tab_proie` vide&lt;br /&gt;
Créer une liste `tab_predateur` vide&lt;br /&gt;
&lt;br /&gt;
POUR i allant de 1 à `nb_proies_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
POUR j allant de 1 à `nb_predateurs_initiale` FAIRE :&lt;br /&gt;
    Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
    SI une coordonnée est trouvée :&lt;br /&gt;
        Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
FIN POUR&lt;br /&gt;
&lt;br /&gt;
##### début de la simulation #####&lt;br /&gt;
&lt;br /&gt;
POUR chaque tour de simulation de 1 à `nb_itérations` FAIRE :&lt;br /&gt;
&lt;br /&gt;
    Réinitialiser la grille `environnement` (remplir de 0)&lt;br /&gt;
&lt;br /&gt;
    ##### Phase d&#039;action #####&lt;br /&gt;
&lt;br /&gt;
    POUR chaque prédateur DANS `tab_predateur` (copie pour sécurité) :&lt;br /&gt;
        Déplacer le prédateur en fonction de l’environnement et des proies&lt;br /&gt;
        Vérifier s’il mange une proie, sinon décrémenter sa faim&lt;br /&gt;
        SI faim == 0 :&lt;br /&gt;
            Supprimer le prédateur de `tab_predateur`&lt;br /&gt;
        SI le prédateur est toujours vivant :&lt;br /&gt;
            Afficher ses informations&lt;br /&gt;
            Afficher le prédateur sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    POUR chaque proie DANS `tab_proie` :&lt;br /&gt;
        Déplacer la proie en fonction de l’environnement et des prédateurs&lt;br /&gt;
        Afficher la proie sur la grille&lt;br /&gt;
    FIN POUR&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    SI c’est un tour de reproduction des prédateurs :&lt;br /&gt;
        POUR chaque prédateur existant :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter un nouveau Prédateur à `tab_predateur`&lt;br /&gt;
        Afficher tous les prédateurs mis à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des prédateurs !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    SI c’est un tour de reproduction des proies :&lt;br /&gt;
        POUR chaque proie existante :&lt;br /&gt;
            Trouver une coordonnée vide dans `environnement`&lt;br /&gt;
            SI une coordonnée est trouvée :&lt;br /&gt;
                Ajouter une nouvelle Proie à `tab_proie`&lt;br /&gt;
        Afficher toutes les proies mises à jour&lt;br /&gt;
        Afficher un message &amp;quot;Reproduction des proies !&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    ##### Fin de la phase de reproduction #####&lt;br /&gt;
&lt;br /&gt;
    Afficher l’environnement mis à jour&lt;br /&gt;
&lt;br /&gt;
FIN POUR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implémentation ==&lt;br /&gt;
&lt;br /&gt;
=== Le code en lui-même ===&lt;br /&gt;
&lt;br /&gt;
Pour ce projet, l&#039;implémentation sera réalisé en python à l&#039;aide de programmation orienté objet&lt;br /&gt;
&lt;br /&gt;
Le programme sera divisé en quatre parties qui sont les suivantes :&lt;br /&gt;
&lt;br /&gt;
==== Le programme principal ====&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;est réalisé la simulation en elle même en utilisant les autres éléments réalisés ci-dessous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
    environnement = [[0 for j in range(largeur)] for i in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
    csv_file=f&amp;quot;pred_{nb_predateurs_initiale}_proies_{nb_proies_initiale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_faim_{faim_predateur_initale}&amp;quot;&lt;br /&gt;
    csv_file+=f&amp;quot;_nrpred_{nrpred}_nrproie_{nrproie}.csv&amp;quot;&lt;br /&gt;
    csv_columns=[&amp;quot;population_predateurs&amp;quot;,&amp;quot;population_proies&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ######################################################################################&lt;br /&gt;
    #Programme principal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    #Creation des entités&lt;br /&gt;
    tab_proie = []&lt;br /&gt;
    tab_predateur = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(nb_proies_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
&lt;br /&gt;
    for j in range(nb_predateurs_initiale):&lt;br /&gt;
        coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
        if coord != None:&lt;br /&gt;
            tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    with open(csv_file, mode=&amp;quot;w&amp;quot;, newline=&amp;quot;&amp;quot;) as file:&lt;br /&gt;
        writer = csv.writer(file, delimiter=&amp;quot;;&amp;quot;)&lt;br /&gt;
        writer.writerow(csv_columns)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1,nb_itérations):&lt;br /&gt;
&lt;br /&gt;
            writer.writerow([len(tab_predateur), len(tab_proie)])&lt;br /&gt;
&lt;br /&gt;
            environnement = [[0 for _ in range(largeur)] for _ in range(longueur)]&lt;br /&gt;
&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                proie.se_deplacer(environnement,tab_proie,tab_predateur)&lt;br /&gt;
                proie.afficher(environnement)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            nouveau_tab_predateurs = []&lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                predateur.se_deplacer(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                &lt;br /&gt;
                if predateur.décompte_faim &amp;gt; 0:&lt;br /&gt;
                    nouveau_tab_predateurs.append(predateur)  # Garde le prédateur en vie&lt;br /&gt;
                    predateur.afficher(environnement)  &lt;br /&gt;
&lt;br /&gt;
            tab_predateur = nouveau_tab_predateurs&lt;br /&gt;
&lt;br /&gt;
        ###### reproduction ########&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrproie):&lt;br /&gt;
                for _ in range(len(tab_proie)):&lt;br /&gt;
                    coord = trouve_coordonnees_vide(environnement, tab_proie, tab_predateur)&lt;br /&gt;
                    if coord != None:&lt;br /&gt;
                        tab_proie.append(Proie(coord[0], coord[1], nrproie))&lt;br /&gt;
                for proie in tab_proie:&lt;br /&gt;
                    proie.afficher(environnement) # On affiche les nouvelles proies sur la grille&lt;br /&gt;
                print(&amp;quot;reproduction proies !&amp;quot;,i)&lt;br /&gt;
&lt;br /&gt;
            if est_iteration_apparition(i,nrpred):&lt;br /&gt;
                for i in range(len(tab_predateur)):&lt;br /&gt;
                    coord=(randint(0,largeur-1),randint(0,longueur-1))&lt;br /&gt;
                    tab_predateur.append(Predateur(coord[0], coord[1], faim_predateur_initale, nrpred))&lt;br /&gt;
                    for proie in tab_proie:&lt;br /&gt;
                        if proie.x == tab_predateur[i].x and proie.y == tab_predateur[i].y:&lt;br /&gt;
                            tab_proie.remove(proie)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    for predateur in tab_predateur:&lt;br /&gt;
                        predateur.afficher(environnement) # On affiche les nouveaux prédateurs sur la grille&lt;br /&gt;
                    print(&amp;quot;reproduction predateurs !&amp;quot;,i)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
    ###### fin reproduction ########&lt;br /&gt;
&lt;br /&gt;
            afficher_environnement(environnement)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;les proies sont au nombre de:&amp;quot;,len(tab_proie),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
    print(&amp;quot;les predateurs sont au nombre de:&amp;quot;,len(tab_predateur),&amp;quot;à la fin de la simulation&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que certaine ligne ne sont pas les mêmes que dans le pseudo code ou même que certaines règles n&#039;ont pas été respectées, tout cela est normal car vous verrez par la suite que nous avons été forcés de faire des changement pour le bon fonctionnement de la simulation et pour son optimisation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== La class Prédateur ====&lt;br /&gt;
&lt;br /&gt;
Cette classe comme son nom l&#039;indique sert à créer une entité de type prédateur, elle contient les attributs (définis dans le init) et méthodes (fonctions de la class) nécessaires à son bon fonctionnement&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Predateur:&lt;br /&gt;
    def __init__(self, x: int, y: int, n_faim: int, nrpred:int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrpred=nrpred&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
        self.n_faim = n_faim&lt;br /&gt;
        self.décompte_faim = n_faim&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche le prédateur sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 2&lt;br /&gt;
&lt;br /&gt;
    def se_deplacer(self, environnement: list, tab_proie: list, tab_predateur:list):&lt;br /&gt;
        &#039;&#039;&#039;Déplacement du prédateur&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_predateur(direction,tab_predateur)) and i&amp;lt;=3:&lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        self.verification_mange_proie(environnement,direction, tab_proie)&lt;br /&gt;
&lt;br /&gt;
        #Déplacement du prédateur&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_predateur(self, direction:tuple, tab_predateur: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si le prédateur ne se dirige pas vers un autre predateur&#039;&#039;&#039;&lt;br /&gt;
        for predateur in tab_predateur:&lt;br /&gt;
            if predateur.x == self.x+direction[0] and predateur.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def verification_mange_proie(self,environnement,direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;vérifie si le prédateur mange une proie&#039;&#039;&#039;&lt;br /&gt;
        new_x=self.x+direction[0]&lt;br /&gt;
        new_y=self.y+direction[1]&lt;br /&gt;
        for proie in tab_proie[:]:  # Copie pour éviter modification en boucle&lt;br /&gt;
            if proie.x == new_x and proie.y == new_y:&lt;br /&gt;
                tab_proie.remove(proie)  # La proie est mangée&lt;br /&gt;
                self.décompte_faim = self.n_faim&lt;br /&gt;
                environnement[proie.y][proie.x]=0&lt;br /&gt;
        # Réduction de la faim si rien n&#039;a été mangé&lt;br /&gt;
        self.décompte_faim -= 1  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La class Proie ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Proie:&lt;br /&gt;
    def __init__(self, x: int, y: int, nrproie: int):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.nrproie = nrproie&lt;br /&gt;
        self.reproduction = 0&lt;br /&gt;
&lt;br /&gt;
    def afficher(self,environnement):&lt;br /&gt;
        &#039;&#039;&#039;Affiche la proie sur la grille&#039;&#039;&#039;&lt;br /&gt;
        environnement[self.y][self.x] = 1&lt;br /&gt;
        &lt;br /&gt;
    def se_deplacer(self,environnement: list,tab_proie,tab_predateur):&lt;br /&gt;
        &#039;&#039;&#039;Fonction qui permet de déplacer une proie aléatoirement&#039;&#039;&#039;&lt;br /&gt;
        tab_direction=[(0,1),(1,0),(0,-1),(-1,0)]&lt;br /&gt;
        shuffle(tab_direction)&lt;br /&gt;
        direction = tab_direction[0]&lt;br /&gt;
        i=1&lt;br /&gt;
        while (not verification_direction_possible_bordures(self, direction, environnement) or not self.verification_direction_possible_autre_proie(direction, tab_proie) or not self.verification_direction_possible_predateur(direction,tab_predateur)) and i&amp;lt;=3  : &lt;br /&gt;
            direction=tab_direction[i]&lt;br /&gt;
            i+=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if i==4:&lt;br /&gt;
            direction=(0,0)#Pas de déplacement si aucune direction trouvée&lt;br /&gt;
&lt;br /&gt;
        #Déplacement de la proie&lt;br /&gt;
        self.x += direction[0]&lt;br /&gt;
        self.y += direction[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def verification_direction_possible_autre_proie(self, direction:tuple, tab_proie: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers une autre proie&#039;&#039;&#039;&lt;br /&gt;
        for proie in tab_proie:&lt;br /&gt;
            if proie.x == self.x+direction[0] and proie.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    def verification_direction_possible_predateur(self, direction:tuple, tab_pred: list):&lt;br /&gt;
        &#039;&#039;&#039;Vérifie si la proie ne se dirige pas vers un predateur&#039;&#039;&#039;&lt;br /&gt;
        for pred in tab_pred:&lt;br /&gt;
            if pred.x == self.x+direction[0] and pred.y == self.y+direction[1]:&lt;br /&gt;
                return False&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Les fonctions utilitaires ====&lt;br /&gt;
&lt;br /&gt;
Les fonctions que j&#039;ai appelées &amp;quot;utilitaires&amp;quot; sont des fonctions soit utilisées dans le programme principale, soit des fonctions communes aux deux classes que je n&#039;ai pas voulu dupliquer ou soit des fonctions utiles pour le débogage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def verification_direction_possible_bordures(self, direction: int, environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Vérifie si le déplacement est faisable par rapport aux bordures&#039;&#039;&#039;&lt;br /&gt;
    new_x=self.x+direction[0]&lt;br /&gt;
    new_y=self.y+direction[1]&lt;br /&gt;
    if new_y &amp;gt;= len(environnement) or new_y &amp;lt; 0 or new_x &amp;gt;= len(environnement[0]) or new_x &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afficher_environnement(environnement: list):&lt;br /&gt;
    &#039;&#039;&#039;Affichage de la grille&#039;&#039;&#039;&lt;br /&gt;
    print()&lt;br /&gt;
    for ligne in environnement:&lt;br /&gt;
        print(ligne)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def trouve_coordonnees_vide(environnement: list, tab_proie: list, tab_predateur: list):&lt;br /&gt;
    &#039;&#039;&#039;Trouve une case qui est vide  (elle n&#039;est occupée ni par une proie ni par un prédateur)&#039;&#039;&#039;&lt;br /&gt;
    cases_vides = []&lt;br /&gt;
    for y in range(len(environnement)):&lt;br /&gt;
        for x in range(len(environnement[0])):&lt;br /&gt;
            est_occupe = False&lt;br /&gt;
            for proie in tab_proie:&lt;br /&gt;
                if proie.x == x and proie.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            for predateur in tab_predateur:&lt;br /&gt;
                if predateur.x == x and predateur.y == y:&lt;br /&gt;
                    est_occupe = True&lt;br /&gt;
            &lt;br /&gt;
            if not est_occupe:&lt;br /&gt;
                cases_vides.append((x, y))&lt;br /&gt;
    &lt;br /&gt;
    if len(cases_vides) &amp;gt; 0:&lt;br /&gt;
        index = randint(0, len(cases_vides) - 1)&lt;br /&gt;
        return cases_vides[index]&lt;br /&gt;
    return None  # Retourne None si aucune case vide n&#039;est trouvée&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def info_predateur(predateur: Predateur):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;un predateur&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Prédateur: x={predateur.x}, y={predateur.y}, décompte_faim={predateur.décompte_faim}&#039;)&lt;br /&gt;
&lt;br /&gt;
def info_proie(proie: Proie):&lt;br /&gt;
    &#039;&#039;&#039;Affiche les informations d&#039;une proie&#039;&#039;&#039;&lt;br /&gt;
    print(f&#039;Proie: x={proie.x}, y={proie.y}&#039;)&lt;br /&gt;
&lt;br /&gt;
def est_iteration_apparition(i,nr_entite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifie si l&#039;iteration actuelle i est une itération ou une entite se reproduit &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return i % nr_entite == 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploration paramétrique ==&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Test_impl%C3%A9mentaion_3.png&amp;diff=15888</id>
		<title>Fichier:Test implémentaion 3.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Test_impl%C3%A9mentaion_3.png&amp;diff=15888"/>
		<updated>2025-05-11T11:14:20Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Test_impl%C3%A9mentaion_2.png&amp;diff=15887</id>
		<title>Fichier:Test implémentaion 2.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Test_impl%C3%A9mentaion_2.png&amp;diff=15887"/>
		<updated>2025-05-11T11:13:55Z</updated>

		<summary type="html">&lt;p&gt;Delameziere : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Delameziere</name></author>
	</entry>
</feed>