Master 1 SI - MADOCS 2009 – 2010 TP Intelligence Artificielle Sylvain Chevallier [email protected] TD 1 - Algorithme MinMax Rappel : MinMax Principe de l’algorithme MinMax : – MinMax(p)=evaluation(p) si p est une position terminale – MinMax(p)=max(MinMax(o1 ), ..., MinMax(on )) si p est une position joueur avec fils o1 , ..., on – MinMax(p)=min(MinMax(j1 ), ..., MinMax(jm )) si p est une position opposant avec fils j1 , ..., jm Question 1 : Illustrez sur la figure suivante la remontée des valeurs selon l’algorithme MinMax. Question 2 : Quel noeud faut-il choisir ? pourquoi ? Rappel : coupures α et β On considère que pour une position p donnée, il existe Cn = {c1 , . . . , ci , . . . , cn } coups suivants possibles. AlphaBeta(p, α, β) retourne valeur Si p est une position terminale, retourne evaluation(p) Si p est une position joueur Pour pi ∈ Cn faire α= max(α, AlphaBeta(p, α, β)) Si α > β, retourner α C’est une coupure β Retourner α Si p est une position opposant Pour pi ∈ Cn faire β= min(β, AlphaBeta(p, α, β)) Si α > β, retourner β C’est une coupure α Retourner β Question 3 : Complétez la figure suivante en utilisant la remontée des valeurs selon l’algorithme α-β. Indiquez les valeurs de α et β ainsi que les coupures. Application au puissance 4 On se propose d’appliquer l’algorithme MinMax à un jeu à deux joueurs simple : le puissance 4. Vous devrez : 1. Écrire un programme qui utilise MinMax pour jouer au puissance 4 contre un joueur humain. 2. Faire un compte-rendu de TP (5 pages environ) en suivant les indications données dans la section Compterendu. Programmation Les choix algorithmiques sont laissés à votre discrétion, vous êtes libre de proposer l’implémentation qui vous paraı̂t la plus adaptée. Vous pouvez vous inspirez de cet algorithme en pseudo-code (proposé par Fabien Torre, maı̂tre de conférence à Lille 3). Voici quelques indications pour vous aidez à plannifier l’écriture de votre programme : – Définissez la structure de donnée correspondant à un état de jeu – Programmez la fonction affiche(etat jeu ej) qui affiche à l’écran un état du jeu : grille, pions du joueur et pions adverses – Écrivez les fonctions qui vérifient si un coup est légal et qui vérifient si un état de jeu est gagnant, perdant ou nul. – Écrivez un programme qui permet de jouer à deux joueurs humains (pas d’IA). – Programmez la fonction etats suivant(etat jeu ej) qui génère les états de jeux accessibles à partir de ej (c’est a dire la liste des coups suivants possibles). – Définissez et programmez la fonction evaluation(etat jeu ej) qui retourne le score correspondant à l’état de jeu ej. (Attention, selon le niveau de profondeur de la recherche, cette évaluation peut dépendre du joueur auquel correspond ej. – Définissez et programmez une fonction estjoueur(etat jeu ej) qui sert à déterminer si un état de jeu correspond au joueur ou à l’adversaire. – Implémentez l’algorithme MinMax, de manière a ce qu’il retourne un pointeur vers l’etat à jouer. – Implementez le tour de jeu pour pouvoir jouer avec l’utilisateur. Compte-rendu Vous devrez rendre un compte-rendu, sous format électronique (PDF), envoyé par mail à l’enseignant. Ce compte-rendu doit être structuré en deux parties : la première présente le contexte du TP et la seconde détaille les choix d’implémentations et les résultats obtenus. Dans la première partie, vous présenterez l’algorithme MinMax et le jeu de puissance 4. Les solutions que vous aurez retenues pour votre programme doivent être présentées et argumentées dans la secondes partie. Vous devez joindre les fichiers de votre programme (.c, .h et makefile) à votre compte-rendu. Facultatif Vous pouvez convenir avec un autre étudiant d’un protocole d’echange des coups que recupérerait votre programme (fichier, reseau, etc...), afin de faire jouer les programmes les uns contre les autre et d’améliorer les heuristiques selon les victoires/echecs de programmes.