<?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=Cfaucon</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=Cfaucon"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Cfaucon"/>
	<updated>2026-05-21T06:25:56Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15637</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15637"/>
		<updated>2024-05-25T10:45:37Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : /* Définition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc un système qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;br /&gt;
[[File:Figure7.png|thumb|300px|Interface graphique]]&lt;br /&gt;
&lt;br /&gt;
Afin que les tests, que ce soit pour moi ou les personnes de mon entourage pour tester la qualité de mon puissance 4, soient plus agréables, nous avons mis en place un interface graphique.&lt;br /&gt;
&lt;br /&gt;
Cette interface fait appel à la bibliothèque tkinter. &lt;br /&gt;
Tkinter est un module intégré à la bibliothèque standard de Python, permettant de créer des interfaces graphiques en créant:&lt;br /&gt;
&lt;br /&gt;
*Des fenêtres,&lt;br /&gt;
*Des widgets (boutons, zones de texte, cases à cocher, …),&lt;br /&gt;
*Des évènements (clavier, souris, …).&lt;br /&gt;
&lt;br /&gt;
Grace à celle-ci, nous avons pu créer un Canvas dans un fenêtre (fenêtre qui s&#039;ouvrira lors de l&#039;appel de la fonction de jeu) qui permettra au joueur de poser son pion à l&#039;aide de bouton correspondant à des colonnes plutôt que sur la console python. &lt;br /&gt;
Dans son fonctionnement général après avoir créé la fenêtre ainsi que le Canvas, les boutons vont renvoyer la valeur de la colonne dans laquelle l&#039;utilisateur souhaite jouer. Grace à cela il ne nous reste plus qu&#039;a ajouter cette colonne dans une fonction permettant de poser le pion dans la colonne souhaité.&lt;br /&gt;
&lt;br /&gt;
Dans la figure ci-dessus les pions roses sont ceux joués par l&#039;utilisateur et ceux violets par l&#039;ordinateur.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15590</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15590"/>
		<updated>2024-05-21T23:50:43Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : /* Interface graphique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;br /&gt;
[[File:Figure7.png|thumb|300px|Interface graphique]]&lt;br /&gt;
&lt;br /&gt;
Afin que les tests, que ce soit pour moi ou les personnes de mon entourage pour tester la qualité de mon puissance 4, soient plus agréables, nous avons mis en place un interface graphique.&lt;br /&gt;
&lt;br /&gt;
Cette interface fait appel à la bibliothèque tkinter. &lt;br /&gt;
Tkinter est un module intégré à la bibliothèque standard de Python, permettant de créer des interfaces graphiques en créant:&lt;br /&gt;
&lt;br /&gt;
*Des fenêtres,&lt;br /&gt;
*Des widgets (boutons, zones de texte, cases à cocher, …),&lt;br /&gt;
*Des évènements (clavier, souris, …).&lt;br /&gt;
&lt;br /&gt;
Grace à celle-ci, nous avons pu créer un Canvas dans un fenêtre (fenêtre qui s&#039;ouvrira lors de l&#039;appel de la fonction de jeu) qui permettra au joueur de poser son pion à l&#039;aide de bouton correspondant à des colonnes plutôt que sur la console python. &lt;br /&gt;
Dans son fonctionnement général après avoir créé la fenêtre ainsi que le Canvas, les boutons vont renvoyer la valeur de la colonne dans laquelle l&#039;utilisateur souhaite jouer. Grace à cela il ne nous reste plus qu&#039;a ajouter cette colonne dans une fonction permettant de poser le pion dans la colonne souhaité.&lt;br /&gt;
&lt;br /&gt;
Dans la figure ci-dessus les pions roses sont ceux joués par l&#039;utilisateur et ceux violets par l&#039;ordinateur.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15589</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15589"/>
		<updated>2024-05-21T23:49:45Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;br /&gt;
[[File:Figure7.png|thumb|300px|Interface graphique]]&lt;br /&gt;
&lt;br /&gt;
Afin que les tests, que ce soit pour moi ou les personnes de mon entourage pour tester la qualité de mon puissance 4, soient plus agréables, nous avons mis en place un interface graphique.&lt;br /&gt;
&lt;br /&gt;
Cette interface fait appel à la bibliothèque tkinter. &lt;br /&gt;
Tkinter est un module intégré à la bibliothèque standard de Python, permettant de créer des interfaces graphiques en créant:&lt;br /&gt;
&lt;br /&gt;
*Des fenêtres,&lt;br /&gt;
*Des widgets (boutons, zones de texte, cases à cocher, …),&lt;br /&gt;
*Des évènements (clavier, souris, …).&lt;br /&gt;
&lt;br /&gt;
Grace à celle-ci, nous avons pu créer un Canvas dans un fenêtre (fenêtre qui s&#039;ouvrira lors de l&#039;appel de la fonction de jeu) qui permettra au joueur de poser son pion à l&#039;aide de bouton correspondant à des colonnes plutôt que sur la console python. &lt;br /&gt;
Dans son fonctionnement général après avoir créé la fenêtre ainsi que le Canvas, les boutons vont renvoyer la valeur de la colonne dans laquelle l&#039;utilisateur souhaite jouer. Grace à cela il ne nous reste plus qu&#039;a ajouter cette colonne dans une fonction permettant de poser le pion dans la colonne souhaité.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure7.png&amp;diff=15588</id>
		<title>Fichier:Figure7.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure7.png&amp;diff=15588"/>
		<updated>2024-05-21T23:49:31Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15587</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15587"/>
		<updated>2024-05-21T23:49:16Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : /* Interface graphique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;br /&gt;
[[File:figure7.png|thumb|300px|Interface graphique]]&lt;br /&gt;
&lt;br /&gt;
Afin que les tests, que ce soit pour moi ou les personnes de mon entourage pour tester la qualité de mon puissance 4, soient plus agréables, nous avons mis en place un interface graphique.&lt;br /&gt;
&lt;br /&gt;
Cette interface fait appel à la bibliothèque tkinter. &lt;br /&gt;
Tkinter est un module intégré à la bibliothèque standard de Python, permettant de créer des interfaces graphiques en créant:&lt;br /&gt;
&lt;br /&gt;
*Des fenêtres,&lt;br /&gt;
*Des widgets (boutons, zones de texte, cases à cocher, …),&lt;br /&gt;
*Des évènements (clavier, souris, …).&lt;br /&gt;
&lt;br /&gt;
Grace à celle-ci, nous avons pu créer un Canvas dans un fenêtre (fenêtre qui s&#039;ouvrira lors de l&#039;appel de la fonction de jeu) qui permettra au joueur de poser son pion à l&#039;aide de bouton correspondant à des colonnes plutôt que sur la console python. &lt;br /&gt;
Dans son fonctionnement général après avoir créé la fenêtre ainsi que le Canvas, les boutons vont renvoyer la valeur de la colonne dans laquelle l&#039;utilisateur souhaite jouer. Grace à cela il ne nous reste plus qu&#039;a ajouter cette colonne dans une fonction permettant de poser le pion dans la colonne souhaité.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15586</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15586"/>
		<updated>2024-05-21T23:48:43Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Interface graphique]]&lt;br /&gt;
&lt;br /&gt;
Afin que les tests, que ce soit pour moi ou les personnes de mon entourage pour tester la qualité de mon puissance 4, soient plus agréables, nous avons mis en place un interface graphique.&lt;br /&gt;
&lt;br /&gt;
Cette interface fait appel à la bibliothèque tkinter. &lt;br /&gt;
Tkinter est un module intégré à la bibliothèque standard de Python, permettant de créer des interfaces graphiques en créant:&lt;br /&gt;
&lt;br /&gt;
*Des fenêtres,&lt;br /&gt;
*Des widgets (boutons, zones de texte, cases à cocher, …),&lt;br /&gt;
*Des évènements (clavier, souris, …).&lt;br /&gt;
&lt;br /&gt;
Grace à celle-ci, nous avons pu créer un Canvas dans un fenêtre (fenêtre qui s&#039;ouvrira lors de l&#039;appel de la fonction de jeu) qui permettra au joueur de poser son pion à l&#039;aide de bouton correspondant à des colonnes plutôt que sur la console python. &lt;br /&gt;
Dans son fonctionnement général après avoir créé la fenêtre ainsi que le Canvas, les boutons vont renvoyer la valeur de la colonne dans laquelle l&#039;utilisateur souhaite jouer. Grace à cela il ne nous reste plus qu&#039;a ajouter cette colonne dans une fonction permettant de poser le pion dans la colonne souhaité.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15585</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15585"/>
		<updated>2024-05-21T23:48:04Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : /* Interface graphique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;br /&gt;
Afin que les tests, que ce soit pour moi ou les personnes de mon entourage pour tester la qualité de mon puissance 4, soient plus agréables, nous avons mis en place un interface graphique.&lt;br /&gt;
&lt;br /&gt;
Cette interface fait appel à la bibliothèque tkinter. &lt;br /&gt;
Tkinter est un module intégré à la bibliothèque standard de Python, permettant de créer des interfaces graphiques en créant:&lt;br /&gt;
&lt;br /&gt;
*Des fenêtres,&lt;br /&gt;
*Des widgets (boutons, zones de texte, cases à cocher, …),&lt;br /&gt;
*Des évènements (clavier, souris, …).&lt;br /&gt;
&lt;br /&gt;
Grace à celle-ci, nous avons pu créer un Canvas dans un fenêtre (fenêtre qui s&#039;ouvrira lors de l&#039;appel de la fonction de jeu) qui permettra au joueur de poser son pion à l&#039;aide de bouton correspondant à des colonnes plutôt que sur la console python. &lt;br /&gt;
Dans son fonctionnement général après avoir créé la fenêtre ainsi que le Canvas, les boutons vont renvoyer la valeur de la colonne dans laquelle l&#039;utilisateur souhaite jouer. Grace à cela il ne nous reste plus qu&#039;a ajouter cette colonne dans une fonction permettant de poser le pion dans la colonne souhaité.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15584</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15584"/>
		<updated>2024-05-21T23:36:49Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|240px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|230px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous utilisons toutes les étapes énoncés précédemment en faisant appel à des fonctions complémentaire pour récupérer les informations dont nous avons besoin.&lt;br /&gt;
Il nous suffit plus que de récupérer le résultat en faisant bien attention de prendre la première valeur du tuple.&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15583</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15583"/>
		<updated>2024-05-21T23:33:26Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|300px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|300px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;br /&gt;
&lt;br /&gt;
== Code et programmation == &lt;br /&gt;
=== Minimax &amp;amp; Alpha Bêta ===&lt;br /&gt;
&lt;br /&gt;
Avec toutes les informations fournies précédemment, nous avons donc pu coder une fonction minimax opérationnelle. &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
def minimax_alpha_beta(plateau:list, profondeur:int, joueur_maximise:bool, alpha, beta):&lt;br /&gt;
    colonnes_disponibles = colonnes_valides(plateau)         #La fonction colonnes_valides renvoies sous forme de tableau les colonnes dans lesquelles il est possible de jouer                &lt;br /&gt;
    fin_jeu = est_finie(plateau)&lt;br /&gt;
    &lt;br /&gt;
    if fin_jeu:                                              #Vérification si le jeu est finie (victoire ou match nul), dans ce cas on a pas besoin de l&#039;algorithme&lt;br /&gt;
        if victoire(plateau, IA)[0]:&lt;br /&gt;
            return (-1, float(&#039;inf&#039;))      &lt;br /&gt;
        elif victoire(plateau, JOUEUR)[0]:&lt;br /&gt;
            return (-1, -float(&#039;inf&#039;))      &lt;br /&gt;
        else:&lt;br /&gt;
            return (-1, 0)        #8484&lt;br /&gt;
    if profondeur == 0:                                      #Si nous sommes a la profondeur 0, nous faisons appel à l&#039;heuristique&lt;br /&gt;
        return (-1, H(plateau, IA))    #8484&lt;br /&gt;
&lt;br /&gt;
    if joueur_maximise:                                      #Nous entrons dans le cas où c&#039;est au tour de l&#039;ordinateur de jouer car c&#039;est le joueur qui maximise&lt;br /&gt;
        colonne_choisie =colonnes_disponibles[0]&lt;br /&gt;
        valeur_max = -float(&#039;inf&#039;)                           #On initialise la valeur maximale puis nous créons l&#039;arbre de jeu en visualisant toutes les possibilité de coups.&lt;br /&gt;
&lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = IA&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1] #Tant que profondeur != 0 nous continuons d&#039;appeler la fonction&lt;br /&gt;
            if nouvelle_valeur &amp;gt; valeur_max:&lt;br /&gt;
                valeur_max = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_max &amp;gt; beta:                            #Nous faisons appel à alpha bêta en utilisant la règle vu au dessus                        &lt;br /&gt;
               return (colonne_choisie, valeur_max)&lt;br /&gt;
            alpha  = max(alpha ,valeur_max)&lt;br /&gt;
        return (colonne_choisie, valeur_max)&lt;br /&gt;
    &lt;br /&gt;
    else:                                                     #Nous faisons de même pour le joueur c&#039;est a dire celui qui minimise&lt;br /&gt;
        valeur_min = float(&#039;inf&#039;)&lt;br /&gt;
        colonne_choisie = colonnes_disponibles[0]                             &lt;br /&gt;
        for col in colonnes_disponibles:&lt;br /&gt;
            ligne_vide = prochain_ligne_vide(plateau, col)&lt;br /&gt;
            plateau_copie = copy.deepcopy(plateau)&lt;br /&gt;
            plateau_copie[ligne_vide][col] = JOUEUR&lt;br /&gt;
            nouvelle_valeur = minimax_alpha_beta(plateau_copie, profondeur - 1, False, alpha, beta)[1]&lt;br /&gt;
            if nouvelle_valeur &amp;lt; valeur_min:&lt;br /&gt;
                valeur_min = nouvelle_valeur&lt;br /&gt;
                colonne_choisie = col&lt;br /&gt;
            if valeur_min &amp;lt; alpha:&lt;br /&gt;
                return (colonne_choisie, valeur_min)&lt;br /&gt;
            beta = min(beta, valeur_min)&lt;br /&gt;
        return (colonne_choisie, valeur_min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface graphique ===&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15582</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15582"/>
		<updated>2024-05-21T23:18:01Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|200px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|300px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|300px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15581</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15581"/>
		<updated>2024-05-21T23:17:35Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|250px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|300px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|300px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15580</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15580"/>
		<updated>2024-05-21T23:17:07Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|300px|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|300px|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|300px|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|300px|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|300px|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|300px|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15579</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15579"/>
		<updated>2024-05-21T23:13:34Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|right|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|right|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|right|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
* Exemple 1&lt;br /&gt;
[[File:figure5.png|thumb|right|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
* Exemple 2&lt;br /&gt;
[[File:figure6.png|thumb|right|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15578</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15578"/>
		<updated>2024-05-21T23:12:58Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
[[File:figure2.png|thumb|right|heuristique]]&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
[[File:figure3.png|thumb|right|Minimax]]&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|right|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Exemple 1 ====&lt;br /&gt;
[[File:figure5.png|thumb|right|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
==== Exemple 2 ====&lt;br /&gt;
[[File:figure6.png|thumb|right|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure6.png&amp;diff=15577</id>
		<title>Fichier:Figure6.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure6.png&amp;diff=15577"/>
		<updated>2024-05-21T23:11:58Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure5.png&amp;diff=15576</id>
		<title>Fichier:Figure5.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure5.png&amp;diff=15576"/>
		<updated>2024-05-21T23:11:11Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure4.png&amp;diff=15575</id>
		<title>Fichier:Figure4.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure4.png&amp;diff=15575"/>
		<updated>2024-05-21T23:09:44Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure3.png&amp;diff=15574</id>
		<title>Fichier:Figure3.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure3.png&amp;diff=15574"/>
		<updated>2024-05-21T23:07:47Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure2.png&amp;diff=15573</id>
		<title>Fichier:Figure2.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure2.png&amp;diff=15573"/>
		<updated>2024-05-21T23:06:06Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15572</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15572"/>
		<updated>2024-05-21T23:05:43Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
[[File:figure1.png|thumb|Arbre de jeu]]&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
[[File:figure2.png|thumb|right|heuristique]]&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
[[File:figure3.png|thumb|right|Minimax]]&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|right|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Exemple 1 ====&lt;br /&gt;
[[File:figure5.png|thumb|right|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
==== Exemple 2 ====&lt;br /&gt;
[[File:figure6.png|thumb|right|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15571</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15571"/>
		<updated>2024-05-21T23:05:26Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
[[File:figure1.png|thumb|Arbre de jeu]]&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
[[File:figure2.png|thumb|right|heuristique]]&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
[[File:figure3.png|thumb|right|Minimax]]&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|right|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Exemple 1 ====&lt;br /&gt;
[[File:figure5.png|thumb|right|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
==== Exemple 2 ====&lt;br /&gt;
[[File:figure6.png|thumb|right|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15570</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15570"/>
		<updated>2024-05-21T23:04:57Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
[[File:figure1.png|thumb|right|Arbre de jeu]]&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
[[File:figure2.png|thumb|right|heuristique]]&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
[[File:figure3.png|thumb|right|Minimax]]&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:figure4.png|thumb|right|Exemple Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Exemple 1 ====&lt;br /&gt;
[[File:figure5.png|thumb|right|Exemple1 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
==== Exemple 2 ====&lt;br /&gt;
[[File:figure6.png|thumb|right|Exemple2 alpha bêta]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure1.png&amp;diff=15569</id>
		<title>Fichier:Figure1.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Figure1.png&amp;diff=15569"/>
		<updated>2024-05-21T23:02:27Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15568</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15568"/>
		<updated>2024-05-21T22:52:19Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
[[File:Example.jpg|alt=Exemple d&#039;image|thumb|right|300px|Ceci est une légende]]&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
[[File:Heuristique_puissance4.png|alt=Heuristique Puissance 4|thumb|center|Exemple d&#039;heuristique pour le Puissance 4]]&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Exemple 1 ====&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
==== Exemple 2 ====&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15567</id>
		<title>Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Impl%C3%A9mentation_d%27une_IA_pour_le_jeu_Puissance_4_%C3%A0_l%27aide_de_l%27algorithme_alpha-beta&amp;diff=15567"/>
		<updated>2024-05-21T22:51:52Z</updated>

		<summary type="html">&lt;p&gt;Cfaucon : Page créée avec « Tuteur: Valentin Gledel Etudiante: Chloe Faucon  == Introduction == Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&amp;#039;affrontent afin d&amp;#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tuteur: Valentin Gledel&lt;br /&gt;
Etudiante: Chloe Faucon&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Puissance 4 est un jeu créé en 1974 dont les règles sont très simples. Sur un plateau de 7 colonnes et 6 lignes, deux joueurs s&#039;affrontent afin d&#039;aligner 4 de leurs pions. Il y a 2 façons de finir le jeu : soit par un match nul lorsque le plateau est rempli sans aucun alignement réalisé, soit en ayant réalisé un alignement vertical, horizontal ou diagonal. Le but de ce projet est donc de pouvoir coder une IA pour pouvoir jouer contre. Cette IA sera codée à l’aide des fonctions minimax et alpha bêta, mais pour cela, il faut connaître des notions essentielles qui sont : l’arbre des jeux et les heuristiques.&lt;br /&gt;
&lt;br /&gt;
== Arbre de jeu ==&lt;br /&gt;
=== Définition ===&lt;br /&gt;
Un arbre de jeu représente l’ensemble des coups successifs menant à toutes les positions possibles dans le plateau. C’est donc une structure qui permet de représenter toutes les positions possibles d&#039;un jeu. Elle représente également les mouvements qui peuvent être effectués à partir de chaque position. On part d’une position initiale pour explorer toutes les autres possibles.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
Un arbre de jeu est construit de la manière suivante :&lt;br /&gt;
* La racine : La racine de l&#039;arbre représente l&#039;état initial / la position de départ du jeu, où aucune décision n&#039;a encore été prise. C’est le début du jeu.&lt;br /&gt;
* Les branches de l’arbre : Les branches entre les nœuds représentent les mouvements possibles d&#039;une position à une autre, faisant passer le jeu d’un état A à un état B.&lt;br /&gt;
* Les nœuds : Chaque nœud de l&#039;arbre représente une position/un coup possible du jeu à un certain moment. Les nœuds sont uniques et dépendent les uns des autres.&lt;br /&gt;
* Les feuilles : Les nœuds de l&#039;arbre qui n&#039;ont pas d&#039;autres nœuds enfants (nœuds reliés par une branche à un nœud suivant) sont appelés des feuilles. Ils représentent les positions finales du jeu.&lt;br /&gt;
&lt;br /&gt;
[[File:Example.jpg|alt=Exemple d&#039;image|thumb|right|300px|Ceci est une légende]]&lt;br /&gt;
&lt;br /&gt;
=== Profondeur ===&lt;br /&gt;
La profondeur permet de savoir jusqu&#039;où l&#039;arbre va s&#039;étendre. Il s&#039;agit de la distance entre la racine et les feuilles. Il faut prendre en compte que la racine de l&#039;arbre est de profondeur 0. La profondeur de l&#039;arbre permet de représenter le nombre de coups joués dans le jeu à partir de la position de départ. Plus l&#039;arbre est profond, plus il explore de coups possibles, meilleur sera le résultat final.&lt;br /&gt;
&lt;br /&gt;
=== But ===&lt;br /&gt;
L&#039;étude et l&#039;utilisation d&#039;un arbre de jeu permettent de visualiser et d&#039;analyser les différentes stratégies et leurs résultats en considérant toutes les actions possibles à chaque étape du jeu, d&#039;analyser et de déterminer les meilleures stratégies et enfin de prédire les mouvements futurs des adversaires pour pouvoir anticiper les résultats.&lt;br /&gt;
&lt;br /&gt;
== 3) Heuristique ==&lt;br /&gt;
===  Définition ===&lt;br /&gt;
Une heuristique est une fonction d&#039;évaluation utilisée pour estimer la valeur ou la qualité d&#039;une position dans un jeu. Dans l&#039;étude de l&#039;arbre, cette fonction sera uniquement utilisée au niveau des feuilles. Cette fonction peut permettre de savoir qui des 2 joueurs est en train de gagner.&lt;br /&gt;
&lt;br /&gt;
===  Exemple ===&lt;br /&gt;
Dans le jeu des échecs, une heuristique simple pourrait être celle prenant en compte le nombre de pions présents dans le plateau. S&#039;il y a plus de pions blancs présents sur le plateau, le résultat sera positif ou négatif (dépendant des caractéristiques des joueurs) et inversement pour les pions noirs.&lt;br /&gt;
Dans le cadre du Puissance 4, une heuristique efficace est celle renvoyant toutes les possibilités d&#039;alignement d&#039;un pion en fonction de sa position. Nous comprenons mieux ce concept à l&#039;aide de la figure 2, où le résultat renvoyé par l&#039;heuristique sera 4 car le pion peut effectuer 2 alignements horizontaux, 1 en vertical et un autre en diagonal.&lt;br /&gt;
&lt;br /&gt;
[[File:Heuristique_puissance4.png|alt=Heuristique Puissance 4|thumb|center|Exemple d&#039;heuristique pour le Puissance 4]]&lt;br /&gt;
&lt;br /&gt;
== 4) Minimax ==&lt;br /&gt;
=== Contexte ===&lt;br /&gt;
Minimax avec l&#039;élagage Alpha Bêta est connu comme étant le premier algorithme à avoir battu le champion du monde d&#039;échecs Garry Kasparov le 11 mai 1997. Ce jour marque l&#039;histoire pour l&#039;avancée de l&#039;intelligence artificielle. On doit cet algorithme ainsi qu&#039;un théorème lié, à John Von Neumann. L&#039;algorithme Minimax permet donc de jouer/résoudre des jeux de stratégie en évaluant les positions de jeu et en choisissant les actions de manière à maximiser le gain tout en minimisant les pertes possibles. Pour cela, il utilise des notions fondamentales telles que les arbres comme vu précédemment ou encore la récursivité.&lt;br /&gt;
&lt;br /&gt;
===  Étapes de fonctionnement ===&lt;br /&gt;
*Étape n°1 : La réalisation et exploitation de l&#039;arbre de jeu:&lt;br /&gt;
Au moment précis du jeu, l&#039;algorithme va explorer toutes les possibilités de coups et positions à l&#039;aide de l&#039;arbre et d&#039;une profondeur mise en paramètre au préalable.&lt;br /&gt;
&lt;br /&gt;
*Étape n°2 : Utilisation de l&#039;heuristique :&lt;br /&gt;
Après avoir construit tout l&#039;arbre, il est maintenant temps de faire appel à l&#039;heuristique au niveau des feuilles afin de faire remonter la valeur correspondant au coup optimal pour le joueur.&lt;br /&gt;
&lt;br /&gt;
*Étape n°3 : Caractérisation des joueurs :&lt;br /&gt;
Nous avons donc 2 joueurs : Un joueur max, il s&#039;agit du joueur qui va chercher à maximiser son score ainsi qu&#039;un joueur min qui va lui chercher à minimiser son score. Dans l&#039;arbre, chacun des joueurs représentera alternativement une ligne de l&#039;arbre. Les nœuds de ces lignes seront des nœuds max (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur maximisant, ou alors des nœuds min (récupérant la valeur la plus grande de ses enfants) s&#039;il s&#039;agit de la ligne du joueur minimisant.&lt;br /&gt;
&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
*Étape n° 4 : La remontée des valeurs :&lt;br /&gt;
Pour chaque nœud, la valeur est calculée en fonction des valeurs de ses nœuds enfants. Si c&#039;est le tour du joueur MAX (celui qui cherche à maximiser son score, l’ordinateur dans le cadre de Minimax), le nœud parent prendra la valeur maximale de ses enfants. Si c&#039;est le tour du joueur MIN (celui qui cherche à minimiser le score de l&#039;adversaire), le nœud parent prendra la valeur minimale de ses enfants. Une fois que la valeur est remontée jusqu&#039;à la racine de l&#039;arbre, le joueur choisit le coup correspondant à la branche avec la valeur maximale si c&#039;est son tour, ou la valeur minimale si c&#039;est le tour de l&#039;adversaire. Il s’agit du meilleur coup à jouer dans la position actuelle selon l&#039;algorithme Minimax. Dans le cadre du Puissance 4, nous obtiendrons la meilleure colonne dans laquelle il faut jouer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
Dans cet arbre de profondeur 3 très simple car l’algorithme Minimax n’a calculé que 14 coups, nous avons bien calculé les valeurs des feuilles à l’aide d’une heuristique. Après cela, le joueur maximisant a fait remonter les plus grandes valeurs parmi ses nœuds enfants (ici nous avons bien 4,6,-5,11). Ensuite, nous passons au tour du joueur minimisant et on réitère les mêmes actions. On prend les valeurs minimales entre les nœuds frères du nœud parent. Nous faisons ces actions jusqu’à remonter à l’origine. A l’origine ne remonte donc plus qu’une seule valeur : celle liée au meilleur coup. Il ne nous reste plus qu’à récupérer le nœud lié à la valeur présente à l’origine de l’arbre. On fait remonter les valeurs pour qu’à la fin il ne reste qu’une valeur liée à un nœud : la meilleure.&lt;br /&gt;
&lt;br /&gt;
En conclusion:&lt;br /&gt;
L&#039;algorithme Minimax permet ainsi de déterminer le meilleur mouvement pour l’ordinateur, en prenant en compte les réponses optimales du joueur. Cela garantit que chaque décision prise maximise les gains potentiels de Max tout en minimisant les pertes potentielles dues aux mouvements adverses.&lt;br /&gt;
&lt;br /&gt;
=== Désavantages ===&lt;br /&gt;
Minimax est un algorithme qui fonctionne très bien cependant son efficacité est liée à la valeur de la profondeur. Plus la profondeur est grande, meilleur sera le résultat. Cependant, à partir d’une certaine profondeur, l’algorithme devient de plus en plus lent ce qui ne rend pas l’expérience de jeu agréable. Pour des problèmes concrets, le nombre de coups peut être très élevé, ce qui augmente grandement le temps de calcul. On peut passer pour le Puissance 4 d&#039;environ une seconde en profondeur 3 à 30 secondes en profondeur 7. Et il s’agit du temps pour un coup. Il nous faut donc trouver une solution pour réduire les temps de coups. Cette solution est l’élagage Alpha Bêta.&lt;br /&gt;
&lt;br /&gt;
== Elagage Alpha Bêta ==&lt;br /&gt;
==== Définition ====&lt;br /&gt;
L’élagage Alpha bêta consiste à supprimer des branches de l’arbre. En faisant cela, nous réduisons le nombre de nœuds qui ne servent pas, c’est-à-dire qui ne changent en rien le résultat final si celles-ci sont explorées ou non. Ce fonctionnement permettra donc de réduire considérablement le temps de calcul de Minimax puisque nous réduisons le nombre de nœuds. Pour ce faire, nous allons exploiter l&#039;arbre des possibles pendant la remontée.&lt;br /&gt;
&lt;br /&gt;
====Alpha et Bêta ====&lt;br /&gt;
Nous allons introduire des bornes Alpha et Bêta qui vont être transmises de père en fils et modifiées en fonction des évaluations qui sont faites.&lt;br /&gt;
Alpha : Représente le score maximum pour le joueur maximisant. Sa valeur ne peut qu’augmenter. De ce fait, il est initialisé à -∞. Il est mis à jour lors de l’étude d’un nœud MAX.&lt;br /&gt;
Bêta : Représente le score minimum pour le joueur minimisant. Sa valeur peut que baisser et est donc initialisé à +∞. Il sera mis à jour lors de l’étude d’un nœud MIN.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement de l’élagage ===&lt;br /&gt;
À chaque nœud Max, l&#039;algorithme cherche le score maximal parmi les enfants du nœud. Si ce score est supérieur ou égal à bêta, la branche est élaguée.&lt;br /&gt;
&lt;br /&gt;
À chaque nœud Min, l&#039;algorithme cherche le score minimal parmi les enfants du nœud. Si ce score est inférieur ou égal à alpha, la branche est élaguée car Max.&lt;br /&gt;
&lt;br /&gt;
Pour résumer : Si la valeur d&#039;un nœud Min est inférieure ou égale à alpha, l&#039;algorithme arrête d&#039;explorer ce nœud. Si la valeur d&#039;un nœud Max devient supérieure ou égale à bêta, l&#039;algorithme arrête d&#039;explorer ce nœud. Voici donc la règle : si Alpha est supérieur ou égal à Bêta, alors on peut élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Exemple 1 ====&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
Nous étudions tout d’abord le premier nœud en remontant la valeur maximale des 2 feuilles qui lui sont fils. Il s’agit d’un nœud MAX, donc Alpha prend comme valeur 8. Nous remontons cette valeur à son père qui est un nœud MIN, donc Bêta prend la valeur 8. &lt;br /&gt;
Étudions maintenant le frère du nœud MAX. La première feuille donne une valeur de 9. La valeur du nœud MAX sera donc 9. Nous mettons à jour Alpha à 9. Cependant on constate que alpha (9) supérieur à Bêta (8), donc nous pouvons élaguer la branche.&lt;br /&gt;
&lt;br /&gt;
==== Exemple 2 ====&lt;br /&gt;
[[File:Arbre_minimax.png|alt=Arbre Minimax|thumb|center|Exemple d&#039;arbre pour l&#039;algorithme Minimax]]&lt;br /&gt;
&lt;br /&gt;
Faisons pareil pour cet arbre qui est la suite de l’arbre plus haut, c’est pour cela que nous avons déjà la valeur d’Alpha à 8 qui est la valeur actuelle de la racine de l’arbre. Par le même procédé que celui vu précédemment, nous étudions les premières feuilles, nous faisons remonter cette valeur jusqu’au nœud fils de la racine. Cela nous permet d’obtenir un premier Bêta à 2 et Alpha à 8. Nous constatons pour le nœud MIN qu’Alpha est supérieur à Bêta, nous pouvons donc élaguer.&lt;br /&gt;
&lt;br /&gt;
===  Conclusion ===&lt;br /&gt;
L&#039;élagage Alpha Bêta est une technique qui permet de réduire le nombre de nœuds explorés dans l&#039;arbre de jeu en éliminant les branches qui ne contribuent pas à la décision finale, tout en garantissant que la même décision soit prise que si l&#039;arbre complet avait été exploré. Cela permet de réduire significativement le temps nécessaire pour prendre une décision dans des jeux complexes.&lt;/div&gt;</summary>
		<author><name>Cfaucon</name></author>
	</entry>
</feed>