ฉันเล่นหมากรุกมาเป็นเวลานาน และนับตั้งแต่ฉันเริ่ม 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
เพื่อเพิ่ม FEN หลังจากการเคลื่อนไหวแต่ละครั้ง สำหรับข้อมูลเพิ่มเติม โปรดดูที่โฟลเดอร์ data_cleaning
ในตอนแรก ฉันพยายามสร้างโครงข่ายประสาทเทียมประเมินบอร์ดเพื่อจับคู่กับอัลกอริธึมมินิแม็กซ์ มีสองประเด็นเกี่ยวกับวิธีการนี้:
เครือข่ายการประเมินผลไม่เป็นไปตามความคาดหวังของฉัน สามารถตรวจจับความไม่สมดุลของวัสดุได้ แต่ไม่สามารถตรวจจับการรุกฆาตธรรมดาได้
เนื่องจากพื้นที่การเล่นหมากรุกขนาดใหญ่ อัลกอริธึม minimax จึงช้ามาก แม้ว่าจะปรับให้เหมาะสมด้วยการตัดอัลฟาเบต้าก็ตาม
ปัจจัยเหล่านี้ร่วมกันกระตุ้นให้ฉันทิ้งแนวคิดเริ่มแรกนี้และลองแนวคิดอื่น
GUI ถูกสร้างขึ้นด้วยมือโดยใช้โมดูล pygame
และ python-chess
สถาปัตยกรรมนี้ส่วนใหญ่ได้รับแรงบันดาลใจมาจากกระดาษของสแตนฟอร์ด
AI ใช้สองโมเดล พวกเขาทั้งสองได้รับตำแหน่งบอร์ดเป็นอินพุตและเอาต์พุตเมทริกซ์ 8x8
ของความน่าจะเป็นแบบ softmax "จากแบบจำลอง" ทำนายสี่เหลี่ยมจัตุรัสที่จะย้ายออก และ "สู่แบบจำลอง" ทำนายสี่เหลี่ยมจัตุรัสที่จะย้ายเข้าไป
วิธีนี้จะแสดงตัวอย่างได้ดีที่สุด พิจารณาตำแหน่งกระดานเริ่มต้นและการเคลื่อนไหว: Nf3
. การประเมินการย้ายนี้คือผลคูณของค่าที่ช่อง g1
ของแบบจำลองจาก และค่าที่ช่อง f3
ของแบบจำลองถึง
ในบรรดาการเคลื่อนไหวทางกฎหมายทั้งหมด ผลิตภัณฑ์ที่ใหญ่ที่สุดคือการเคลื่อนไหวที่เลือก
โครงข่ายประสาทเทียมประกอบด้วยชั้น Convolutional จำนวน 6 ชั้น ตามด้วยชั้น Affine 2 ชั้น และชั้นเอาท์พุต 1 ชั้น สามารถดูภาพร่างสถาปัตยกรรมโดยละเอียดเพิ่มเติมได้ด้านล่าง:
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
__________________________________________________________________________________________________