لقد كنت ألعب الشطرنج لفترة طويلة جدًا، ومنذ أن بدأت لعبة CS، كنت أرغب دائمًا في إنشاء روبوت شطرنج. لقد فعلت ذلك أخيرا؟.
إليك مقطع فيديو حيث تم سحقي (أبيض) بواسطة الروبوت الخاص بي (أسود).
هذا هو الملف الشخصي الخاص بموقع chess.com: https://www.chess.com/member/chessables_with_chat_gpt.
git clone https://github.com/samliu21/chess-ai
. انتقل إلى الدليل باستخدام cd chess-ai
.python -m venv .
وقم بتنشيطه باستخدام source bin/activate
.python -m pip install -r requirements.txt
.cd gui
واتصل python main.py
للعب! لقد استخدمت قاعدة بيانات Lichess الرسمية، والتي تحتوي على ألعاب بتنسيق PGN القياسي. فيما يلي عملية تنظيف البيانات:
pgn-extract
لإضافة FENs بعد كل خطوة لمزيد من المعلومات، انظر إلى مجلد data_cleaning
.
في البداية، حاولت إنشاء شبكة عصبية لتقييم اللوحة للاقتران بخوارزمية minimax. كانت هناك مشكلتان في هذا النهج:
لم يكن أداء شبكة التقييم على مستوى توقعاتي. يمكنه اكتشاف اختلالات المواد ولكن لا يمكنه اكتشاف رفيقات بسيطة.
نظرًا لمساحة العمل الكبيرة في لعبة الشطرنج، تكون خوارزمية الحد الأدنى بطيئة جدًا، حتى عند تحسينها باستخدام تقليم ألفا بيتا.
دفعتني هذه العوامل معًا إلى إلغاء هذه الفكرة الأولية وتجربة فكرة أخرى.
تم تصنيع واجهة المستخدم الرسومية يدويًا باستخدام وحدات pygame
و python-chess
.
هذه الهندسة المعمارية مستوحاة إلى حد كبير من ورقة ستاندفورد هذه.
يستخدم الذكاء الاصطناعي نموذجين. كلاهما يحصل على موضع اللوحة كمدخل ومخرج لمصفوفة 8x8
من احتمالات softmax. يتنبأ "من النموذج" بالمربع الذي سيتم نقله منه ويتنبأ "إلى النموذج" بالمربع الذي سيتم نقله إليه.
من الأفضل توضيح هذا النهج بمثال. ضع في اعتبارك موضع لوحة البداية والحركة: Nf3
. تقييم هذه النقلة هو حاصل ضرب القيمة عند مربع g1
للنموذج من والقيمة عند المربع f3
للنموذج إلى.
من بين جميع التحركات القانونية، المنتج الأكبر هو التحرك المحدد.
تتكون الشبكات العصبية من ست طبقات تلافيفية، تليها طبقتان متقاربتان وطبقة إخراج. يمكن العثور على رسم أكثر تفصيلاً للهندسة المعمارية أدناه:
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
__________________________________________________________________________________________________