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.
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.