Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • francesco-bariatti/pingouins
  • Samuel.Felton/pingouins
  • Lucas.Clement/pingouins
3 results
Show changes
Showing
with 286 additions and 7 deletions
File added
\documentclass[11pt]{beamer}
\usetheme{CambridgeUS}
\usecolortheme{beaver}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{graphicx}
\author[Bariatti - Gasté - Le - Lebouc]{Francesco BARIATTI \and Adrien GASTÉ \\ \and Mikael LE \and Romain LEBOUC}
\title[MCTS - Jeu du Pingouin]{Étude Pratique : Développement d’une Intelligence Artificielle à base de l’algorithme Monte Carlo Tree Search}
\logo{\includegraphics[width=0.2\linewidth]{images/insa}}
\institute[]{Encadrant : Pascal GARCIA}
\date[Année 2015/16]{Année scolaire 2015/16}
\AtBeginSection[]
{
\begin{frame}
\tableofcontents[currentsection]
\end{frame}
}
\setbeamertemplate{caption}{\raggedright\insertcaption\par}
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\begin{frame}{Sommaire}
\setcounter{tocdepth}{1}
\tableofcontents
\setcounter{tocdepth}{2}
\end{frame}
\section{Introduction}
\subsection{Notre projet}
\begin{frame}{Notre projet}
\begin{itemize}
\item Développer une intelligence artificielle basée sur le Monte Carlo Tree Search (MCTS)
\item Transposer le Jeu du Pinguin dans un environnement virtuel
\end{itemize}
\begin{figure}
\includegraphics[scale=0.2]{images/boite_jeu}
\end{figure}
\end{frame}
\subsection{Le Jeu du Pingouin}
\begin{frame}{Principe du jeu}
\begin{itemize}
\item Jeu de plateau pour 2 à 4 joueurs.
\item 60 cases et 4 pingouins par joueur. \\
Une case peut avoir 1, 2 ou 3 poissons.
\item Le joueur avec le plus de poissons à la fin du jeu gagne
\item Le jeu se termine quand \textbf{aucun} joueur ne peut plus bouger
\end{itemize}
\begin{figure}
\includegraphics[scale=0.05]{images/tiles}
\caption{Les 3 types de cases}
\end{figure}
\end{frame}
\begin{frame}{Règles de déplacement}
\begin{block}{Règle de base}
\begin{itemize}
\item Un pingouin peut bouger dans les 6 directions de l'hexagone tant qu'il ne rencontre pas d'obstacles.
\item Le joueur gagne la case d'où le pingouin part.
\item Si un joueur ne peut plus bouger, il passe son tour.
\end{itemize}
\end{block}
Les obstacles sont:
\begin{itemize}
\item Un pingouin (allié comme adverse)
\item Un trou crée par l'absence de case
\end{itemize}
\end{frame}
\subsection{Le Monte Carlo Tree Search}
\begin{frame}{Le Monte Carlo Tree Search}
\begin{itemize}
\item Algorithme de recherche de décision utilisé dans jeux tels que le Go ou Ms. Pacman
\item Simule un grand nombre de parties pour construire un arbre
\item Choisit le meilleur chemin dans l'arbre construit
\end{itemize}
\begin{figure}
\includegraphics[width=0.4\linewidth]{images/go_board}
\end{figure}
\end{frame}
\begin{frame}
\begin{itemize}
\item À chaque tour l'IA simule des millions de boucles pour construire l'arbre
\item Chaque boucle consiste en 4 étapes
\end{itemize}
\begin{figure}
\includegraphics[width=\linewidth]{images/mcts}
\end{figure}
\end{frame}
\subsection{Objectifs}
\begin{frame}{Objectifs du projet}
\begin{itemize}
\item Comprendre le MCTS et son code en C++
\item Implementer les règles du jeu de façon efficace \\
$ \to $ bitboards
\item Créer une interface graphique
\end{itemize}
\begin{figure}
\includegraphics[width=0.4\linewidth]{images/reflection}
\end{figure}
\end{frame}
\section{Implémentation du MCTS pour le Jeu du Pingouin}
\subsection{Le plateau}
\begin{frame}{Le plateau}
\begin{itemize}
\item Position 0 en bas à droite, 59 en haut à gauche
\item Comptage ligne par ligne en montant
\end{itemize}
\begin{figure}
\includegraphics[scale=0.26]{images/board}
\end{figure}
\end{frame}
\begin{frame}{Gestion des déplacements}
\begin{itemize}
\item Déplacements calculés avec des formules simples sur la position
\item Bords reconnus grâce à l'opérateur modulo «\%»
\end{itemize}
\begin{figure}
\centering
\begin{minipage}{.7\textwidth}
\centering
\includegraphics[scale=0.20]{images/board_move}
\end{minipage}%
\begin{minipage}{.3\textwidth}
\centering
\includegraphics[scale=0.15]{images/moves}
\end{minipage}
\end{figure}
\end{frame}
\begin{frame}{Plateau en bitboard}
\begin{itemize}
\item 3 bitboards: un par type de case
\end{itemize}
\begin{figure}
\includegraphics[scale=0.3]{images/bitboard_creation} \\
\caption{Bitboard obtenu: $10010001 = 145$}
\end{figure}
\begin{itemize}
\item Opérations binaires pour avoir les obstacles
\end{itemize}
\end{frame}
\subsection{Les pingouins}
\begin{frame}{Les pingouins}
\begin{itemize}
\item 1 pingouin: 32 bits
\item Chaque « partie » interprétée différemment
\end{itemize}
\begin{figure}
\includegraphics[width=\linewidth]{images/penguin_bitboard}
\end{figure}
\begin{itemize}
\item Par exemple, pour avoir le nombre de coups: \texttt{(penguin \& 4032) >> 6 }
\end{itemize}
\end{frame}
\section{Interface graphique}
\subsection{Interaction IA/Interface}
\begin{frame}{Interaction avec l'IA}
\begin{itemize}
\item Chaque tour l'IA communique l'état de la partie\\
$\to$ format JSON par clarté
\item L'IA attend un numéro de coup parmi les coups possibles pour le joueur
\end{itemize}
\begin{figure}
\includegraphics[scale=0.3]{images/IA_comm}
\end{figure}
\begin{itemize}
\item Très difficile à interpréter pour un humain
\end{itemize}
\end{frame}
\begin{frame}{Interaction avec l'IA}
\begin{itemize}
\item L'interface graphique lance le programme et écoute sa sortie standard
\item Les actions du joueur sont envoyées à l'entrée standard
\end{itemize}
\begin{figure}
\includegraphics[scale=0.3]{images/IA_GUI}
\end{figure}
\end{frame}
\subsection{Architecture MVC}
\begin{frame}{Modèle - Vue - Contrôleur}
\begin{itemize}
\item Un modèle qui contient l'état du jeu \\
$\to$ des fonctions pour accéder facilement aux valeurs
\item Une vue pour afficher de façon claire l'état
\item Un contrôleur pour associer des actions aux clics du joueur
\end{itemize}
\begin{figure}
\includegraphics[scale=0.25]{images/board_game}
\end{figure}
\end{frame}
\section{Démonstration}
\begin{frame}{Let's play!}
\begin{figure}
\includegraphics[scale=0.6]{images/pingual}
\caption{Nutnut}
\end{figure}
\end{frame}
\section{Bilan}
\begin{frame}{Bilan}
\begin{itemize}
\item Objectifs atteints
\item Un joueur de bon niveau
\end{itemize}
Ouvertures possibles:
\begin{itemize}
\item Réflexion pendant le tour de l'humain
\item Apprentissage automatique d'heuristique (comme AlphaGo)
\item Implémenter un autre jeu
\end{itemize}
\end{frame}
\begin{frame}
\titlepage
\end{frame}
\end{document}
Doc/fr/Soutenance/images/IA_GUI.png

8.84 KiB

Doc/fr/Soutenance/images/IA_comm.png

13.3 KiB

Doc/fr/Soutenance/images/bitboard_creation.png

14.8 KiB

Doc/fr/Soutenance/images/board.png

34.6 KiB

Doc/fr/Soutenance/images/board_game.png

33.5 KiB

Doc/fr/Soutenance/images/board_move.png

45.1 KiB

Doc/fr/Soutenance/images/boite_jeu.jpg

165 KiB

Doc/fr/Soutenance/images/go_board.jpg

1.13 MiB

Doc/fr/Soutenance/images/insa.png

23 KiB

Doc/fr/Soutenance/images/moves.png

11 KiB

Doc/fr/Soutenance/images/penguin_bitboard.png

15.3 KiB

Doc/fr/Soutenance/images/pingual.jpg

188 KiB

Doc/fr/Soutenance/images/reflection.jpg

2.25 MiB

Doc/fr/Soutenance/images/tiles.jpg

595 KiB

File moved
File moved
......@@ -18,20 +18,21 @@ import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import view.TileView;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.ResourceBundle;
public class Controller implements Initializable
{
private static final String iaProgramPath = "../bin/theturk";
private static final String introMusicFile = "./resource/pingu_theme.wav";
private static final String clickSoundFile = "./resource/clic.wav";
public static String iaProgramPath = "bin/penguin";
public static String introMusicFile = "resource/pingu_theme.wav";
public static String clickSoundFile = "resource/clic.wav";
private static final int max1Fish = 30, max2Fish = 20, max3Fish = 10;
private GameState gameState;
private Process gameProcess;
......@@ -92,7 +93,7 @@ public class Controller implements Initializable
new Thread(() -> {
try
{
AudioPlayer.player.start(new AudioStream(new FileInputStream(introMusicFile)));
AudioPlayer.player.start(new AudioStream(getClass().getClassLoader().getResourceAsStream(introMusicFile)));
} catch (IOException e)
{
e.printStackTrace();
......@@ -121,12 +122,21 @@ public class Controller implements Initializable
gameState.setScore(Player.Red, 0);
gameState.setScore(Player.Blue, 0);
//Generating random fish values
int[] fishCount = {0,0,0};
for (int i = 0; i < 60; i++)
{
int nbFish = new Random().nextInt(3) + 1;
List<Integer> possibleFish = new ArrayList<>();
if(fishCount[0] < max1Fish)
possibleFish.add(1);
if(fishCount[1] < max2Fish)
possibleFish.add(2);
if(fishCount[2] < max3Fish)
possibleFish.add(3);
int nbFish = possibleFish.get(new Random().nextInt(possibleFish.size()));
gameState.setFish(i, nbFish);
board[i].setNbFish(nbFish);
boardView[i].update();
fishCount[nbFish-1]++;
}
//Adding listener to add penguins
penguinGenCounter = 0;
......@@ -275,7 +285,7 @@ public class Controller implements Initializable
{
try
{
AudioPlayer.player.start(new AudioStream(new FileInputStream(clickSoundFile)));
AudioPlayer.player.start(new AudioStream(getClass().getClassLoader().getResourceAsStream(clickSoundFile)));
} catch (IOException e)
{
e.printStackTrace();
......