Lập trình công cụ cờ vua là lãnh thổ rất phức tạp, vì vậy ngay trước mắt tôi sẽ chỉ cho bạn đến Wiki Lập trình Cờ vua , nơi có rất nhiều thông tin tuyệt vời về chủ đề này.
Lý lịch
Tính toán cờ vua (và nhiều thứ tương tự) thường được mô hình hóa và được coi là "cây trò chơi" hoặc " cây quyết định ". Nhìn rộng ra, cây này là một biểu đồ có hướng, với một nút ở trên cùng (vị trí hiện tại), dẫn đến một nút cho mỗi lần di chuyển có thể, mỗi nút dẫn đến nhiều nút hơn cho mỗi lần di chuyển tiếp theo , v.v.
Ở dạng đơn giản nhất, mạnh mẽ nhất, các động cơ Cờ vua tạo ra tất cả các vị trí trên cây này xuống một số giới hạn độ sâu ("ply"), đánh giá từng vị trí kết quả dựa trên một số tiêu chí phức tạp 1 . Sau đó, nó chơi di chuyển dường như dẫn đến kết quả tốt nhất. Ngày nay, rất nhiều kỹ thuật thực sự phức tạp đã được phát triển để hạn chế số lượng vị trí mà động cơ phải xem xét, nhưng tôi sẽ bỏ qua những mục đích cho câu trả lời này, vì chúng không thay đổi vấn đề thực sự tại tay.
Toán tiếp tuyến
Lý do cơ bản mà các động cơ thường mất khoảng thời gian như nhau để xem xét mỗi lần di chuyển là kích thước của cây quyết định tăng theo cấp số nhân theo độ sâu ( k
).
Hãy xem xét vị trí bắt đầu. Đỉnh của cây ( k=0
) là một nút. Có hai mươi bước di chuyển đầu tiên có thể cho Trắng, vì vậy có hai mươi nút ở độ sâu k=1
. Sau đó, Đen cũng có hai mươi bước di chuyển có sẵn cho mỗi tùy chọn của Trắng: vì vậy k=2
, có những 20 * 20 = 400
vị trí có thể! Và nó chỉ trở nên tồi tệ hơn khi người chơi phát triển tác phẩm của mình!
Ví dụ: giả sử luôn có hai mươi động tác có thể có cho mỗi người chơi tại bất kỳ thời điểm 2 nào . Bạn hướng dẫn máy tính nhìn về phía trước năm động tác cho mỗi người chơi (mười ply). Chúng ta hãy xem kích thước của cây vũ phu ở mỗi cấp độ. Để giải trí, chúng tôi cũng sẽ xem xét tổng số vị trí trong cây (từ đỉnh đến cấp nhất định).
Ply | Positions | Total Tree Size
----------------------------------------
0 | 1 | 1
1 | 20 | 21
2 | 400 | 421
3 | 8000 | 8421
4 | 160000 | 168421
5 | 3200000 | 3368421
6 | 64000000 | 67368421
7 | 1280000000 | 1347368421
8 | 25600000000 | 26947368421
9 | 512000000000 | 538947368421
10 | 10240000000000 | 10778947368421
Kết quả của mỗi cấp độ lớn hơn theo cấp số nhân so với cấp độ trước đó là kích thước của toàn bộ cây bị chi phối bởi cấp độ dưới cùng . Hãy xem xét ví dụ trên: chỉ riêng mức cuối cùng chứa mười nghìn tỷ nút. Toàn bộ phần còn lại của cây chỉ chứa năm trăm tỷ. Lớp thứ mười chứa khoảng 95% các nút trong toàn bộ cây (điều này thực sự đúng ở mỗi cấp độ). Trong thực tế, điều này có nghĩa là tất cả thời gian tìm kiếm được dành để đánh giá động thái "cuối cùng".
Câu trả lời
Vì vậy, làm thế nào điều này liên quan đến câu hỏi của bạn? Chà, giả sử máy tính được đặt thành mười lớp, như trên, và hơn nữa nó "nhớ" kết quả đánh giá của nó. Nó tính toán một di chuyển, chơi nó, và sau đó bạn thực hiện một di chuyển. Bây giờ hai động tác đã được thực hiện, do đó, nó cắt tỉa tất cả các vị trí từ bộ nhớ liên quan đến các di chuyển không xảy ra và còn lại một cây đi xuống tám bước còn lại mà nó đã tính: 26.947.368.421 vị trí!
Được rồi! Vì vậy, chúng ta chỉ cần tính hai lớp cuối cùng! Sử dụng ước tính 20 bước di chuyển ở mỗi độ sâu, tổng số bước chúng ta cần tính toán ở đây vẫn còn hơn mười nghìn tỷ. Các vị trí chúng tôi đã tính toán chỉ chiếm 2,5% khả năng! Vì vậy, ngay cả bằng cách lưu trữ kết quả của lần di chuyển cuối cùng, điều tốt nhất chúng ta có thể hy vọng là tốc độ tăng 2,5%! Thực tế, đây là lý do tại sao ngay cả khi chương trình của bạn lưu trữ các kết quả trước đó, bạn thường không thấy sự tăng tốc đáng kể giữa các lần di chuyển (trừ trường hợp khi máy tính tìm thấy một người bạn đời bị ép buộc hoặc một cái gì đó, tất nhiên!).
Tuyên bố từ chối trách nhiệm
Có rất nhiều điều phức tạp liên quan đến câu hỏi này, đó là lý do tại sao tôi liên kết với wiki lập trình ở đầu trang và chỉ cố gắng giải thích câu trả lời bằng thuật ngữ toán học rộng. Trên thực tế, các chương trình làm thường phần bộ nhớ cache của cây từ di chuyển để di chuyển, và có những lý do khác tại sao điều đó là không đủ ngày của riêng mình - một số lý do đơn giản (ví dụ như một dòng nhất định có thể nhìn ra tốt đến tám di chuyển, nhưng kết thúc với một trở lại -rank mate trên di chuyển chín!) và nhiều người rất phức tạp (thường liên quan đến các phương pháp cắt tỉa thông minh khác nhau). Vì vậy, máy tính phải tiếp tục nhìn xa hơn trong nỗ lực để tránh đưa ra các giả định xấu dựa trên độ sâu cắt giảm của bước di chuyển trước đó.
1 Tôi sẽ không tham gia vào các chức năng heuristic ở đây, bởi vì đó là khu vực cực kỳ phức tạp của riêng nó, nhưng thường có một số lợi ích có thể đạt được thông qua các sơ đồ lưu trữ vị trí ở đây.
2 Hệ số phân nhánh trung bình là 20 có lẽ quá thấp .