From 053bde9c7ca01124f861f85f63cec884b6401439 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Thu, 1 Dec 2022 20:56:58 +0100 Subject: [PATCH] add alphabeta --- report/document.tex | 100 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 5 deletions(-) diff --git a/report/document.tex b/report/document.tex index 2449ce3..f3baa36 100644 --- a/report/document.tex +++ b/report/document.tex @@ -235,19 +235,109 @@ en paramètre récursivement : \subsection[Alpha-Bêta]{Élagage alpha-bêta} \subsubsection{Algorithme} Les coupures $\alpha - \beta$ permettent de réduire la taille en mémoire de minimax -en ne calculant pas certains scénarios. +en ne calculant pas certains scénarios en retirant ceux inutiles basé sur +les calculs précédents. \subsubsection{Exemple d'utilisation} -% TODO expliquer comment l'utiliser +L'utilisation est identique à celle de Minimax (cf. \autoref{cod:alphabeta_def}). +\begin{figure}[h] + \centering + \begin{minipage}{0.8\textwidth} + \begin{minted}[autogobble,linenos]{c} + /* Joue le tour d'après l'algorithme alpha-beta */ + void action_joueur_alphabeta(Jeu *jeu, const int couleur); + \end{minted} + + \begin{minted}[autogobble,linenos,firstnumber=last]{c} + /* Auxiliaire : Décide d'une case à jouer via l'algorithme alpha-beta */ + void _action_joueur_alphabeta(Jeu *jeu, int profondeur, int couleur, + const int gagnant, int *ligne, int *colonne, + int *score, const int note, const int qui); + // qui => couleur associée + \end{minted} + \end{minipage} + \caption{Déclaration d'alphabeta, dans \texttt{alphabeta.h}} + \label{cod:alphabeta_def} +\end{figure} \subsubsection{Problèmes rencontrés} -% TODO avec code d'illustration +Pour l'implémentation je me passe en argument, en plus de ceux de minimax, le +meilleur score et sa couleur associée. + +L'avantage avec cet algorithme est qu'il ressemble beaucoup à minimax vu que c'est +une amélioration de ce dernier, alors j'ai pu réutiliser le même code. En revanche +l'élagage était compliqué à placer dans le code. + +Je fais l'élagage en passant des possibilités pour alpha (cf. \autoref{cod:elagage_alpha}), +même technique pour bêta (cf. \autoref{cod:elagage_beta}). + +\begin{figure}[h] + \centering + \begin{minipage}{0.8\textwidth} + \begin{minted}[autogobble,linenos]{c} + while (i->suivant) { + if (i->suivant->suivant) { + i = i->suivant; + } else { + break; + } + } + *score = INT_MAX; + \end{minted} + \dots\, et \dots + \begin{minted}[autogobble,linenos,firstnumber=last]{c} + if (*score == INT_MAX) { + while (i->suivant) { + if (i->suivant->suivant) { + i = i->suivant; + } else { + break; + } + } + } + \end{minted} + \end{minipage} + \caption{Élagage $\alpha$, dans \texttt{alphabeta.h}} + \label{cod:elagage_alpha} +\end{figure} + +\begin{figure}[h] + \centering + \begin{minipage}{0.8\textwidth} + \begin{minted}[autogobble,linenos]{c} + while (i->suivant) { + if (i->suivant->suivant) { + i = i->suivant; + } else { + break; + } + } + *score = INT_MIN; + \end{minted} + \dots\, et \dots + \begin{minted}[autogobble,linenos,firstnumber=last]{c} + if (*score == INT_MIN) { + while (i->suivant) { + if (i->suivant->suivant) { + i = i->suivant; + } else { + break; + } + } + } + \end{minted} + \end{minipage} + \caption{Élagage $\beta$, dans \texttt{alphabeta.h}} + \label{cod:elagage_beta} +\end{figure} \section{Comparaison d'efficacité} -% TODO +TODO! \section{Discussion} -% TODO +Le problème de mon implémentation est la fonction d'évaluation qui regarde juste +le nombre de points gagnés/perdus. En ne prenant pas en compte par exemple si le +pion placé est sur un coin ou non (le coin étant une position avantageuse). \newpage \appendix