Le sujet
Transcription
Le sujet
Formations en Informatique de Lille – 2008/2009 Apprentissage par l’Exemple mars 2009 Apprendre le Memory 1 Introduction Memory, parfois appelé le pou chinois ou Concentration est un jeu de cartes populaire très répandu. La mémoire semble y joue un rôle important, mais si on y regarde bien, on se rend compte que c’est en fait un jeu de stratégie. S’il existe une stratégie gagnante, on peut espérer trouver un programme qui la trouve par apprentissage, comme c’est le cas avec Jenga. Si ça marche (c’est à dire si on arrive à définir un joueur qui apprend à gagner à Memory), on essaiera de comprendre la stratégie mise en oeuvre, afin de l’exprimer plus simplement. Enfin, on étudiera ces conclusions pour vérifier que la stratégie trouvée par le programme est : – intéressante ou pas. – conforme à celle trouvée par les chercheurs. 2 Le jeu Memory se joue avec un jeu de cartes où toutes les cartes sont présentes en deux exemplaires. Il existe dans le commerce des jeu ’tout faits’ avec des dessins créés pour l’occasion, mais on peut ausi jouer avec deux jeux de cartes identiques. C’est cette deuxième possibilité que nous utiliserons dans toute la suite. 2.1 – – – – Les règles Deux jeux de 52 cartes sont mélangés et placés faces cachées sur la table. Chaque joueur à son tour retourne successivement deux cartes. Si les deux cartes sont identiques, il les ramasse, marque un point, et peut rejouer. Sinon, son tour est terminé, il replace les deux cartes faces cachées et c’est au joueur suivant de jouer. 2.2 Remarques Si les deux joueurs ont une mémoire absolue, il n’est pas nécessaire de replacer les cartes face cachées, on peut se contenter de les laisser visibles sur la table. 2.3 Stratégie Dans ce cas, lorsque c’est à lui de jouer, le joueur peut choisir parmi au plus quatre coups possibles : 1. Retourner une carte inconnue, puis une deuxième carte inconnue. 2. Retourner une carte inconnue, puis une carte connue. 3. Retourner une carte connue, puis une carte inconnue. 4. Retourner une carte connue, puis une carte connue. Dans les deux premiers cas, si la première carte retournée correspond à une carte déjà connue, le joueur prend la paire ainsi constituée, marque un point et rejoue : faire autrement n’est sûrement pas une bonne stratégie. Pour l’étude détaillée de la stratégie optimale, vous êtes fortement incités à lire l’article court, illustré, en français, et facile à comprendre fourni sur la page du cours. On supposera dans toute la suite de ce sujet que vous avez lu cet article. . . Les plus courageux et les polyglottes matheux consulteront avec profit l’article de Zwick (le même que pour l’article sur Jenga) et Patterson lui aussi disponible sur la page du cours. 3 L’apprentissage Comme pour les jeux précédents, le principe sera le suivant : – Dans un premier temps, on accumulera des exemples en jouant un certain nombre de parties aléatoirement. – Lorsqu’on jugera que le nombre d’exemples est suffisant, on construira un classifieur. – Lors des parties suivantes, on utilisera ce classifieur pour choisir les coups à jouer. – Tout au long du processus d’apprentissage, on collectera des informations sur le score final des parties, afin de pouvoir juger de la réalité et de la qualité de l’apprentissage. Cette fois-ci, nous utiliserons un réseau de neurones. D’un point de vue pratique, celà nous permettra surtout de pouvoir remplacer la classe, forcément discrète lorsqu’on utilise un arbre de décision, par une valeur continue. 3.1 Codage des exemples On utilisera le codage suivant : – La proportion de cartes connues. – la proportion de cartes inconnues. – Le score du joueur, ramené entre 0 et 1 (i.e. la proportion de paires gagnées). Cet attribut sera aussi la classe. Si vous avez bien lu l’article la stratégie du pou chinois, vous avez remarqué de petites différences entre notre définition d’une configuration de jeu et celle décrite dans cet article. . . Vous pouvez définir d’autres codages, mais vous aurez alors à créer les classes permettant de les manipuler. . . Si vous choisissez cette option, il vous faudra l’expliciter dans votre compte-rendu. 4 Travail demandé Vous devez construire un joueur censé apprendre, le faire jouer contre un ou plusieurs types de joueurs, et produire des statistiques sous forme de courbes prouvant que l’apprentissage est réel. Les conclusions peuvent être différentes selon le type d’adversaire, à vous d’expliquer ces différences. Si l’apprentissage est effectif, vous devrez essayer de comprendre la stratégie mise en œuvre par le joueur apprenant, et de l’expliquer de façon claire, un peu comme dans la figure de la page 122 de l’article de Pour la Science. Vous rendrez donc un fichier compressé contenant : 1. Un compte-rendu décrivant votre expérience : – protocole, résultats. – Interprétation de la stratégie utilisée après apprentissage. 2. Le source de votre joueur apprenant étendant la classe Joueur. (Si vous changez le codage des exemples, fournissez en plus toutes les classes nécessaires à une bonne exécution du programme !) 2 5 Les classes fournies Les fichiers source de ces classes sont disponibles sur la portail, à la page du cours. 5.1 Paquetage gamespec Ce paquetage contient la définition du jeu : – Color : un type énuméré pour les quatre couleurs de cartes. – FacialValue : un type énuméré pour les valeurs des cartes. – Card : la définition d’une carte (et de l’égalité de deux cartes). – CardGame : un jeu de 52 cartes. – Board : le plateau de jeu : – Deux paquets de 52 cartes mélangés. – La liste des cartes connues. – La liste des cartes non encore retournées. – Des fonctions pour manipuler les cartes (voir commentaires dans le source). – Coup : un type énuméré pour les quatre coups possibles. – Config : un quadruplet mémorisant une configuration en cours de partie et le score de la partie : – La proportion de cartes connues. – la proportion de cartes inconnues. – Le coup joué. – Le score de la partie où on a rencontré cette configuration. 5.2 Paquetage player Contient la définition des joueurs et de leurs stratégies. Un Joueur demande à sa stratégie de choisir le coup à jouer, en fonction de l’état du plateau de jeu (méthode choix de l’objet Strategie) La méthode myTurn de la classe Joueur déroule ce coup : il y a pas mal de cas à distinguer, mais d’une part, les commentaires devraient vous aider à vous y retrouver, d’autre part, si vous faites confiance à cette méthode, il n’y a à priori pas de raison de la changer. Les joueurs ne différent dont les uns des autres que par leur stratégie : – Joueur : sa stratégie Aleatoire joue un des coups possibles, selon la configuration, de manière équiprobable. – JoueurAleatoire2 : on commence toujours par tirer une carte inconnue – JoueurAleatoireTrois : si c’est possible, on retourne deux cartes inconnues, sinon, on commence par une carte inconnue. Le JoueurAMemoire, et sa StrategieAMemoire associée, définit et construit un dataset (classe weka.core.Instances) à partir des coups joués et des scores de parties. Le JoueurAMemoire doit mettre à jour un certain nombre d’informations à la fin d’une partie, c’est le rôle de la méthode endOfGame(), qui elle-même invoque la méthode correspondante de la stratégie associée. A vous de définir une stratégie apprenante, héritant de StrategieAMemoire, qui utilisera les instances construites lors de parties aléatoires pour apprendre. 5.3 Paquetage tests Ce paquetage ne contient qu’un exemple de programme principal, faisant s’affronter deux joueurs, et récupérant les résultats des parties pour affichage dans gnuplot. 6 Conseils – La stratégie adoptée dépendra sans doute de l’adversaire : essayez-en plusieurs, et constatez les différences d’apprentissage. 3 – Que se passe-t-il lorsque deux joueurs apprenants se rencontrent ? 7 les réseaux de neurones Le principe des réseaux de neurones sera vu en cours. Pour ce TP, on peut se contenter de les voir comme une autre sorte de classifieur, possédant les mêmes fonctionnalités que les arbres de décision, avec l’avantage de pouvoir manipuler des classes continues, au lieu de se limiter aux classes discrètes. On peut donc utiliser les méthodes : – buildClassifier(Instances dataset) – distributionForinstance(Instance example) – classifyInstance(instance example) Des options spécifiques aux réseaux de neurones peuvent être trouvées dans la javadoc weka, certaines seront expliquées lors des séances de TP. 4