Commit 2a4929e3 authored by LARIVIERE Axel's avatar LARIVIERE Axel
Browse files

vraie fin du readme

parent 5d2f1f22
README Mutorere_IAS
#### Clément Dufaix et Axel Lariviere ####
#### Clément Dufaix et Axel Lariviere ####
Tout ce projet a été développé en python et utilise les librairies matplotlib et numpy. Le jeu oppose un agent doté d'une intelligence artificielle entraîné avec de l'apprentissage par renforcement en utilisant le principe SARSA contre un agent qui joue de manière totalement aléatoire.
Liste des éléments à réaliser :
• Simuler le jeu du Mutorere
• Pouvoir faire jouer deux joueurs réels
• Implémenter un outil graphique (Qt5) pour avoir un visuel de l’application
• Ajouter un agent utilisant l’algorithme SARSA
• Ajouter un agent random pour entraîner l’algorithme SARSA
• Réaliser un compte-rendu des performances de l’algorithme SARSA
• Faire affronter un joueur réel avec l’agent SARSA entraîné
• Confronter SARSA au Q-learning pour comparer leurs performances
#### La classe Game ####
Cette classe est la classe centrale du jeu, elle contient différents attributs et méthodes dont on listera les plus importants :
• Le plateau de jeu (boardGame), qui est un tableau de 9 entiers, où l’on peut retrouver 3 valeurs (0,1 ou 2),
Cette classe est la classe centrale du jeu, elle contient différents attributs et méthodes dont on listera les plus importants :
• Le plateau de jeu (boardGame), qui est un tableau de 9 entiers, où l’on peut retrouver 3 valeurs (0 : vide,1 : pion joueur 1 ou 2 : pion joueur 2), par exemple le plateau de base contient : [1,1,1,1,2,2,2,2,0].
• Le GameManager qui donne la main à l’un ou l’autre des joueurs, compte le nombre de parties gagnées et réinitialise l’état du jeu après chaque partie.
• MovePawn et EmptyPlaceToMove qui autorisent ou les déplacements des pions des joueurs et qui contiennent les règles du jeu
#### La classe Player ####
• MovePawn et EmptyPlaceToMove qui autorisent ou les déplacements des pions des joueurs et qui contiennent les règles du jeu.
#### La classe Player ####
La classe Player est une classe abstraite, elle est la classe mère de n’importe quel joueur, qu’il soit humain, ou un agent entraîné ou qui joue aléatoirement
Dans la classe Player on retrouve une méthode abstraite TakeDecision qui est appelée par le GameManager et qui sera ensuite redéfinie spécifiquement dans chaque classe fille.
#### La classe Agent ####
Elle hérite de la classe Player, et possède l’algorithme SARSA qui est utilisé pour entraîner l’agent. Au départ, l’agent ne connait pas les règles du jeu, et SARSA est un algorithme d’apprentissage par renforcement qui utilise le principe de récompense lorsque l’agent réussit ou échoue un coup ou encore lorsque l’agent gagne ou perd une partie.
#### IMAGE MARKOV DECISION PROCESS ####
#### La classe Agent ####
Elle hérite de la classe Player, et possède l’algorithme SARSA qui est utilisé pour entraîner l’agent. Au départ, l’agent ne connaît pas les règles du jeu, et SARSA est un algorithme d’apprentissage par renforcement qui utilise le principe de récompense lorsque l’agent réussit ou échoue un coup ou encore lorsque l’agent gagne ou perd une partie.
IMAGE MARKOV DECISION PROCESS
Nous utilisons cette équation fournie par SARSA.
IMAGE EQUATION SARSA
Q est une valeur associée à un couple état/action Alpha et Gamma sont des hyperparamètres compris entre [0,1], respectivement, le « learning rate » et le « discount factor ».
Le premier détermine à quel point il doit mettre de l’importance sur la valeur des nouvelles informations, alpha à 0 signifie que l’algorithme n’apprend rien et à 1 l’agent ne prend en compte que les informations les plus récentes.
Le second l’importance de la future récompense, le gamma fixé à 0 rend l’agent opportuniste en ne considérant que la récompense actuelle, tandis qu’à 1, l’agent adopte une politique basée sur le long terme.
Afin de bien faire apprendre à l’algorithme, nous avons également une méthode dans Agent qui permet de choisir si l’agent opte plutôt pour une stratégie d’exploration ou d’exploitation de ses connaissances. Cette stratégie est illustrée par le taux d’apprentissage Epsilon (eps) compris également entre [0,1], lorsque eps tend vers 1, plus la probabilité que l’agent joue un coup aléatoire est grande, et lorsque eps tend vers 0, l’agent aura tendance à jouer « greedy », utilisant son apprentissage.
Epsilon évolue en fonction de la réussite des coups de l’agent, selon ces critères de récompenses :
Sélection d’un pion valide : +20
Sélection d’un pion non valide : -10
Victoire : +200
Défaite : -100
Ces critères sont ensuite multipliés à un facteur pour déterminer à quelle vitesse évolue Epsilon.
#### La classe RandomAgent ####
Le RandomAgent est tout simplement un agent qui joue des coups aléatoires, sans connaître les règles, on lui donne un tableau d’entiers compris entre [0,8] et il choisit aléatoirement un entier à jouer au jeu, et recommence tant que l’action n’est pas valide.
#### La classe RealPlayer ####
#### IMAGE EQUATION SARSA ####
Q est une valeur associée à un couple état/action
Alpha et Gamma sont des hyperparamètres compris entre [0,1], respectivement, le « learning rate » et le « discount factor ».
La classe RealPlayer donne la main au joueur humain qui choisit un coup à jouer.
Le premier détermine à quel point il doit mettre de l’importance sur la valeur des nouvelles informations, alpha à 0 signifie que l’algorithme n’apprend rien et à 1 l’agent ne prend en compte que les informations les plus récentes.
#### La classe Window ####
Le second l’importance de la future récompense, le gamma fixé à 0 rend l’agent opportuniste en ne considérant que la récompense actuelle, tandis qu’à 1, l’agent adopte une politique basée sur le long terme.
Cette classe affiche une interface graphique pour voir l’état du jeu, elle sert particulièrement pour faire jouer un humain. Toute l’interface a été développée avec Qt.
Afin de bien faire apprendre à l’algorithme, nous avons également une méthode dans Agent qui permet de choisir si l’agent opte plutôt pour une stratégie d’exploration ou d’exploitation de ses connaissances. Cette stratégie est illustrée par le taux d’apprentissage Epsilon (eps) compris également entre [0,1], lorsque eps tend vers 1, plus la probabilité que l’agent joue un coup aléatoire est grande, et lorsque eps tend vers 0, l’agent aura tendance à jouer « greedy », utilisant son apprentissage.
#### Résultats ####
IMAGES WINRATE ET EPSILON + WINDOW PLATEAU DE JEU
#### La classe RandomAgent ####
#### Pistes d’amélioration et ambitions ####
Le RandomAgent est tout simplement un agent qui joue des coups aléatoire, sans connaitre les règles, on lui donne un tableau d’entiers compris entre [0,8] et il choisi aléatoirement un entier a joué qu’il donne au jeu.
On voit qu’actuellement le winrate de l’agent intelligent avoisine les 80-85%, on peut très sûrement augmenter ce winrate en jouant sur les hyperparamètres (alpha et gamma) et les critères de récompenses, chose que nous n’avons pas eu le temps de faire.
Nous aurions également aimé pouvoir tester l’algorithme Q-learning pour pouvoir le comparer à l’algorithme SARSA pour comparer leurs performances respectives.
......@@ -77,9 +77,10 @@ class Game:
plt.subplot(1, 2, 1)
plt.plot(range(self.nbPartieDEntrainement), evolution_winratej1, color = 'blue', label="winrate of intelligent agent")
plt.plot(range(self.nbPartieDEntrainement), evolution_winratej2, color = 'red', label="winrate of random agent")
plt.title("winrate of the intelligent agent according to the number of games")
plt.title("winrate of the agents according to the number of games")
plt.legend(loc="lower right")
plt.xlabel("number of games")
plt.ylabel("winrate of J1")
plt.ylabel("agents' winrate")
......@@ -258,7 +259,7 @@ class Agent(Player):
actual_board = new_board_game
action = new_action
reward = 20
reward = 50
if self.eps > 0.01:
self.eps -= reward * self.eps_decay
......@@ -284,7 +285,7 @@ class Agent(Player):
def endGame(self, playerWinning):
self.epsData.append(self.eps)
if playerWinning == self.position:
self.reward = 200
self.reward = 500
self.total_reward += self.reward
if self.eps > 0.01:
self.eps -= self.reward * self.eps_decay
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment