Hướng dẫn từng bước để xây dựng một AI cờ vua đơn giản

Hãy cùng khám phá một số khái niệm cơ bản sẽ giúp chúng ta tạo ra một AI cờ vua đơn giản:

  • di chuyển thế hệ
  • đánh giá hội đồng
  • minimax
  • và cắt tỉa alpha beta.

Ở mỗi bước, chúng tôi sẽ cải thiện thuật toán của mình bằng một trong những kỹ thuật lập trình cờ được thử nghiệm theo thời gian này. Tôi sẽ chứng minh làm thế nào mỗi ảnh hưởng đến phong cách chơi thuật toán.

Bạn có thể xem thuật toán AI cuối cùng ở đây trên GitHub.

Bước 1: Di chuyển thế hệ và bảng trực quan

Chúng tôi sẽ sử dụng thư viện Chess.js để tạo di chuyển và Chessboard.js để trực quan hóa bảng. Thư viện thế hệ di chuyển về cơ bản thực hiện tất cả các quy tắc của cờ vua. Dựa trên điều này, chúng ta có thể tính toán tất cả các động thái hợp pháp cho một trạng thái hội đồng nhất định.

Một hình dung của chức năng tạo di chuyển. Vị trí bắt đầu được sử dụng làm đầu vào và đầu ra là tất cả các chuyển động có thể từ vị trí đó.

Sử dụng các thư viện này sẽ giúp chúng tôi chỉ tập trung vào nhiệm vụ thú vị nhất: tạo ra thuật toán tìm ra bước đi tốt nhất.

Chúng tôi sẽ bắt đầu bằng cách tạo một hàm chỉ trả về một bước di chuyển ngẫu nhiên từ tất cả các động thái có thể:

Mặc dù thuật toán này không phải là một người chơi cờ rất chắc chắn, nhưng đó là một điểm khởi đầu tốt, vì chúng ta thực sự có thể chơi với nó:

Đen chơi di chuyển ngẫu nhiên. Có thể phát trên https://jsfiddle.net/lhartikk/m14epfwb/4

Bước 2: Đánh giá vị trí

Giờ thì hãy cố gắng hiểu bên nào mạnh hơn ở một vị trí nhất định. Cách đơn giản nhất để đạt được điều này là đếm sức mạnh tương đối của các mảnh trên bảng bằng bảng sau:

Với chức năng đánh giá, chúng tôi có thể tạo ra một thuật toán chọn di chuyển mang lại sự đánh giá cao nhất:

Cải tiến hữu hình duy nhất là thuật toán của chúng tôi sẽ bắt được một mảnh nếu có thể.

Đen chơi với sự trợ giúp của chức năng đánh giá đơn giản. Có thể phát trên https://jsfiddle.net/lhartikk/m5q6fgtb/1/

Bước 3: Tìm kiếm cây bằng Minimax

Tiếp theo, chúng tôi sẽ tạo một cây tìm kiếm từ đó thuật toán có thể chọn nước đi tốt nhất. Điều này được thực hiện bằng cách sử dụng thuật toán Minimax.

Trong thuật toán này, cây đệ quy của tất cả các chuyển động có thể được khám phá đến một độ sâu nhất định và vị trí được đánh giá tại đoạn kết thúc lá Lá của cây.

Sau đó, chúng tôi trả lại giá trị nhỏ nhất hoặc lớn nhất của con cho nút cha, tùy thuộc vào việc nó LÊN một màu trắng hay đen để di chuyển. (Đó là, chúng tôi cố gắng giảm thiểu hoặc tối đa hóa kết quả ở mỗi cấp độ.)

Một hình ảnh của thuật toán minimax ở vị trí nhân tạo. Di chuyển tốt nhất cho màu trắng là b2-c3, bởi vì chúng tôi có thể đảm bảo rằng chúng tôi có thể đến một vị trí mà đánh giá là -50

Với minimax tại chỗ, thuật toán của chúng tôi bắt đầu hiểu một số chiến thuật cơ bản của cờ vua:

Minimax với độ sâu cấp 2. Có thể phát trên: https://jsfiddle.net/k96eoq0q/1/

