Skip to content

aliissaoui/Developping-Go-Agents-in-Python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 

Repository files navigation

############################################################################################## ##################################### PROJET IA - GO ########################################

Binome :

  • Achraf BENTAHER - Ali ISSAOUI

Encadrants: - Laurent Simon - Michaël Clément

##############################################################################################

Projet: Réalisation d'un joueur IA du jeu du GO. Dans ce projet on a implémenté un agent IA du jeu du GO en utilisant les techniques étudié dans le cours comme AlphaBeta, NegaMax, Iterative Deepening.

Pré-requis You need :

python numpy json Eventuellement multiprocessing si vous voulez tester le joueur qui l'utilise ( décrit juste après ) Lancement Plusieurs commandes sont possible comme précisé dans l'énoncé du projet: - python3 localGame.py : lance une partie de myPlayer vs myPlyaer - python3 namedGame.py aPlayer bPlayer : lance une partie de aPlayer vs bPlayer

Les joueurs disponibles sont randomPlayer et myPlayer.

Les joueurs: Nous avons d'abords plusieurs joueurs:

myPlayer.py : Le joueur principal utilisant AlphaBeta avec Iterative Deepening. NGPlayer.py : Un joueur secondaire utilisant NegaMax avec Iterative Deepening. abThreadedPlayer.py : Un joueur qui est hors la compétition, puisqu'il utilise un AlphaBeta avec multiprocessing. L'ouverture: Pour l'ouverture ( la même pour les 3 joueurs ), nous avons utilisé le fichier games.json pour récupérer à chaque fois les meilleurs ouvertures.

Les fichiers: eval.py : Ce fichier contient la fonction d'évaluation utilisée dans les recherches, cette fonction est divisé en plusieurs goals:

          Goal1   : Maximisation du nombre des pions de mes couleurs.
          Goal2   : Maximisation de mon nombre de libertés.
          Goal3   : Eviter les bordures du board.
          Goal31  : On a utilisé la distance de Manhattan pour jouer le plus proche possible du centre du plateau.
          Goal4   : Maximiser le nombre des pions qu'on capture.
          Goal5   : Maximiser le nombre de mes pions connectés. ( Non utilisé avec goal6 )
          Goal6   : Minimiser le nombre d'Euler, le nombre d'Euler se calcule à partir de quelques patterns dans le plateau et en
                  le minimisant on maximise le nombre des pions connectés et des cercles crées
                  source : http://erikvanderwerf.tengen.nl/pubdown/thesis_erikvanderwerf.pdf?fbclid=IwAR0rfZGdM_cRz8mklnvqHKSCcrxOLwid1gAx0NXVO2bGk8_incl39vP-kv8 ( Page 52 )

          ces goals sont finalement multipliés par des coefficients et sommés pour donner une évaluation du plateau.

alphaBeta.py : Ce fichier contient l'implémentation de la fonction de recherche AlphaBeta avec une profondeur spécifiée dans myPlayer.py L'implémentation est plus ou moins classique, sauf qu'on ne considère pas les bordures ( 2 cases puis une seul ) pendant les premiers tours du jeu puisque notre joueur préfère commencer au milieu.

negaMax.py : Ce fichier contient l'implémentation de la fonction de recherche NegaMax ( se basant sur l'AlphaBeta précédent ) avec une profondeur spécifiée dans myPlayer.py

abThreadedPlayer.py : Malheureusement, on ne savait pas que l'utilisation du multiprocessing est interdite, on l'avait quand même implémenté. Le principe étant de créer, dès la première itération de AlphaBetaCoup, un procéssus à chaque legal_move est de faire le calcul dans ce processus. Cette implémentation nous a beaucoup amélioré la vitesse des calculs, par exemple dans un petit teste on avait au début du jeu:

                                          Normal                          MultiProcessing
                          
                          Depth2  :         17s                                4s
                          Depth3  :         40s                                11s   

ids.py : Ce fichier continent l'implémentation de l'Iterative Deepening pour les 3 recherches précédents. Nous avons utiliser des signaux de type SIGALRM pour interempre la fonction de recherche avec un timeout une fois que le temps précisé dans le Xplayer.py est écoulé. L'implémentation de cette fonction à posé un problème avec la version Multiprocessing puisque le signal SIGALRM n'est envoyer qu'au processus courant, les autres processus restent donc actifs. On a trouvé une solution en sauvegardant les processus fils et les arrêtant avec termine() une fois que le temps est écoulé ( fonction IDS_AB_threaded dans ids.py )

Auteurs Étudiants de ENSEIRB-Matmeca :

Ali ISSAOUI Achraf Bentaher Remerciements Laurent Simon Michaël Clément

About

Go Game, board and players using python.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published