Wie entscheidet eine Engine, welcher Knoten zuerst gesucht werden soll?

8

Dies ist eine Folgefrage zu Randomness in Engine Play . Die Antwort von SmallChess zeigt, dass Stockfish in einem Fall eine bestimmte Anzahl von Knoten nach 20 Sekunden und eine andere Anzahl in den anderen 20 Sekunden durchsucht hat, daher gibt es Zufälligkeit.

Die Frage: Wenn jeder Knoten eine bestimmte Position hat, wie entscheidet Stockfish, welcher Knoten zuerst gesucht werden soll? Nehmen Sie zum Beispiel die erste halbe Lage. Weiß hat 20 mögliche erste Züge, also gibt es 20 Knoten. Ich fordere Stockfish auf, nach der Suche nach fünf Knoten einen Zug zu spielen. Bedeutet dies, dass Stockfish möglicherweise nur 1. a4, 1. a3, 1. b4, 1. b3 und 1. c3 bewertet hat, bevor er einen Zug ausführen muss? Eine systematische Suche wie diese würde bedeuten, dass Stockfish die häufigsten ersten Schritte jedoch nicht bewertet hat.

Ich stelle mir vor, dass es später im Spiel einen massiven Sprung in der Anzahl der Knoten pro halber Lage geben würde. Das würde bedeuten, dass Stockfish manchmal beschließt, einen Zug zu machen, obwohl nicht jeder Knoten in der halben Lage bewertet wurde. Wie würde es wissen, dass es die vielversprechendsten Knoten durchsucht hat?

Locken
quelle
Danke für den Link, verstehe es aber immer noch nicht wirklich. Sagen Sie die Grafik unten. Ich nehme an, A ist die aktuelle Position und B, C & E sind die drei Kandidatenzüge? Wenn IDDFS in Tiefe zwei A, B, D, F, C, G, E, F geht und der beste Zug E ist, könnte es möglicherweise den besten Zug verpassen, wenn die Suche vor Erreichen beendet werden müsste.
Allure
Ich sehe nicht ein, wie es ein Duplikat sein kann - die Frage ist offensichtlich (?) Anders.
Allure
Es tut mir leid @ user3727079, könnten Sie diese Downvote entfernen? Sag mir auch, ob es hilft.
QuIkKmAtHs
@XcoderX er kann es nicht entfernen, weil ich derjenige bin, der dich herabgestimmt hat
SmallChess

Antworten:

5

http://rebel13.nl/rebel13/ideas.html erklärt dies gut.

Die Grundidee besteht darin, die Züge nach dem zu ordnen, was das Programm für den besten Zug hält, ohne zu suchen. Diese Punktzahl basiert normalerweise auf Mobilität, Stückquadratwert, Zentralkontrolle, Verlauf, Angriffspotential, Erfassungen und anderen Elementen, die der Programmierer für wichtig hält. So wie Menschen ihre Kandidatenbewegungen auf der Grundlage von Intuition und Geschichte basieren, sucht der Computer zuerst nach der Bewegung mit der höchsten Punktzahl.

Wenn der Computer auf nur fünf Knoten beschränkt ist, sucht der Computer nur nach den fünf Zügen mit der höchsten Punktzahl. Dieser Zeitlimitfaktor kann dazu führen, dass der Computer einen Partner verpasst, wenn er schlecht bewertet wird. Die erste Methode, um dies zu korrigieren, bestand darin, Ausfallsicherungen einzurichten. Diese würden eine Suche abbrechen, wenn die Position merklich schlechter oder deutlich besser würde. Die Hoffnung war, mehr Zeit für die Suche nach mehr Variationen zu lassen, die die Zeit besser nutzen könnten. Andere Suchalgorithmen, die iterative Vertiefung, haben das Zeitmanagement verbessert, da sie eine kürzere Länge haben, bevor sie eine Ausfallsicherung durchführen.

Fred Knight
quelle
0

Dieses Problem ähnelt einigen Codierungsproblemen. Stockfish hat bereits mehrere vorberechnete Zugsätze. Es stellt den Zustand des Schachbretts mithilfe mehrerer Bitboards dar, anhand derer die Brettpositionen anhand einer kategorialen (Checks, Tempi, Checkmates) und statistischen Darstellung (Stückwerte) bewertet werden. Fast sofort wird ein erweiterter Alpha-Beta-Suchalgorithmus verwendet. Um dieselbe Position nicht mehrmals zu analysieren, wird eine Transpositionstabelle verwendet. Dies ist im Wesentlichen das Auswendiglernen der Suchfunktion, was bei vielen graphentheoretischen Programmierproblemen von grundlegender Bedeutung ist. Somit wird tatsächlich ein ziemlich einfacher Algorithmus verwendet. Hier sind einige Untersuchungen, die zuvor durchgeführt wurden:

