In Bezug auf die AlphaZero vs Stockfisch Spiel, hat diese Frage bereits behandelt worden hier von SmallChess .
Abgesehen von AlphaZero (das bei der Erforschung der Spiellinien eine spezielle Monte-Carlo- 1- Routine verwendet), die konstruktionsbedingt nicht deterministisch ist , für die üblichen heuristikbasierten Schach-Engines wie Stockfish und andere (obwohl es andere gibt) AFAIK Rybka hatte Motoren mit MC-basierten Routinen) ist die Quelle der Zufälligkeit im Allgemeinen nur eine Folge technischer Aspekte bei der Implementierung, anstatt dass absichtliche Zufälligkeit algorithmisch in die Entscheidungsfindung des Motors eingeführt wird. Abstrakt gesehen ist ein Grund dafür die Tatsache, dass die Engines nicht rein sequentiell laufen (eine Aufgabe nach der anderen ausführen). Um die Engines effizienter zu machen, führen sie stattdessen parallele Suchvorgänge in verschiedenen Zweigen des Baums möglicher Bewegungen durch. Sie tun dies über das sogenannte Multithreading (oder -processing, aber das ist ein bisschen anders). Es sind also mehrere Threads der CPUs gleichzeitig vorhandenFühren Sie Operationen aus, um den Baum zu durchsuchen (und die Auswertungen der besuchten Positionen zwischenzuspeichern). Stellen Sie sich also vor, jedem Thread wird ein Teilbaum zugewiesen. Das Problem bei dieser Art der Implementierung besteht darin, dass die Gesamtausführung der Threads stark von allen möglichen Bedingungen abhängt (Wartezeiten, RAM-Swaps, ...), sodass am Ende eine Hauptvariante ausgewählt werden kann, ohne alle anderen zuzulassen Threads, um ihre Suche zu beenden.
Dies geschieht in der Tat häufig, weil die Engine so eingestellt ist, dass sie innerhalb einer bestimmten Zeit eine Entscheidung trifft, sodass das Zeitmanagement das Verhalten ändert. Sie können diese Aussage auch rückgängig machen, indem Sie sagen: Die Kenntnis des Algorithmus und die Implementierung deterministischer Threading-Routinen reichen nicht aus, um den Status des Programms nach einem beliebigen Zeitpunkt t zuverlässig vorherzusagen. Wenn man immer zulässt, dass alle Threads ihre Suche beenden, und während dieser Ausführung keine Parallelitätsprobleme aufgetreten sind (z. B. ein Thread, der versucht, auf einen bestimmten Cache zuzugreifen, auf den nicht zugegriffen werden kann), ist das Verhalten tatsächlich vollständig reproduzierbar vorausgesetzt, alles andere ist das gleiche 2 .
1 : Zusammen mit der Tatsache, dass sich das neuronale Netzwerk durch zusätzliches Training (zum Beispiel Selbstspiel) ständig weiterentwickelt (neu angepasste Parameter) oder wenn Sie so wollen, hat seine Bewertungsfunktion keine konstante, feste Definition (im Gegensatz zu heuristikbasierten Engines) ).
2 : Selbst dann, wie Sie sagten, gibt es auf der Eröffnungsebene mit einem Eröffnungsbuch manchmal absichtliche zufällige Entscheidungen der Engine, welche Variante zu wählen ist. In ähnlicher Weise kann es außerhalb der Eröffnungsphase Momente geben, in denen mehrere Variationen nahezu gleiche Bewertungen haben (innerhalb der für das Eval gewählten Auflösung), und dann basierend auf dem Design möglicherweise zufällig eine auswählen. Schließlich müssen Sie auf der Ebene der Motoreinstellungen auch vorsichtig sein, z. B. die Suchtiefe und die für jede Engine ausgewählten Überlegungszeiten (und ob sie während der Überlegungszeiten des jeweils anderen weiter berechnet werden können).