Ce problème est assez similaire à certains problèmes de codage. Stockfish possède déjà plusieurs ensembles de mouvements pré-calculés. Il représente l'état de l'échiquier à l'aide de plusieurs bitboards, qu'il utilise ensuite pour évaluer les positions du tableau à l'aide d'une représentation catégorique (contrôles, tempos, checkmates) et statistique (valeurs des pièces). Presque immédiatement, il utilise un algorithme de recherche alpha-bêta avancé. Afin de ne pas analyser plusieurs fois la même position, un tableau de transposition est utilisé. Il s'agit essentiellement de la mémorisation appliquée à la fonction de recherche, qui est un élément fondamental de nombreux problèmes de programmation de la théorie des graphes. Ainsi, il utilise en fait un algorithme assez simple. Voici quelques recherches effectuées auparavant:
Étape 1. Initialiser le nœud
Étape 2. Vérifiez la recherche abandonnée et le tirage immédiat. Appliquez la limite de nœuds ici. (Cela ne fonctionne qu'avec 1 fil de recherche, à partir de Stockfish 2.3.1.)
Étape 3. Élagage à distance des contraintes. Même si nous nous accouplons au coup suivant, notre score serait au mieux mate_in (textsrightarrowtextply + 1textssrightarrowtextply + 1, mais si alpha est déjà plus grand parce qu'un compagnon plus court a été trouvé vers le haut dans l'arbre, il n'est pas nécessaire de chercher plus loin, nous ne battre l'alpha actuel.La même logique mais avec des signes inversés s'applique également dans la condition opposée d'être accouplé au lieu de donner un compagnon, dans ce cas, retourner un score d'échec.
Étape 4. Recherche de table de transposition. Nous ne voulons pas que le score d'une recherche partielle écrase une recherche complète précédente. Nous utilisons une clé de position différente en cas de mouvement exclu.
Étape 5. Évaluez la position de façon statique et mettez à jour les statistiques de gain des parents
Étape 6. Rasage (est omis dans les nœuds PV)
Étape 7. Élagage de mouvement nul statique (est omis dans les nœuds PV). Nous parions que l'adversaire n'a pas de coup qui réduira le score de plus que futility_margin (profondeur) si nous faisons un coup nul.
Étape 8. Recherche de déplacement nul avec recherche de vérification
Étape 9. ProbCut. Si nous avons une très bonne capture et une recherche réduite renvoie une valeur bien supérieure à la version bêta, nous pouvons (presque) en toute sécurité élaguer le mouvement précédent.
Étape 10. Approfondissement itératif interne.
Étape 11. Boucle à travers les mouvements. Parcourez tous les mouvements pseudo-légaux jusqu'à ce qu'il ne reste aucun mouvement ou qu'une coupure bêta se produise
Étape 12. Prolongez les contrôles et les mouvements dangereux
Étape 13. Taille de futilité.
Étape 14. Faites le pas
Étape 15. Recherche en profondeur réduite (LMR). Si le mouvement échoue haut sera recherché à pleine profondeur.
Étape 16. Recherche approfondie, lorsque LMR est ignoré ou échoue haut.
Étape 17. Annuler le déplacement
Étape 18. Vérifiez le nouveau meilleur mouvement
Étape 19. Vérifiez le fractionnement
Étape 20. Vérifiez le compagnon et l'impasse
Étape 21. Mettez à jour les tableaux. Mettre à jour l'entrée du tableau de transposition, les tueurs et l'historique
Je vais essayer d'expliquer de quoi parlent les recherches du professeur. Stockfish crée un arbre de recherche du mouvement légal.
Ensuite, il commence à évaluer si chaque mouvement est bon ou mauvais, et à quel point il est bon ou mauvais, en exécutant d'abord un champ de recherche peu profond, puis en utilisant les valeurs de coupure alpha / bêta résultantes comme valeurs de départ pour une recherche plus approfondie. Stockfish donne également la priorité aux pièces. Par exemple, les chevaliers seront priorisés au centre, donc si un chevalier et un évêque sont fourchus au centre, il déplacera le chevalier, à moins qu'il y ait d'autres gains importants en déplaçant l'évêque. Bien que cela puisse sembler compliqué, cette exécution est approximativement logarithmique (nombre de mouvements possibles), ce qui la rend encore assez rapide.