Dieses Repository enthält die Implementierung einer Schach-Engine mit Minimax , Alpha-Beta-Pruning und dem Quieszenz-Suchalgorithmus . Für die Codierung wird ein Jupyter-Notebook in einem Docker-Container verwendet. Alle Jupyter-Notebooks sind auch in Form eines Docker-Images verfügbar.
Schauen Sie sich das Projektpapier an, um eine detaillierte Analyse zu sehen.
docker pull codewithnk/chess-engine-using-python:latest
docker run -p 8888:8888 -v $( pwd ) codewithnk/chess-engine-using-python:latest
Der Kern des Schachspiels in Minmax. Minmax assoziiert normalerweise die schwarze Figur mit MAX und die weiße Figur mit MIN und bewertet immer aus der weißen Sicht.
Der Minmax-Algorithmus ist ein kontradiktorischer Suchalgorithmus in der Spieltheorie. Es nutzt den Spielbaum und umfasst MIN und MAX für zwei Spieler. Beide Spieler versuchen, die Aktion des anderen zunichte zu machen. Max versucht, das Ergebnis zu maximieren, während MIN versucht, das Ergebnis zu minimieren. Beide Spieler spielen abwechselnd, unter der Annahme, dass beide optimal spielen. Optimales Spiel bedeutet, dass beide Spieler gemäß der Regel spielen, dh MIN minimiert das Ergebnis und MAX maximiert das Ergebnis.
Der Minmax-Algorithmus verwendet den Depth-First-Search-Ansatz, um das Ergebnis zu finden. Darüber hinaus werden Backtracking und Rekursion eingesetzt. Der Algorithmus durchläuft den Knoten bis zum Endknoten und kehrt dann zurück, während er alle untergeordneten Werte vergleicht. Es wählt den Mindest- oder Höchstwert aus, je nachdem, wer an der Reihe ist. Anschließend wird der Wert an das übergeordnete Element zurückgegeben. Es verwendet eine statische Bewertungsfunktion, um den Wert an jedem Blattknoten zu bestimmen. Es nutzt den Vorteil des Nullsummenspiels.
Schach-Engine mit Minmax
Minmax verwendet Depth First Search (DFS) im Spielbaum, daher beträgt die zeitliche Komplexität des Minmax-Algorithmus O(b**m) , wobei b der Verzweigungsfaktor des Spielbaums und m die maximale Tiefe des Baums ist.
Die räumliche Komplexität des Minmax-Algorithmus ähnelt auch der von DFS, nämlich O(bm) , wobei b der Verzweigungsfaktor des Spielbaums und m die maximale Tiefe des Baums ist.
Der Minmax-Algorithmus ist abgeschlossen. Es wird auf jeden Fall eine Lösung, falls vorhanden, im endlichen Suchbaum finden.
Der Minmax-Algorithmus ist optimal, wenn beide Gegner optimal spielen.
Der Minmax-Algorithmus kann durch Beschneiden einiger Zweige optimiert werden. Beschnittene Äste haben keinen Einfluss auf das Ergebnis. Es wird die Zeitkomplexität verbessern. Diese Minmax-Version ist als Minmax mit Alpha-Beta-Beschneidung bekannt. Er wird auch als Alpha-Beta-Algorithmus bezeichnet.
Beim Alpha-Beta-Beschneiden gibt es zwei Werte: Alpha und Beta. Im Folgenden finden Sie einige Punkte, die Sie bei Alpha und Beta beachten sollten:
Beim Backtracking wird nur der Knotenwert an den übergeordneten Knoten übergeben, nicht der Alpha- und Betawert.
Die Bedingung für das Alpha-Beta-Beschneiden:
α >= β
Die Wirksamkeit des Alpha-Beta-Algorithmus hängt stark von der Reihenfolge der Durchquerung ab. Es spielt eine entscheidende Rolle bei der Zeit- und Raumkomplexität.
In einigen Fällen wird kein Knoten oder Unterbaum aus dem Game Tree entfernt. In diesem Fall findet der beste Zug im rechten Unterbaum des Spielbaums statt. Dies führt zu einer erhöhten Zeitkomplexität.
In diesem Fall wird die maximale Anzahl an Knoten und Unterbäumen beschnitten. Die besten Züge finden im linken Teilbaum statt. Dadurch wird die zeitliche und räumliche Komplexität verringert.
Schach-Engine mit Alpha-Beta-Pruning
Der Alpha-Beta-Algorithmus verwendet auch Depth First Search (DFS) im Game Tree.
Der Alpha-Beta-Algorithmus ist abgeschlossen. Es wird auf jeden Fall eine Lösung, falls vorhanden, im endlichen Suchbaum finden.
Der Alpha-Beta-Algorithmus ist optimal, wenn beide Gegner optimal spielen.
Die Ruhesuche ist eine Modifikation zusätzlich zum Alpha-Beta-Pruning mit Min-Max. Ruhe bedeutet Stille. Bei dieser Suche werden nur ruhige Bewegungen ausgewertet. Mit anderen Worten: Ab einer bestimmten Tiefe werden nur noch Fangzüge zur Berechnung der nächsten Züge verwendet. Eine Ruhesuche kann den Horizonteffekt vermeiden.
Der Horizonteffekt tritt auf, wenn wir nur bis zu einer bestimmten Tiefe suchen. Es kann jedoch vorkommen, dass die Bewegung weniger Punkte bringt, wenn wir noch eine Ebene tiefer blicken. Um dies zu verhindern, verwendet eine Ruhesuche nur Fangzüge. Die Ruhesuche reduziert außerdem den Verzweigungsfaktor auf verschiedenen Ebenen, was zu einem schnellen Algorithmus führt.
Der Ruhesuchalgorithmus verwendet auch die Tiefensuche (DFS) im Game Tree.
Der Ruhesuchalgorithmus ist abgeschlossen. Es wird auf jeden Fall eine Lösung, falls vorhanden, im endlichen Suchbaum finden.
Der Ruhesuchalgorithmus ist optimal, wenn beide Gegner optimal spielen.