Schritt 1. Knoten initialisieren

Schritt 2. Überprüfen Sie, ob die Suche abgebrochen und sofort gezeichnet wurde. Knotenlimit hier erzwingen. (Dies funktioniert nur mit 1 Such-Thread ab Stockfish 2.3.1.)

Schritt 3. Mate Distanzschnitt. Selbst wenn wir uns beim nächsten Zug paaren, wäre unsere Punktzahl bestenfalls mate_in (Textsrightarrowtextply + 1textssrightarrowtextply + 1, aber wenn Alpha bereits größer ist, weil ein kürzerer Mate oben im Baum gefunden wurde, müssen wir nie weiter suchen Schlagen Sie das aktuelle Alpha. Dieselbe Logik, jedoch mit umgekehrten Vorzeichen, gilt auch unter der entgegengesetzten Bedingung, dass Sie sich paaren, anstatt einen Partner zu geben. In diesem Fall erhalten Sie eine fehlgeschlagene Punktzahl.

Schritt 4. Suche nach Transpositionstabellen. Wir möchten nicht, dass die Punktzahl einer Teilsuche eine vorherige vollständige Suche überschreibt. Bei einem ausgeschlossenen Zug verwenden wir einen anderen Positionsschlüssel.

Schritt 5. Bewerten Sie die Position statisch und aktualisieren Sie die Gewinnstatistik der Eltern

Schritt 6. Rasieren (wird in PV-Knoten weggelassen)

Schritt 7. Statische Nullpunktverschiebung (wird in PV-Knoten weggelassen). Wir wetten, dass der Gegner keinen Zug hat, der die Punktzahl um mehr als futility_margin (Tiefe) verringert, wenn wir einen Nullzug machen.

Schritt 8. Null-Verschiebungssuche mit Verifizierungssuche

Schritt 9. ProbCut. Wenn wir eine sehr gute Erfassung haben und eine reduzierte Suche einen Wert weit über dem Beta zurückgibt, können wir den vorherigen Zug (fast) sicher beschneiden.

Schritt 10. Interne iterative Vertiefung.

Schritt 11. Durchlaufen Sie die Bewegungen. Durchlaufen Sie alle pseudo-legalen Züge, bis keine Züge mehr vorhanden sind oder ein Beta-Cutoff auftritt

Schritt 12. Erweitern Sie Kontrollen und auch gefährliche Bewegungen

Schritt 13. Sinnlosigkeit beschneiden.

Schritt 14. Machen Sie den Umzug

Schritt 15. Reduzierte Tiefensuche (LMR). Wenn die Bewegung fehlschlägt, wird hoch in voller Tiefe erneut gesucht.

Schritt 16. Suche in voller Tiefe, wenn LMR übersprungen wird oder hoch ausfällt.

Schritt 17. Bewegung rückgängig machen

Schritt 18. Suchen Sie nach neuen besten Zügen

Schritt 19. Auf Split prüfen

Schritt 20. Auf Partner und Patt prüfen

Schritt 21. Tabellen aktualisieren. Aktualisieren Sie den Eintrag der Transpositionstabelle, die Killer und den Verlauf

Ich werde versuchen zu erklären, wovon die Forschung des Professors spricht. Stockfish erstellt einen Suchbaum für den legalen Umzug. Geben Sie hier die Bildbeschreibung ein Anschließend wird bewertet, ob jede Bewegung gut oder schlecht ist und wie gut oder schlecht sie ist, indem zuerst ein flaches Suchfeld ausgeführt und dann die resultierenden Alpha / Beta-Grenzwerte als Startwerte für eine tiefere Suche verwendet werden. Stockfisch priorisiert auch Stücke. Zum Beispiel würden Ritter in der Mitte priorisiert. Wenn also ein Ritter und ein Bischof in der Mitte gegabelt werden, bewegt dies den Ritter, es sei denn, es gibt andere bedeutende Gewinne durch das Bewegen des Bischofs. Während dies kompliziert erscheinen mag, ist diese Ausführung ungefähr logarithmisch (Anzahl der möglichen Züge), was sie noch ziemlich schnell macht.

QuIcKmAtHs
quelle
@ user3727079 hilft das?
QuIcKmAtHs
1
Leider nein. Ich verstehe deine Antwort nicht. Es scheint nicht meine Frage zu beantworten, auf welchem ​​Knoten zuerst gesucht werden soll, und nicht, wie Stockfish seine Entscheidungen trifft (ich verstehe, was es bedeutet, Bäume zu durchsuchen).
Allure