Commit e3ffca02 authored by LARIVIERE Axel's avatar LARIVIERE Axel
Browse files

avancement readme + nettoyage du code

parent ba127830
README Mutorere_IAS
README Mutorere_IAS
#### Clément Dufaix et Axel Lariviere ####
Le jeu mutorere a été développé en python. Il oppose un agent doté d'une intellingence artificielle entraîné avec de l'apprentissage par renforcement contre un agent qui joue de manière totalement aléatoire.
\ No newline at end of file
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.
#### 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),
• 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 ####
La classe Player 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.
Nous utilisons cette équation fournie par 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
import sys
from abc import abstractmethod
import time
import numpy as np
from more_itertools import distinct_permutations
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import random
import array as ar
import matplotlib.pyplot as plt
import numpy as np
......@@ -101,7 +98,7 @@ class Game:
def movePawn(self, positionToMove):
#positionToMove = positionToMove - 1 # pour la position dans le tableau
newPosition = self.emptyPlaceToMove(positionToMove)
if newPosition == -1: # si aucune place n'a été trouvé ou possible
if newPosition == -1: # si aucune place n'a été trouvée ou possible
return False
else: # on bouge le pion, son ancienne case est maintenant vide
self.boardGame[newPosition] = self.boardGame[positionToMove]
......@@ -179,8 +176,6 @@ class RandomAgent(Player):
def playRandom(self,game):
board = game.getBoardGame()
played = False
while not played:
......@@ -231,7 +226,7 @@ class Agent(Player):
temp = self.greedy(Q, s)
return temp
def SARSA(self, lr=0.01, num_episode=10000, eps=0.5, gamma=0.95, eps_decay=0.00001):
def SARSA(self, gamma=0.95, eps_decay=0.00001):
self.eps_decay = eps_decay
ini_board = self.game.getBoardGame()
actual_board = ''
......@@ -251,7 +246,6 @@ class Agent(Player):
new_board_game = ''
for i in tmp:
new_board_game = new_board_game + str(i)
state_new_board_game = str(new_board_game)
new_action = self.eps_greedy(self.Q, new_board_game, self.eps)
if not played:
......@@ -272,10 +266,6 @@ class Agent(Player):
reward + gamma * self.Q[new_board_game,new_action] - self.Q[actual_board,action])
# print("Eps:{:2.4f} Rew:{:2.4f}".format(self.eps, self.total_reward))
def takeDecision(self, game):
#print("\nAu tour de l'IA intelligente " + str(game.actualPlayer) + ", l'IA joue")
self.SARSA()
......
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