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}
|
\subsection[Alpha-Bêta]{Élagage alpha-bêta}
|
||||||
\subsubsection{Algorithme}
|
\subsubsection{Algorithme}
|
||||||
Les coupures $\alpha - \beta$ permettent de réduire la taille en mémoire de minimax
|
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}
|
\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}
|
\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é}
|
\section{Comparaison d'efficacité}
|
||||||
% TODO
|
TODO!
|
||||||
|
|
||||||
\section{Discussion}
|
\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
|
\newpage
|
||||||
\appendix
|
\appendix
|
||||||
|
|
Reference in a new issue