add alphabeta

This commit is contained in:
Mylloon 2022-12-01 20:56:58 +01:00
parent f4797f572b
commit 053bde9c7c
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -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