INF4230 - Intelligence artificielle
Hiver 2017
Vous
devez programmer un joueur artificiel pour une variante du jeu Planète_H (un jeu avec adversaire à somme
nulle). Il est fortement conseillé d'implémenter votre joueur
artificiel à l'aide de l'algorithme minimax avec élagage alpha-beta
(alpha-beta pruning) vu en classe.
Après avoir échoué dans sa mission de faire exploser la planète grâce à l’efficacité de la stratégie de défense A* du Htepien, le méchant bonhomme a décidé de revenir en force. Cette fois, il veut pouvoir placer une série de bombes pour faire exploser la planète. Cependant, il faut en poser une série de 5 bombes dans des cases consécutives (en ligne, en colonne ou en diagonale) pour qu’une explosion soit possible. Informer de ce secret, le Htepien s’est donné une stratégie de contre-attaque (en se dotant de tuiles magiques qu’il peut poser dans les cases) qui consiste non seulement à bloquer les tentatives du méchant bonhomme à placer ses 5 bombes consécutives, mais aussi à faire en sorte que 5 cases consécutives comportant des tuiles magiques (en ligne, en colonne ou en diagonale) inhiberaient définitivement l’action du bonhomme qui n’aura d’autre choix que d’abandonner.
Il vous est demandé de développer l’intelligence artificielle du Htepien pour préserver la planète H de cette bataille.
Les
règles de bataille sont les suivantes :
|
|
|
|
Configuration gagnante : victoire du Htepien |
Aucun gagnant |
Configuration non gagnante puisqu'il |
Configuration gagnante : victoire du poseur de bombes |
Une interface graphique pour cette version du jeu Planète_H est fournie dans planeteH_2.jar. Le jeu peut être lancé en ligne de commande : «java –jar planeteH_2.jar».
Il y a 4 modes de jeu (combinaison des deux rôles Htepien et Poseur de bombe) offerts dans la boîte de configuration :
Le temps de réflexion est exprimé en temps réel, ou plus précisément selon l'horloge de la machine sur lequel le jeu Planete_H est exécuté.
À partir d'une certaine taille de grille, il n'est pas possible de faire une exploration complète de l'arbre de recherche. Pour cette raison, votre joueur artificiel doit être capable de prendre des décisions imparfaites en temps réel afin de respecter le temps de réflexion alloué.
Pour cela, vous devrez élaborer une fonction d'évaluation permettant d'évaluer les feuilles des branches n'atteignant pas une partie complétée. Vous devez aussi modifier légèrement l'algorithme minimax avec élagage alpha-beta afin que votre joueur puisse prendre des décisions en temps réel. Référez-vous à la section 5.4 du livre de référence pour plus de détails. Cette section introduit une stratégie iterative deepening. D'autres stratégies y sont également mentionnées. Ces stratégies permettent à l'algorithme d'être anytime. Dans le jargon en intelligence artificielle, un algorithme anytime est un algorithme qui permet de trouver rapidement une première solution et de continuer sa recherche afin de l'améliorer. L'algorithme termine dès qu'on demande une réponse (ex.: temps alloué expiré) ou lorsque l'espace de recherche est entièrement visité (la solution optimale est trouvée). En d'autres mots, l'algorithme trouve une solution en tout temps, d'où le nom anytime.
Votre programme sera évalué de façon automatique. Vous devez donc vous conformer à l'interface et ressources offertes. À défaut de vous y conformer, votre programme ne pourra pas réussir les tests de correction automatique et pourrait obtenir une note de zéro (0).
L'interface graphique du jeu (voir section 2.2) est accompagnée d'un joueur artificiel implémenté dans la classe JoueurArtificiel du package planeteH_2.ia. L’implémentation actuelle (par défaut) du joueur artificiel correspond à un comportement aléatoire. Ce Joueur aléatoire dépose l’objet dans une case vide choisie aléatoirement pour poursuivre la bataille. Votre travail consiste à proposer un joueur artificiel qui améliore ce comportement par l’utilisation de stratégies appropriées. Pour utiliser l’interface graphique et pour accéder au code source initial de Planète-H, vous devez télécharger le fichier planeteH_2-src.zip. Ensuite, vous pouvez modifier la classe JoueurArtificiel (JoueurArtificiel.java). Vous pouvez ajouter d'autres fichiers sources dans le package planeteH_2.ia. Cependant, vous ne pouvez pas faire d'autres modifications au niveau du package planeteH_2. Lors de la correction, les fichiers à l'extérieur de planeteH_2.ia seront écrasés par les fichiers originaux. Par conséquent, vous ne pouvez pas modifier l'interface planeteH_2.Joueur.
L'écriture d'une bonne fonction d'évaluation est difficile. Pour le jeu de tic-tac-toe, une fonction d'évaluation n'est pas vraiment utile, car il est possible d'explorer les 9!=362880 nœuds de l'arbre très rapidement. En fait, 362880 nœuds est une estimation conservatrice, car il y a moins que ce nombre de nœuds dans l'arbre si on considère que des parties se terminent en moins de 9 coups.
Dans le livre et les
diapositives du cours, on donne tout de même une idée d'une fonction
d'évaluation pour le jeu de tic-tac-toe. Il est
proposé de compter le nombre de possibilités restantes pour gagner le jeu.
Dans le jeu Planète_H, on peut compter le nombre de «groupes» de 1, 2, 3, 4 et 5 objets (bombes ou tuiles magiques) d'aligner, et ce, pour chaque joueur. La figure ci-dessous montre un arbre de jeu où le Htepien (qui place les objets verts) doit prendre une décision (3e tour). La grille g0 représente la situation actuelle, à partir de laquelle il y a 41 actions possibles. Donc 41 grilles à évaluer à l'aide d'une fonction d'évaluation si on limite la profondeur à 1 action. Par exemple, dans la première grille à gauche (g1), il y a un groupe de 1 objet pour chaque joueur et 1 groupe de 2 objets pour chaque joueur. Pour chaque taille de groupe (1 à 5), on calcule la différence entre la quantité pour le joueur actuel et la quantité pour l’adversaire. Ensuite, on peut calculer un score à l'aide d'une somme pondérée. Par exemple, on peut attribuer 1 point pour 1 objet, 10 points pour 2 objets, 100 points pour 3, 1000 pour 4 et 10000 pour 5. Dans l'exemple ci-dessous, les grilles g14 et g15 représentent les grilles résultantes suite aux deux «meilleurs» coups possibles avec 89 points. Évidemment, il s'agit d'une estimation et non d'une valeur exacte.
Vous devez utiliser le langage Java et vous assurer que vos programmes soient compilables, exécutables et corrigibles dans l'environnement de correction (voir section 5.4). Vous devez utiliser l’API de Java. Vous ne devez pas utiliser d'autres bibliothèques. Ce travail peut se faire en équipe d’au plus 3 étudiants.
Tout non-respect de ces limitations techniques peut entraîner un mauvais fonctionnement du correcteur automatique et mener à une disqualification au critère C décrit plus bas.
Vous devez programmer votre propre algorithme minimax avec élagage alpha-beta. Ainsi, vous ne pouvez pas réutiliser du code que vous retrouver dans Internet, et ce, même si ce code est correctement référencé.
Date de remise : 22 mars 2017 à 24h00 (23 mars à 00h00).
Consignes de remise :
1) Archivez uniquement les fichiers sources du répertoire planeteH_2/ia dans un seul fichier que vous appellerez tp2.zip. Vous n'avez donc pas à inclure dans l’archive les fichiers source dans planeteH_2 qui étaient fournis dans planeteH_2-src.zip, car ces fichiers source seront de toute façon écrasés par leur version originale.
2)
Soumettez tp2.zip sous oto :
$ oto
rendre_tp nkambou_r
INF4230-TP2 CODE00000001,CODE00000002 tp2.zip
Ce travail pratique vaut 15 % de la note finale. Le tableau ci-dessous récapitule les critères
qui seront considérés pour l’évaluation.
Critère |
Description |
Pondération |
A. |
Respect des règles du jeu. |
3 |
B. |
Réactions
adéquates à diverses configurations de jeu. |
5 |
C. |
Qualité
des décisions prises par le joueur artificiel et capacité de répondre à l'intérieur
des délais alloués.
|
6 |
D. |
Respect
des directives pour la remise.
|
1 |
Total |
/15 |