Comment un moteur décide-t-il quel nœud rechercher en premier?

8

Il s'agit d'une question complémentaire à Randomness in Engine Play . La réponse de SmallChess indique que dans un cas, Stockfish a recherché un nombre donné de nœuds après 20 s, et un nombre différent dans les 20 autres, d'où un hasard.

La question: si chaque nœud est une position donnée, comment Stockfish décide-t-il quel nœud rechercher en premier? Prenez par exemple le premier demi-pli. Les blancs ont 20 premiers coups possibles, donc il y a 20 nœuds. J'exige que Stockfish joue un coup après avoir recherché cinq nœuds. Cela signifie-t-il que Stockfish n'a peut-être évalué que 1. a4, 1. a3, 1. b4, 1. b3 et 1. c3 avant de devoir bouger? Une recherche systématique comme celle-ci signifierait cependant que Stockfish n'a pas évalué les premiers mouvements les plus courants.

J'imagine que, plus tard dans le jeu, il y aurait un saut massif dans le nombre de nœuds par demi-pli. Cela signifierait que Stockfish déciderait parfois de bouger même s'il n'a pas fini d'évaluer chaque nœud de la demi-couche. Comment pourrait-il savoir qu'il a recherché les nœuds les plus prometteurs?

Séduire
la source
Merci pour le lien, je ne comprends toujours pas vraiment. Dites le graphique en bas. Je suppose que A est la position actuelle et B, C et E sont les trois mouvements candidats? Si IDDFS à la profondeur deux va A, B, D, F, C, G, E, F, et le meilleur coup est E, il pourrait en théorie manquer le meilleur coup s'il devait terminer la recherche avant de l'atteindre.
Allure
Je ne vois pas comment cela peut être un doublon - la question est évidemment (?) Différente.
Allure
Je suis désolé @ user3727079, pourriez-vous supprimer ce downvote? Dites-moi aussi si cela aide.
QuIcKmAtHs
@XcoderX, il ne peut pas le supprimer car c'est moi qui vous a
dévalisé

Réponses:

5

http://rebel13.nl/rebel13/ideas.html explique bien cela.

L'idée de base est d'ordonner les mouvements en fonction de ce que le programme pense être le meilleur mouvement sans chercher. Ce score est généralement basé sur la mobilité, la valeur au carré, le contrôle central, l'historique, le potentiel d'attaque, les captures et d'autres éléments que le programmeur juge importants. Tout comme les humains basent leurs mouvements candidats sur la base de l'intuition et de l'histoire, l'ordinateur recherche d'abord le mouvement ayant le score le plus élevé.

Si l'ordinateur est limité à seulement cinq nœuds, alors oui, l'ordinateur ne recherchera que les cinq mouvements les plus performants. Ce facteur de limite de temps pourrait faire en sorte que l'ordinateur rate un compagnon en un s'il était mal noté. La première méthode pour corriger cela a été d'établir des coffres-forts. Celles-ci mettraient fin à une recherche si la situation devenait sensiblement pire ou nettement meilleure. L'espoir était de laisser plus de temps pour rechercher plus de variantes qui pourraient mieux utiliser le temps. D'autres algorithmes de recherche, l'approfondissement itératif, ont amélioré la gestion du temps car ils ont une longueur plus courte avant de promulguer une sécurité intégrée.

Fred Knight
la source
0

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. entrez la description de l'image ici 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.

QUIcKmAtHs
la source
@ user3727079 cela aide-t-il?
QuIcKmAtHs
1
Non malheureusement. Je ne comprends pas ta réponse. Il ne semble pas répondre à ma question, qui était sur quel nœud rechercher en premier, pas comment Stockfish prend-il ses décisions (je comprends ce que signifie rechercher des arbres).
Allure