
PAUGAM Guillaume LOHIER Théophile Création d’un moteur d’échecs
Pseudo-code :
fonction alphabeta( nœud, profondeur, α, β)
(* β représente le meilleur coup du joueur précédent *)
si profondeur = 0 ou nœud terminal
retourner eval(nœud)
pour chaque fils du noeud
α := max(α, -alphabeta(fils, profondeur -1, -β, -α))
si β≤α
break (* coupure bêta*)
return α
(* appel initial *)
alphabeta(origine, profondeur, -infini, +infini)
On se base sur la symétrie max(a,b)= - min(-a,-b).
Algorithme Negascout :
Pour être efficace, cet algorithme a besoin de trier les fils du nœud. Cet ordre est déterminé par une
recherche peu profonde. Il suppose donc que le premier fils est la variation principale. Sans tri, cet
algorithme est inefficace car il réévalue des positions déjà rencontrées.
On s’attend en général à un gain de performance d’environ 10% par rapport à un élagage alpha-bêta
simple, tout en conservant les mêmes résultats. Il reste l’algorithme le plus utilisé pour les moteurs
d’échecs.
Pseudo-code :
fonction negascout(noeud, profondeur, α, β)
si noeud terminal ou profondeur = 0
return eval(noeud)
b := β (* intervalle initial (-β, -α) *)
pour chaque fils
a := -negascout (fils, profondeur - 1, -b, -α)
si α < a < β et fils non premier fils (* vérifier intervalle non
nul *)
a := -negascout(fils, profondeur - 1, -β, -α) (* recherche
complète *)
α := max(α, a)
si α ≥ β
retourner α (* coupure bêta *)
b := α + 1 (* nouvel intervalle nul *)
retourner α