Hiệu quả của thuật toán minimax dựa nhiều vào độ sâu tìm kiếm mà chúng ta có thể đạt được. Đây là điều chúng tôi sẽ cải thiện trong bước sau.

Bước 4: Cắt tỉa Alpha-beta

Cắt tỉa Alpha-beta là một phương pháp tối ưu hóa cho thuật toán minimax cho phép chúng ta bỏ qua một số nhánh trong cây tìm kiếm. Điều này giúp chúng tôi đánh giá cây tìm kiếm minimax sâu hơn nhiều, trong khi sử dụng cùng một tài nguyên.

Việc cắt tỉa alpha-beta dựa trên tình huống chúng ta có thể ngừng đánh giá một phần của cây tìm kiếm nếu chúng ta tìm thấy một động thái dẫn đến tình huống tồi tệ hơn một động thái được phát hiện trước đó.

Việc cắt tỉa alpha-beta không ảnh hưởng đến kết quả của thuật toán minimax - nó chỉ làm cho nó nhanh hơn.

Thuật toán alpha-beta cũng hiệu quả hơn nếu chúng ta tình cờ truy cập những đường dẫn đầu tiên dẫn đến những bước đi tốt.

Các vị trí chúng ta không cần khám phá nếu cắt tỉa alpha-beta được sử dụng và cây được truy cập theo thứ tự được mô tả.

Với alpha-beta, chúng tôi có được sự gia tăng đáng kể cho thuật toán minimax, như được hiển thị trong ví dụ sau:

Số lượng vị trí được yêu cầu để đánh giá nếu chúng tôi muốn thực hiện tìm kiếm với độ sâu là 4 và vị trí gốc Root là vị trí được hiển thị.

Theo liên kết này để thử phiên bản cải tiến alpha-beta của cờ vua AI.

Bước 5: Cải thiện chức năng đánh giá

Hàm đánh giá ban đầu khá ngây thơ vì chúng tôi chỉ đếm các tài liệu được tìm thấy trên bảng. Để cải thiện điều này, chúng tôi thêm vào đánh giá một yếu tố có tính đến vị trí của các mảnh. Ví dụ, một hiệp sĩ ở trung tâm của bảng là tốt hơn (vì nó có nhiều lựa chọn hơn và do đó hoạt động nhiều hơn) so với một hiệp sĩ ở cạnh của bảng.

Chúng tôi sẽ sử dụng một phiên bản điều chỉnh một chút của các bảng vuông được mô tả ban đầu trong wiki lập trình cờ vua.

Các bảng vuông mảnh được trực quan hóa trực quan. Chúng tôi có thể giảm hoặc tăng đánh giá, tùy thuộc vào vị trí của mảnh.

Với sự cải tiến sau đây, chúng tôi bắt đầu có được một thuật toán chơi một số cờ vua phong nha, ít nhất là từ quan điểm của một người chơi bình thường:

Cải thiện đánh giá và cắt tỉa alpha-beta với độ sâu tìm kiếm là 3. Có thể phát trên https://jsfiddle.net/q76uzxwe/1/

Kết luận

Điểm mạnh của ngay cả một thuật toán chơi cờ đơn giản là nó không phạm phải những sai lầm ngu ngốc. Điều này nói rằng, nó vẫn thiếu hiểu biết chiến lược.

Với các phương pháp tôi đã giới thiệu ở đây, chúng tôi đã có thể lập trình một thuật toán chơi cờ có thể chơi cờ cơ bản. Các phần mềm AI AI (phần loại trừ di chuyển) của thuật toán cuối cùng chỉ là 200 dòng mã, có nghĩa là các khái niệm cơ bản khá đơn giản để thực hiện. Bạn có thể kiểm tra phiên bản cuối cùng có trên GitHub.

Một số cải tiến hơn nữa mà chúng ta có thể thực hiện đối với thuật toán sẽ là ví dụ:

  • đặt hàng di chuyển
  • thế hệ di chuyển nhanh hơn
  • và đánh giá cụ thể cuối trò chơi.

Nếu bạn muốn tìm hiểu thêm, hãy xem wiki lập trình cờ vua. Nó là một nguồn tài nguyên hữu ích để khám phá ngoài những khái niệm cơ bản mà tôi đã giới thiệu ở đây.

Cảm ơn vì đã đọc!