Saya sudah lama bermain catur, dan sejak saya memulai Ilmu Komputer, saya selalu ingin membuat bot catur. Saya akhirnya melakukannya?.
Ini video dimana saya (kulit putih) dihancurkan oleh bot saya (hitam).
Berikut profil Chess.com-nya: https://www.chess.com/member/chessables_with_chat_gpt.
git clone https://github.com/samliu21/chess-ai
. Arahkan ke direktori dengan cd chess-ai
.python -m venv .
dan aktifkan dengan source bin/activate
.python -m pip install -r requirements.txt
.cd gui
dan panggil python main.py
untuk bermain! Saya menggunakan database resmi Lichess, yang berisi game dalam format standar PGN. Berikut proses pembersihan datanya:
pgn-extract
untuk menambahkan FEN setelah setiap gerakan Untuk informasi lebih lanjut, lihat folder data_cleaning
.
Awalnya, saya mencoba membuat jaringan saraf evaluasi papan untuk dipasangkan dengan algoritma minimax. Ada dua masalah dengan pendekatan ini:
Jaringan evaluasi tidak bekerja sesuai harapan saya. Itu bisa mendeteksi ketidakseimbangan material tetapi tidak bisa mendeteksi sekakmat sederhana.
Karena ruang aksi yang besar dalam catur, algoritme minimax menjadi sangat lambat, bahkan ketika dioptimalkan dengan pemangkasan alfa-beta.
Bersama-sama, faktor-faktor ini mendorong saya untuk membuang ide awal ini dan mencoba ide lain.
GUI dibuat dengan tangan menggunakan modul pygame
dan python-chess
.
Arsitektur ini sebagian besar terinspirasi oleh makalah Standford ini.
AI menggunakan dua model. Keduanya menerima posisi papan sebagai masukan dan keluaran matriks probabilitas softmax 8x8
. "Model dari" memprediksi kotak yang akan dipindahkan dan "model ke" memprediksi kotak yang akan dipindahkan.
Pendekatan ini paling baik diilustrasikan dengan sebuah contoh. Pertimbangkan posisi papan awal dan langkahnya: Nf3
. Evaluasi perpindahan ini merupakan hasil perkalian nilai pada kuadrat g1
model dari dan nilai pada kuadrat f3
model ke.
Di antara semua langkah hukum, produk terbesar adalah langkah yang dipilih.
Jaringan saraf terdiri dari enam lapisan konvolusional, diikuti oleh dua lapisan affine dan satu lapisan keluaran. Sketsa arsitektur yang lebih rinci dapat ditemukan di bawah:
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
__________________________________________________________________________________________________