\documentclass{article}


\usepackage[T1]{fontenc} % encodage
\renewcommand{\familydefault}{\sfdefault} % police en sans-serif

\usepackage[french]{babel} % langue
\frenchsetup{SmallCapsFigTabCaptions=false}

\usepackage[hidelinks]{hyperref} % liens cliquable dans la table des matières

\usepackage{graphicx} % images

% Replace oe
\usepackage{luacode}
\begin{luacode}
    function fn_oe(s)
        s = s:gsub("oe", "\\oe{}")
        return s
    end
\end{luacode}
\AtBeginDocument{
    \directlua{
        luatexbase.add_to_callback("process_input_buffer", fn_oe, "fn_oe")
    }
}

\usepackage[a4paper, left=20mm, top=20mm]{geometry} % dimensions de la page

\title{\textbf{TP2 - Breakthrough}}
\author{Groupe 4\thanks{César PICHON, Florian POSEZ, Omar ANOUAR, Anri KENNEL}\\
    \\Intelligence artificielle pour les jeux $\cdot$ Université Paris 8}

\date{Année universitaire 2022-2023}

\begin{document}
\maketitle
\tableofcontents
\clearpage

\section{Particularités}
\subsection{Algorithme}
L'algorithme Monte Carlo est une méthode de simulation basée sur l'évaluation
de résultats aléatoires. Dans le contexte du jeu Breakthrough, l'algorithme
est utilisé pour simuler plusieurs parties à partir de chaque état du jeu,
afin de déterminer quelle est la meilleure action à jouer à partir de cet état.

\vspace{1em}
L'algorithme Monte Carlo utilise les étapes suivantes :

\begin{enumerate}
    \item \textbf{Sélection} : on sélectionne un noeud dans l'arbre de recherche
          en suivant une stratégie de sélection. Dans notre implémentation,
          la fonction \texttt{mcts\_selection} est utilisée pour choisir un noeud.
    \item \textbf{Expansion} : on étend l'arbre de recherche en ajoutant des noeuds
          correspondant aux actions possibles à partir du noeud sélectionné. Dans
          notre implémentation, la fonction \texttt{mcts\_expansion} est utilisée
          pour ajouter les noeuds.
    \item \textbf{Simulation} : on simule un grand nombre de parties à partir du
          nouveau noeud pour estimer la qualité de l'action associée. Dans notre
          implémentation, la fonction \texttt{mcts\_simulation} est utilisée pour
          simuler les parties.
    \item \textbf{Rétropropagation} : on met à jour les valeurs des noeuds parents
          en fonction des résultats de la simulation. Dans notre implémentation,
          la fonction \texttt{mcts\_back\_propagation} est utilisée pour mettre
          à jour les noeuds parents.
\end{enumerate}

\subsection{Optimisation}
Aucune optimisation particulière n'a été ajoutée à cette implémentation
de l'algorithme Monte Carlo.

\section{Implémentation}
Le joueur \texttt{mcts\_player.cpp} est identique au joueur aléatoire au détail
près que le joueur MCTS appelle la fonction \texttt{get\_mcts\_move}.

\vspace{1em}
Cette méthode de la classe \texttt{bt\_t} initialise un noeud et l'algorithme en
appellant l'expansion sur ce noeud. On boucle ensuite $x$ fois en :
\begin{enumerate}
    \item copiant le plateau actuel
    \item selectionne un noeud de l'arbre
    \item étend l'arbre depuis le noeud selectionné
    \item simule le jeu en jouant aléatoirement
    \item propage le résultat à travers tout l'arbre
\end{enumerate}

\vspace{1em}
Une fois ce travail effectué, on selectionne la meilleur coup parmis les enfants
du noeud racine en fonction du nombre de simulation jouée.

\end{document}
