mở đầu trận đấu một cách ổn định và đa dạng, khoá luận này sử dụng Openings Book - thường được sử dụng trong các trận đấu của các máy tính chơi cờ vua. Openings Book hay còn gọi là sách khai cuộc, là một tập hợp các nước đi khai cuộc được lưu trữ dưới dạng: pos “vị trí các quân cờ” “lượt đi tiếp theo” “trạng thái nhập thành” “en passant” “nước đi” “tần suất nước đi được sử dụng” Ví dụ: pos rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - e2e4 243109 Những thông tin trên được hiểu như sau: “rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR” - biểu diễn các quân cờ trên bàn cờ. Chữ thường biểu thị quân đen, chữ hoa biểu thị quân trắng. “w” - nước đi tiếp theo là của quân trắng.
“-” không thể thực hiện “en passant” “e2e4 243109” - Tốt trắng di chuyển từ e2 đến e4, 243109 chỉ ra tần suất nước đi này được thực hiện trong các nghiên cứu trước đây.6 Thuật toán đọc dữ liệu từ Openings Book Đầu tiên, cần tách file thành các mục riêng biệt. Chia các chuỗi nước đi thành các chuỗi con sử dụng “pos” làm ngăn cách, lưu vào Span<string> dưới tên entries. Sử dụng vòng lặp for lặp qua các entries. Các entries được chia thành các dòng sử dụng “\n” làm phân cách, entries đầu tiên được gán cho một biến string đặt tên là positionFen.
Các dòng còn lại được lưu trữ trong Span<string> có tên allMoveData. Duyệt allMoveData, chia dữ liệu thành các chuỗi con ngăn cách với nhau bởi khoảng trắng (‘ ‘). Chuyển đổi các chuỗi con từ dạng string sang dạng int và lưu trong mảng bookMoves với chỉ số moveIndex tương ứng. Đoạn code này trích xuất dữ liệu nước đi từ file “Book.txt” và lưu trữ chúng như một từ điển các nước đi.
Với một khởi đầu ổn định, Bot có thể dễ dàng tiến vào giai đoạn sau của trận đấu với vô số khả năng. Tuy nhiên, cần phải tính toán kỹ lưỡng, tận dụng các lợi thế để lập kế hoạch cho việc đưa quân cờ vào các vị trí thuận lợi. Với thuật toán Minimax, có thể tìm kiếm qua tất cả các nước đi tiếp theo có thể xảy ra và đánh giá chúng để đưa ra nước đi tốt nhất. Thuật toán Minimax Minimax [9] sử dụng một cây tìm kiếm để duyệt qua các nước đi tiếp theo và đánh giá chúng.
Cây tìm kiếm bao gồm các nút đại diện cho trạng thái của trò chơi và các cạnh đại diện cho nước đi. Bằng cách duyệt cây tìm kiếm, Minimax có thể xác định nước đi tốt nhất.7 Lưu đồ thuật toán Minimax - Bắt đầu từ trạng thái hiện tại của bàn cờ, tạo cây trò chơi bằng cách tạo tất cả các nước đi có thể, mỗi node đại diện cho một trạng thái của bàn cờ. - Đánh giá trạng thái mỗi nút theo góc nhìn của người chơi dựa trên các tiêu chí: + Giá trị của các quân cờ: Mỗi quân cờ được gán giá trị dựa trên độ mạnh yếu của quân cờ. + Vị trí chiến lược của các quân cờ: Dựa trên giá trị cơ bản của các quân cờ, đánh giá giá trị hiện tại của các quân cờ theo vị trí trên bàn cờ.
Càng gần trung tâm bàn cờ và các vị trí dẫn đến chiến thắng (gần vua đối thủ hoặc ở vị trí có thể gây nguy hiểm cho vua đối thủ) càng tăng cao giá trị của quân cờ. + Cấu trúc bàn cờ: Thể hiện sự cân bằng giữa phòng thủ và tấn công của người chơi. Đánh giá dựa trên sự phát triển của quân cờ (giá trị hiện tại), số lượng quân cờ trên bàn, sự an toàn của vua, sự liên kết giữa các quân cờ. + Tiềm năng tấn công và phòng thủ: Đánh giá dựa trên sự bảo vệ vua của các quân cờ, khả năng tấn công các quân cờ quan trọng và bảo vệ các quân cờ đồng minh.
16 + Tiến độ trò chơi: Đánh giá tiến độ trò chơi (Khai cuộc, trung cuộc, tàn cuộc) dựa trên số quân cờ đã mất, sự thay đổi trong cấu trúc bàn cờ, khả năng tấn công của mỗi người chơi. - Đệ quy Minimax: Bắt đầu từ nút gốc của cây, thực hiện đệ quy Minimax để đánh giá tất cả các nút con + Nếu nút là một trạng thái kết thúc của trận đấu (hoà hoặc chiếu hết), trả về giá trị của trạng thái đó. + Nếu nút là lượt đi của người chơi hiện tại, chọn giá trị tối đa của các node con. + Nếu nút là lượt đi của đối thủ, chọn giá trị tối thiểu của các node con.
Sau khi đệ quy Minimax, chọn nước đi tối ưu từ nút gốc của cây dựa trên giá trị tối đa hoặc tối thiểu đã tính toán từ các nút. Tuy nhiên, nếu chỉ sử dụng thuật toán Minimax, chương trình có thể trở nên rất tốn thời gian và tài nguyên tính toán bởi số lượng nút lớn và thời gian tính toán lâu. Do đó, cần sử dụng các kỹ thuật cải tiến thuật toán Minimax để làm tăng hiệu suất tìm kiếm và giảm độ phúc tạp. Cải tiến thuật toán Minimax 2.
Alpha-Beta Pruning - Alpha-Beta Pruning [10] : sử dụng hai giá trị là alpha và beta để đánh giá các nút trong cây tìm kiếm, giá trị alpha là tốt nhất với người chơi hiện tại, beta là giá trị tốt nhất cho đối thủ. Alpha-Beta Pruning hoạt động theo cách sau: 1. Bắt đầu từ gốc của cây tìm kiếm. Duyệt qua các nút con theo thứ tự từ trái qua phải và thực hiện đệ quy.
Khi đệ quy đến một nút, kiểm tra giá trị alpha và beta hiện tại và các giá trị thu được từ các nút đã duyệt qua. Nếu alpha tại nút hiện tại lớn hơn hoặc bằng beta, đối thủ chắc chắn sẽ không chọn vì nó tốt hơn những nốt trước đó. Do đó, ta có thể cắt tỉa nhánh này và không cần duyệt qua các nút con còn lại. Nếu beta nhỏ hơn hoặc bằng alpha, người chơi chắc chắn sẽ không chọn vì nó tốt hơn những nút trước đó.
Do đó, ta cũng có thể cắt tỉa nhánh này và không cần duyệt qua những nút con còn lại. Cập nhật giá trị alpha và beta tại nút hiện tại. Lặp lại các bước trên cho tất cả nút con còn lại 17 Hình 2.8 Kỹ thuật Alpha-Beta Pruning Áp dụng kỹ thuật Alpha-Beta Pruning mang lại lợi ích đáng kể trong quá trình xây dựng bot, tuy nhiên vẫn còn có thể tối ưu hiệu suất của bot. Transposition Table Theo một bài báo của Ernst A.
Heinz cung cấp cái nhìn về việc quản lý hiệu quả Transposition Table trong các ứng dụng thực tế, ta có thể áp dụng để nâng cao hiệu suất của bot cờ vua. [11] Trong quá trình tìm kiếm, thuật toán Minimax thường phải duyệt qua rất nhiều nút có cùng trạng thái. Điều đó dẫn đến việc phải tính toán lại các giá trị đánh giá cho những trạng thái đó, gây lãng phí thời gian và tài nguyên tính toán. Transposition Table là một cấu trúc dữ liệu được sử dụng trong thuật toán Minimax để lưu trữ và tái sử dụng các giá trị đã tính toán trong quá trình tìm kiếm.
Các giá trị đánh giá cho mỗi trạng thái của bàn cờ được lưu trữ. Khi duyệt một nút mới, nếu trạng thái này đã được lưu trữ trong Transposition Table, có thể sử dụng lại giá trị đã được đánh giá mà không cần tính toán lại. Transposition Table lưu trữ các cặp key-value, trong đó key là trạng thái và value là giá trị được đánh giá của trạng thái đó. Tuy nhiên, sử dụng Transposition Table cần lưu ý về kích thước bộ nhớ và cập nhật các giá trị khi trạng thái thay đổi.
Để khắc phục vấn đề này, chỉ lưu trữ đối với các nước đi gần tốt nhất, không lưu trữ các giá trị mang lại lợi ích lớn cho đối thủ. Do cờ vua là một trò chơi có không gian trạng thái lớn, khi bàn cờ tiến vào trạng thái khác, thay thế giá trị của các trạng thái được lưu trữ bằng giá trị của các trạng thái mới để đảm bảo tính chính xác của thông tin đã lưu trữ.9 Tạo transposition table và làm trống các trạng thái cũ Tham số size đại diện cho kích thước bộ nhớ được cấp cho bảng. Mảng positions được khởi tạo để lưu trữ các vị trí trong bảng với kích thước là positionCount. Phương thức Clear() dụng để xoá toàn bộ dữ liệu trong bảng.
Đảm bảo rằng toàn bộ dữ liệu được xoá và chuẩn bị sẵn sàng lưu trữ dữ liệu mới. Nếu hai hoặc nhiều trạng thái có cùng giá trị có thể dẫn đến xung đột dẫn đến sai sót trong đánh giá. Number of Positions 105 106 107 108 109 1010. Số lượng bit cần thiết để giảm xác suất xung đột trong Transposition Table 2.
Sắp xếp ưu tiên các nước đi Cây tìm kiếm của thuật toán Minimax đem lại rất nhiều nước đi, tuy nhiên, thay vì duyệt qua các nước đi cố định, ta có thể sắp xếp các nước đi dựa trên một số tiêu chí để đưa những nước đi tiềm năng nhất lên đầu danh sách. Sử dụng các tiêu chí đánh giá sau: - Ưu tiên các nước đi kiểm soát trung tâm bàn cờ. Trung tâm bàn cờ là vị trí quan trọng trong cờ vua, chiếm được quyền kiểm soát trung tâm bàn cờ sẽ đem lại lợi thế về không gian và khả năng tấn công. 19 - Sau khi kiểm soát được trung tâm bàn cờ, ưu tiên những nước đi có khả năng ăn quân đối thủ, sắp xếp theo giá trị của các quân bị tấn công.10 Thuật toán sắp xếp thứ tự ưu tiên các nước đi Hàm nhận một đối tượng board đại diện cho trạng thái hiện tại của bàn cờ.
Biến remainingMaterial tính toán giá trị quân cờ còn lại trên bàn cờ. Biến interpFactor được tính toán bằng cách chia tỉ lệ quân cờ còn lại trên bàn cờ cho giá trị quân cờ tối đa. Giá trị này được tạo ra để đánh giá giai đoạn giữa trận và cuối trận. 20 Mảng m được khởi tạo với kích thước bằng số lượng các nước đi có thể trong trạng thái hiện tại của bàn cờ.
Sử dụng vòng lặp để duyệt qua các nước đi có thể. Trong mỗi vòng lặp, điểm đánh giá score của mỗi nước đi được tính toán dựa trên các yếu tố như loại quân cờ, việc bắt quân, phong Hậu, vị trí và các yếu tố khác. Các điểm đánh giá score được lưu trữ cùng với nước đi tương ứng trong mảng m. Mảng m được sắp xếp theo thứ tự giảm dần của điểm đánh giá.
Danh sách các nước đi được sẽ được trả về dưới dạng một danh sách, chọn ra nước đi từ mảng m và bỏ qua điểm đánh giá. Cải tiến hàm đánh giá Dựa trên các yếu tố đánh giá trạng thái của bàn cờ, bổ sung thông tin chiến thuật để cải thiện độ chính xác của khả năng đánh giá.