add alphabeta
This commit is contained in:
parent
f4797f572b
commit
053bde9c7c
1 changed files with 95 additions and 5 deletions
|
@ -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
|
||||
|
|
Reference in a new issue