Ich spiele schon sehr lange Schach und seit ich mit CS angefangen habe, wollte ich immer einen Schachbot erstellen. Endlich habe ich es geschafft?
Hier ist ein Video, in dem ich (weiß) von meinem Bot (schwarz) zerquetscht werde.
Hier ist das Profil von chess.com: https://www.chess.com/member/chessables_with_chat_gpt.
git clone https://github.com/samliu21/chess-ai
aus. Navigieren Sie mit cd chess-ai
in das Verzeichnis.python -m venv .
und aktivieren Sie es mit source bin/activate
.python -m pip install -r requirements.txt
.cd gui
zum richtigen Verzeichnis und rufen Sie zum Abspielen python main.py
auf! Ich habe die offizielle Lichess-Datenbank verwendet, die Spiele im Standard-PGN-Format enthielt. Hier ist der Datenbereinigungsprozess:
pgn-extract
um nach jeder Bewegung FENs hinzuzufügen Weitere Informationen finden Sie im Ordner data_cleaning
.
Zunächst habe ich versucht, ein neuronales Netzwerk zur Platinenbewertung zu erstellen, das mit einem Minimax-Algorithmus gekoppelt werden kann. Bei diesem Ansatz gab es zwei Probleme:
Das Bewertungsnetzwerk hat meine Erwartungen nicht erfüllt. Es konnte Materialungleichgewichte erkennen, aber keine einfachen Schachmatts.
Aufgrund des großen Aktionsraums im Schach ist der Minimax-Algorithmus sehr langsam, selbst wenn er mit Alpha-Beta-Pruning optimiert wird.
Zusammengenommen veranlassten mich diese Faktoren, diese ursprüngliche Idee zu verwerfen und eine andere auszuprobieren.
Die GUI wurde mit den Modulen pygame
und python-chess
handgefertigt.
Diese Architektur wurde weitgehend von diesem Standford-Artikel inspiriert.
Die KI verwendet zwei Modelle. Beide erhalten eine Board-Position als Eingabe und geben eine 8x8
Matrix aus Softmax-Wahrscheinlichkeiten aus. Das „Von-Modell“ sagt das Quadrat voraus, aus dem verschoben werden soll, und das „Nach-Modell“ sagt das Quadrat voraus, in das verschoben werden soll.
Dieser Ansatz lässt sich am besten anhand eines Beispiels veranschaulichen. Betrachten Sie die Startposition auf dem Brett und den Zug: Nf3
. Die Bewertung dieser Bewegung ist das Produkt des Wertes am g1
-Quadrat des Von-Modells und des Werts am f3
Quadrat des Bis-Modells.
Unter allen legalen Zügen ist der ausgewählte Umzug das größte Produkt.
Die neuronalen Netze bestehen aus sechs Faltungsschichten, gefolgt von zwei affinen Schichten und einer Ausgabeschicht. Eine detailliertere Skizze der Architektur finden Sie unten:
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 8, 8, 12)] 0 []
conv2d (Conv2D) (None, 8, 8, 32) 3488 ['input_1[0][0]']
batch_normalization (BatchNorm (None, 8, 8, 32) 128 ['conv2d[0][0]']
alization)
activation (Activation) (None, 8, 8, 32) 0 ['batch_normalization[0][0]']
conv2d_1 (Conv2D) (None, 8, 8, 64) 18496 ['activation[0][0]']
batch_normalization_1 (BatchNo (None, 8, 8, 64) 256 ['conv2d_1[0][0]']
rmalization)
activation_1 (Activation) (None, 8, 8, 64) 0 ['batch_normalization_1[0][0]']
conv2d_2 (Conv2D) (None, 8, 8, 256) 147712 ['activation_1[0][0]']
batch_normalization_2 (BatchNo (None, 8, 8, 256) 1024 ['conv2d_2[0][0]']
rmalization)
activation_2 (Activation) (None, 8, 8, 256) 0 ['batch_normalization_2[0][0]']
concatenate (Concatenate) (None, 8, 8, 512) 0 ['activation_2[0][0]',
'activation_2[0][0]']
conv2d_3 (Conv2D) (None, 8, 8, 256) 1179904 ['concatenate[0][0]']
batch_normalization_3 (BatchNo (None, 8, 8, 256) 1024 ['conv2d_3[0][0]']
rmalization)
activation_3 (Activation) (None, 8, 8, 256) 0 ['batch_normalization_3[0][0]']
concatenate_1 (Concatenate) (None, 8, 8, 320) 0 ['activation_3[0][0]',
'activation_1[0][0]']
conv2d_4 (Conv2D) (None, 8, 8, 256) 737536 ['concatenate_1[0][0]']
batch_normalization_4 (BatchNo (None, 8, 8, 256) 1024 ['conv2d_4[0][0]']
rmalization)
activation_4 (Activation) (None, 8, 8, 256) 0 ['batch_normalization_4[0][0]']
concatenate_2 (Concatenate) (None, 8, 8, 288) 0 ['activation_4[0][0]',
'activation[0][0]']
conv2d_5 (Conv2D) (None, 8, 8, 256) 663808 ['concatenate_2[0][0]']
batch_normalization_5 (BatchNo (None, 8, 8, 256) 1024 ['conv2d_5[0][0]']
rmalization)
activation_5 (Activation) (None, 8, 8, 256) 0 ['batch_normalization_5[0][0]']
dense (Dense) (None, 8, 8, 256) 65792 ['activation_5[0][0]']
batch_normalization_6 (BatchNo (None, 8, 8, 256) 1024 ['dense[0][0]']
rmalization)
dense_1 (Dense) (None, 8, 8, 64) 16448 ['batch_normalization_6[0][0]']
batch_normalization_7 (BatchNo (None, 8, 8, 64) 256 ['dense_1[0][0]']
rmalization)
dense_2 (Dense) (None, 8, 8, 1) 65 ['batch_normalization_7[0][0]']
batch_normalization_8 (BatchNo (None, 8, 8, 1) 4 ['dense_2[0][0]']
rmalization)
softmax (Softmax) (None, 8, 8, 1) 0 ['batch_normalization_8[0][0]']
==================================================================================================
Total params: 2,839,013
Trainable params: 2,836,131
Non-trainable params: 2,882
__________________________________________________________________________________________________