Télécharger (PDF) - Adrastee.net

bunkietameΤεχνίτη Νοημοσύνη και Ρομποτική

20 Οκτ 2013 (πριν από 4 χρόνια και 2 μήνες)

91 εμφανίσεις

INSA DE RENNES
INTELLIGENCE ARTIFICIELLE
Projet Mario
Vincent LE BIANNIC
5ème année,Informatique
Nicolas RENAUD
5ème année,Informatique
Janvier 2012
1 Introduction
Ce projet a pour but de créer une intelligence artificielle pour un clone du jeu Mario Bros
(Mario AI Championship – http://www.marioai.org/).La méthode utilisée se base sur des
réseaux de neurones et algorithmes génétiques pour entraîner une intelligence artificielle afin
qu’elle arrive à progresser sur des niveaux générés aléatoirement.
2 Fonctionnement général
Comme expliqué précédemment,notre implémentation se base tout d’abord sur un réseau
de neurones.Celui possède N entrées correspondant à diverses informations sur le monde
entourant mario (décrites plus bas) telles que les ennemis ou obstacles à proximité.Ses M
sorties correspondent chacune à une combinaison de touches possibles (voir plus bas),afin
de sélectionner quelle combinaison doit être activée plusieurs méthodes ont été utilisées:
– Sélectionner la sortie ayant la plus grande valeur.C’est la méthode la plus logique mais
qui peut aboutir à des situations bloquantes étant donné que l’on effectue toujours la
même action pour une situation donnée.
– Calculer le cumul des valeurs en sortie des différents neurones,choisir un nombre aléa-
toire compris entre 0 et ce cumul,et sélectionner la combinaison choisie.Avec cette
méthode,plus la valeur d’un neurone de la couche de sortie est grande,plus la chance
qu’il soit sélectionné est importante.Ainsi,cela peut être utile lorsque Mario se retrouve
bloqué,mais peut également provoquer sa mort à cause de réactions illogiques.L’en-
trainement est aussi plus compliqué puisque sur un niveau identique,un individu n’effec-
tuera pas forcément le même score.C’est toutefois la méthode que nous utiliseront par
la suite,celle-ci s’avérant être en général la plus efficace.
Une couche intermédiaire est également présente.Après quelques recherches,beaucoup
conseillent que le nombre de neurones composant cet"Hidden Layer"soit égal à (N+M)/2
3
[1].Cela a été plus ou moins confirmé par nos tests,un nombre trop important causant un
temps d’entraînement beaucoup plus élevé,et un nombre trop faible dégradant la qualité de
l’intelligence artificielle en résultant.
Les différents poids attribués aux entrées des neurones sont contenus dans un chromo-
some décrivant un individu.Ainsi,si un individu possède N entrées,Msorties et (N+M)/2 neu-
rones dans la couche cachée,on aura un chromosome contenant M*((N+M)/2)+N*((N+M)/2)
valeurs.En plus de ça,un système de"mémoire"a été intégré à la couche cachée.Un neu-
rone de cette couche retiendra ainsi ses L dernières valeurs et les utilisera en tant que valeurs
d’entrée.Ces valeurs nécessitant également des poids,il faut les sauvegarder dans le chro-
mosome,ce qui nous donne au final:(M+L)*((N+M)/2)+N*((N+M)/2) valeurs à sauvegarder.
3 Valeurs d’entrée
Les valeurs d’entrée du réseau de neurones sont un point déterminant à l’efficacité de
celui-ci.En effet,il faut à la fois choisir des valeurs utiles et limiter leur nombre.
Dans le cas où une entrée ne serait pas utile celle-ci entraînerait en effet (N+M)/2 poids inutiles
dans le chromosome,ce qui influencerait les calculs.Pour la même raison,si le nombre d’en-
trées est trop important,même si elles sont toutes représentative de l’état courant,le nombre
de poids à gérer l’est également,ce qui a un impact vraiment négatif sur l’entraînement.
Pour ces raisons,nous avons choisi de nous limiter à un nombre très réduit de valeurs d’en-
trées.Certaines sont basées sur la publication de Lars Dahl Jørgensen et Thomas Willer Sand-
berg [2] traitant de ce sujet.
Toutes les valeurs d’entrée sont ramenées à un nombre compris entre 0 et 1.
Dans la suite,on parlera de"cases"pour décrire une portion de l’écran.Celui-ci est en ef-
fet découpé en une grille de 11x11 cellules,Mario se situant en permancence en 5x5,comme
illustré dans la capture suivante:
4
3.1 Informations globales
– Hauteur de Mario:Sa hauteur par rapport au sol.Si une passerelle se trouve sous lui,
sa hauteur sera calculée relativement à cette dernière.Ainsi,si Mario touche le sol,cette
entrée sera à 0,et s’il se trouve à 4 cases de hauteur,elle sera à 1.
– Possibilité de sauter:Variable à 1 si Mario peut sauter,0 sinon.
– Possibilité de tirer:Variable à 1 si Mario peut tirer sur ses ennemis,à 0 sinon
– Etat de Mario:Si Mario est en mode"Feu"ou en mode"Grand",cette entrée est à 1,et
à 0 s’il est en mode"Petit".
3.2 Gestion des ennemis
La gestion des ennemis représente 13 des 21 entrées du réseau de neurones.On a ainsi 8
entrées correspondants aux ennemis situés devant,au dessus,en dessous,ou derrière Mario.
Celles-ci vont par groupe de deux,par exemple:
– ennemyInFront:Nombres d’ennemis devant Mario (visibilité de 5 cases).S’il n’y a au-
cun ennemi,l’entrée est à 0.On rajoute 0.20 à celle-ci pour chaque ennemi,en limitant
la valeur maximale à 1,ce qui donne un niveau de dangerosité.
– ennemyInFrontDist:Distance du premier ennemi situé devant Mario.Si le premier en-
nemi est situé juste à coté de celui-ci,l’entrée est à 1.Sinon,on la diminue de 0.20 par
case vide en limitant la valeur minimale à 0.
En plus des ces 8 variables,2 autres sont utilisées pour détecter si des ennemis sont en
train de tomber devant Mario.C’est en effet courant que des ennemis tombent des obstacles,
pouvant blesser le joueur.Ces entrées peuvent également être utilisées pour repérer les en-
nemis volant.
– ennemyFallingInFront:Même principe que ennemyInFront,a l’exception que l’on dé-
tecte les ennemis en l’air et que l’on incrément la variable de 0.1 par ennemi.
5
– ennemyFallingInFrontDist:Même principe que ennemyInFrontDist.
Deux autres entrées représentent la présence d’un monstre de type"fleur"(sortant pério-
diquement de tuyaux).On détecte ainsi la distance à laquelle le prochain monstre de ce type
se trouve (champ de vision de 6 cases),et la hauteur à laquelle il est actuellement.
Finalement,la dernière entrée concerne la présence d’un ennemi au dessus du prochain
obstacle.Cette variable est présente afin d’éviter qu’un individu tente de sauter par dessus
celui-ci alors qu’un ennemi bloque le passage (situation assez fréquente).
3.3 Gestion des obstacles
Les obstacles sont gérés de la même manières que les entrées précédentes:on récupère
la distance vers le prochaine obstacle,et sa hauteur.
– Distance de l’obstacle:Si l’obstacle se situe juste devant Mario,l’entrée est à 1.Si-
non,la valeur de la variable est diminuée progressivement en fonction de l’écart calculé
(visibilité de 5 cases).
– Hauteur de l’obstacle:0.20 par case (relatif à la position de Mario).
3.4 Gestion des trous
Les trous sont un problème compliqué à gérer mais qui doit être pris en compte dans les
niveaux de difficulté 1 ou plus.Ils sont détectés en recherchant les colonnes de la grille n’ayant
aucun bloc entre la hauteur de Mario (5) et le maximum(10).On peut alors calculer la distance
du prochain trou,et récupérer sa taille.
– Distance du trou:0.20 par case.
– Taille du trou:0.20 par case vide.
4 Valeurs de sortie
Nous avons choisi de prendre en tant que valeurs de sortie les différentes combinaisons
de touche sur lesquelles il est possible d’appuyer normalement lorsque l’on joue.Cela permet
ainsi d’exclure certaines combinaison qui n’ont aucun effet (par exemple lorsqu’on appuie sur
la flèche de gauche et la flèche de droite en même temps).
Les combinaisons retenues sont les suivantes:
– Aucune touche
– Flèche gauche
– Flèche gauche + Courir
– Flèche gauche + Sauter
– Flèche gauche + Courir + Sauter
– Flèche droite
– Flèche droite + Courir
– Flèche droite + Sauter
– Flèche droite + Courir + Sauter
– Courir (permettant de tirer)
6
5 Visualisation des valeurs d’entrées
Pour faciliter la recherche des entrées à considérer,lors du test d’un individu il est possible
d’afficher la valeur de celles-ci et la grille représentant la vision de Mario.
6 Entraînement
Un entraînement prend une population en entrée,et effectue plusieurs itérations durant
lesquelles il teste les individus sur des niveaux choisis aléatoirement et effectue des mutations
et croisements se basant sur les meilleurs d’entre eux.La configuration d’un entrainement
prend ainsi plusieurs paramètres:le nombre d’itérations à effectuer,le nombre de niveaux
qu’il faut tester pour chaque itération,les seeds (valeurs utilisées par le générateur pseudo
aléatoire créant les niveaux) de chacun d’entre eux,la probabilité de mutation (voir plus bas),
la difficulté des niveaux,et leur longueur.
7
Le score obtenu par chaque individu à l’issu d’un niveau doit être suffisamment représen-
tatif de son succès ou de son échec.Pour cela nous avons retenu plusieurs critères:
– La distance parcourue
– Le temps au sol (afin de privilégier les individus ne sautant pas tout le temps,comporte-
ment ressortant le plus souvent)
– Le mode dans lequel l’individu termine le niveau (Feu/Grand/Petit)
– Le pourcentage de monstres tués
– Le temps restant
Les derniers critères ne sont retenus que si l’individu réussi à terminer le niveau.Ainsi,on
privilégie dans un premier temps la réussite d’un niveau,peu importe la vitesse à laquelle cela
a été fait ou le nombre de monstres tués,puis dans un deuxième temps on applique un bonus
8
pour distinguer les différents individus.
7 Parallélisation de l’entraînement
7.1 Présentation globale
Afin d’accélérer les calculs durant l’entraînement,nous avons implémenté un système per-
mettant de les paralléliser.Pour cela,nous nous somme basé sur un système de nœuds
chargés d’effectuer des calculs,et exécutant les ordres donnés par un tracker.
La communication entre les différents composants du système est effectuée à l’aide de
requêtes HTTP.Ainsi,le tracker et chacun des nœuds intègre un serveur HTTP auquel il est
possible d’adresser des requêtes.Celui-ci est également utilisé pour afficher l’avancement des
calculs via un navigateur web.
7.2 Tracker
Le tracker a pour but de synchroniser le travail des différents nœuds.Il se chargera donc de
gérer un ensemble de configurations d’entraînement (les étapes dans le graphe ci-dessous),
de créer une population de base,et de demander à chaque nœud d’effectuer l’entraînement
sur certains individus de la population.
Si la population de base est de 1000 individus et qu’il y a 10 nodes en lignes,chacun
d’entre eux devra traiter 100 individus sélectionnés aléatoirement dans la population du tra-
cker et retourner les résultats à ce dernier une fois l’entraînement terminé.La charge est donc
équitablement répartie,ce qui entraîne un gain de performance assez important (voir bench-
marks).
9
7.3 Nodes
Les nœuds n’effectuent aucune action à leur lancement.Ils attendent simplement une re-
quête leur indiquant qu’une nouvelle configuration d’entraînement est disponible sur le tracker,
10
puis la téléchargent.Une fois cette étape effectuée,le tracker contacte les nœuds ayant télé-
chargé la configuration (les seuls qu’il considère comme étant en ligne),et leur demande de
lancer l’entraînement.Ces derniers vont alors récupérer une partie de la population auprès du
tracker (celui-ci se chargeant de les répartir aléatoirement afin qu’un node ne se retrouve pas
toujours avec les mêmes individus),et commencer les calculs,en utilisant le même principe
que celui décrit précédemment.
Une fois l’entraînement terminé,chaque noeud informe le tracker qu’il est de nouveau
disponible et lui met à disposition sa nouvelle population.Celle-ci sera alors regroupée avec
celle des autres noeuds,et utilisée lors de l’étape suivante.
7.4 Benchmarks
Afin de mesurer le gain de performances apporté par ce système,une même configuration
a été testée sur plusieurs machines.
– Machine#1:1 x CPU Intel Core 2 Duo,3.0ghz,2 cores
– Machine#2:4 x CPU AMD Opteron,2.4ghz,6 cores (Rodrigue)
Configuration 1:
10 itérations,30 niveaux/itération,probabilité de mutation:90%,480 individus,taille des ni-
veaux:200,difficulté:0
Résultats:
– Machine#1,2 noeuds lancés:0h 36mn 0s
11
– Machine#2,16 noeuds lancés:0h 7mn 29s
Configuration 2:
50 itérations,40 niveaux/itération,probabilité de mutation:90%,480 individus,taille des ni-
veaux:250,difficulté:1
Résultats:
– Machine#1,2 noeuds lancés:1h 37mn 4s
– Machine#2,16 noeuds lancés:0h 35mn 5s
Le gain de temps est donc non négligeable.De plus,il serait possible d’utiliser ce système
à plus grand échelle sur différentes machines connectées à un même réseau,augmentant
encore ainsi la rapidité de calcul.
8 Résultats
L’entrainement le plus complet ayant été effectué comprenait les étapes d’entraînement
suivantes:
Etape
1
2
3
4
5
6
Itérations
30
150
150
150
150
1
Niveaux/itération
80
100
100
100
150
2500
Longueur des niveaux
200
250
500
500
500
500
Difficulté
0
1
1
1
1
1
Probabilité de mutation
90%
90%
50%
10%
5%
0%
Il se basait sur une population de 800 individus,et les calculs ont été faits sur Rodrigue avec
16 nodes de lancés (50 individus/node).Ceux-ci ont duré plus de 38 heures.
Explication des différentes étapes:
La première étape se fait en très peu d’itérations et en utilisant des niveaux de difficulté 0
(les plus simples).Le but recherché est de trouver rapidement des individus sachant faire des
déplacements simples et éviter le plus possible de mourir.A l’issu de cette étape,les distances
moyennes parcourues avoisinaient 160/200.
L’étape 2,elle,introduit le niveau de difficulté 1.Celui-ci comporte davantage d’ennemis,de
nouveaux types (ennemis volants par exemple),et de nouveaux obstacles (des trous).De nou-
veaux mécanismes devant être adoptés,beaucoup d’itérations sont nécessaires.La probabilité
de mutation reste quant à elle la même que précédemment,des changements importants de-
vant être apportés aux individus.A l’issu de cette étape,les distances moyennes parcourures
étaient de 56/250.Cette distance est assez faible mais justifiée par la difficulté des niveaux
(beaucoup plus importante que pour les niveaux de difficulté 0).
Les étapes 3 à 5 affinent les comportement des individus,en augmentant éventuellement
les itérations et le nombre des niveaux dans chacune d’entre elles,mais en réduisant peu à
peu la probabilité de mutation.A la fin de l’étape 5,les distances moyennes parcourues sur
les différents nodes approchaient 125/500,confirmant l’efficacité de l’entraînement.
12
La dernière étape s’effectue en une seule itération,mais sur 2500 niveaux.Elle a pour seul
et unique but de tester tous les individus sur un très grand nombre de niveaux afin de dres-
ser une moyenne des scores effectués par chaque individu et les trier par suite.Suite à cette
étape,on peut alors trouver quel est le meilleur individu de la population.
Bilan de l’entraînement
Suite à l’entrainement les individus arrivent à progresser dans la plupart des niveaux
générés aléatoirement (et pas uniquement ceux sur lesquels ils ont été entraînés) ce qui
montre bien une progression relativement importante.Toutefois,à cause de certaines limi-
tations (concernant par exemple la précision de la grille),ils peuvent également se retrouver
face à des situations dont il est impossible de sortir vivant.
La stratégie adoptée par la plupart des individus consiste à avancer lentement en tirant le
plus de boules de feu possible tant qu’ils le peuvent.Ces derniers savent également sauter
pour éviter un trou ou un obstacle.
Graphiques de l’évolution des individus
Voici des graphiques représentant l’évolution des individus sur un node (représentatif de
ceux générés par les autres nodes).L’axe horizontal représente les différentes itérations,tan-
dis que celui vertical représente la distance parcourue.Chaque point correspond à un individu,
et le tracé noir à la moyenne de la population pour chaque itération.Les paramètres de l’étape
sont également rappelés en titre du graphique.
13
14
Références
[1] comp.ai.neural nets.Neural network faq,2002. 
 .
[2] Lars Dahl Jorgensen and Thomas Willer Sandberg.Playing mario using advanced
ai techniques,2009.
.
15