Do động cơ cờ vua lưu trữ tất cả các vị trí được phân tích trước đó giữa các lần di chuyển


17

Tôi đang bắt đầu chơi với động cơ cờ vua. Tôi nhận thấy rằng các động cơ cờ vua tốt nhất có thể mất vài phút để di chuyển. Tôi đang tự hỏi tại sao. Trước mỗi lần di chuyển, động cơ sẽ kiểm tra tất cả các bước di chuyển hợp pháp trong tương lai. Tuy nhiên sau đó nó dường như lặp lại bài tập này cho bước tiếp theo. Cho rằng di chuyển trước đó đã được bao gồm trong cây di chuyển được kiểm tra, điều này có phải là không hiệu quả? Hay tôi đã hiểu lầm?

[Chỉnh sửa: Tôi giả sử rằng lý do tại sao phân tích di chuyển không được lưu trong bộ nhớ cache là do một số hạn chế về bộ nhớ của máy tính khiến cho việc khởi động lại phân tích nhanh hơn]

Câu trả lời:


20

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 = 400vị 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

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 .


Rất thú vị, điều này giải thích tại sao RAM của tôi gần như sụp đổ khi tôi phân tích sâu với động cơ của mình (một bí ẩn đã làm tôi bối rối trong một thời gian bây giờ).
Pablo S. Ocal

Cảm tạ! Rất thú vị. Tôi tìm thấy các thảo luận wiki động cơ cờ hấp dẫn.
Dom

3

Một công cụ cờ thông thường sẽ lưu trữ một số vị trí và điểm số alpha-beta được đặt trong một bảng chuyển vị có thể được tư vấn trong các lần tìm kiếm tiếp theo. Bảng này không được tham khảo trực tiếp để chọn nước đi tiếp theo, nhưng nó làm cho việc tìm kiếm di chuyển đó hiệu quả hơn theo hai cách.

  1. Một vị trí có thể sẽ gặp nhiều lần trong một cây tìm kiếm, được đạt tới bởi một chuyển vị hoặc hoán vị của một chuỗi các bước di chuyển. Bởi vì bảng có thể được tham khảo, một vị trí như vậy có thể chỉ cần được đánh giá vài lần (đối với độ sâu tìm kiếm cố định khác nhau) thay vì hàng chục lần khi vị trí được truy cập và xem xét lại.

  2. Một kỹ thuật tiêu chuẩn cho các tìm kiếm alpha-beta là sử dụng độ sâu lặp lại , liên tục thăm dò cây ở độ sâu tìm kiếm lớn hơn cho đến khi đạt được độ sâu cuối. Điểm định giá được tính toán trong các lần lặp trước được sử dụng để sắp xếp các bước di chuyển được tìm kiếm trong các lần lặp lại sau. Alpha-beta được biết là hoạt động tốt hơn (tức là tỉa thêm cây tìm kiếm) nếu di chuyển tốt được tìm kiếm trước khi di chuyển xấu.


3

Ví dụ chứng minh bộ nhớ của động cơ:

Hãy xem xét các vị trí nơi phát hiện ra những lý thuyết sâu sắc về lý thuyết, đặc biệt là trò chơi Caruana vs Topalov đã chơi trong năm nay. Khi bạn để động cơ phân tích vị trí sau khi di chuyển 12 trong một khoảng thời gian ngắn hơn hoặc ít hơn (giả sử là 10 - 15 phút), bạn có thể kiểm tra các chuyển động được đề xuất và thấy rằng TN ( 13.Re2!) không xuất hiện giữa chúng. Tự giới thiệu di chuyển, quay lại di chuyển và để động cơ phân tích lại cùng một vị trí trong ít nhiều cùng một lúc. Đáng ngạc nhiên, sau một số suy nghĩ, bây giờ động cơ đã xem xét TN trong số các động thái tốt nhất và phê duyệt nó.

EDIT: Câu trả lời ban đầu (được giữ bên dưới) là sai, tuy nhiên, nó cung cấp một ví dụ hữu ích về bộ nhớ của động cơ, đã được trích dẫn ở trên cùng.

Theo như tôi biết, họ không, nghĩa là họ bắt đầu tìm kiếm cây gần như từ đầu mỗi khi di chuyển.

Tuy nhiên, chúng phải có một số loại chức năng hiện thực hóa các giá trị cho mỗi lần di chuyển và chức năng này chắc chắn có một số bộ nhớ ngắn hạn. Một số ví dụ là những vị trí mà những điều mới lạ về lý thuyết được phát hiện, đặc biệt là trò chơi Caruana vs Topalov đã chơi trong năm nay. Khi bạn để động cơ phân tích vị trí sau khi di chuyển 12 trong một khoảng thời gian ngắn hơn hoặc ít hơn (giả sử 10 - 15 phút), bạn có thể kiểm tra các chuyển động được đề xuất và thấy rằng TN ( 13.Re2!) không xuất hiện trong số chúng. Tự giới thiệu di chuyển, quay lại di chuyển và để động cơ phân tích lại cùng một vị trí trong ít nhiều cùng một lúc. Đáng ngạc nhiên, sau một số suy nghĩ, bây giờ động cơ xem xét TN trong số các động thái tốt nhất và phê duyệt nó.

Tôi không phải là chuyên gia về phần mềm cờ vua, nhưng điều này xảy ra. Điều này có thể được giải thích ít nhất một phần nếu (như đã nói) chức năng đánh giá các bước di chuyển cho vị trí có một số bộ nhớ.


2
Không. Động cơ không bắt đầu tìm kiếm cây từ đầu. Tham khảo câu trả lời của tôi.
SmallChess

Xin lỗi nhưng tôi thấy câu trả lời của bạn hơi sai lệch
BlueTrin

1
Tôi đã cố gắng để làm cho nó rõ ràng hơn. Như đã nói, câu trả lời là sai, tuy nhiên ví dụ này là một điều rất hay để kiểm tra (đối với chúng ta là người lãng mạn, nó cho chúng ta một số hy vọng rằng mặc dù máy tính mạnh hơn con người, đôi khi trực giác, kinh nghiệm và làm việc chăm chỉ có thể "vượt qua" nguyên).
Pablo S. Ocal

@pablo, ví dụ của bạn là tốt. Có bộ nhớ vì lần đầu tiên bạn chạy tìm kiếm, công cụ sẽ lưu các đánh giá vị trí trong một bảng. Khi bạn tìm kiếm cùng một vị trí một lần nữa, động cơ sẽ có thể tìm kiếm nhanh hơn nhiều. Do đó, nó sẽ cho bạn một kết quả khác.
SmallChess

Lần chỉnh sửa cuối cùng là dành cho @BlueTrin, người cho rằng nó sai lệch.
Pablo S. Ocal

2

Henry Keiter đã cho bạn một câu trả lời chung chung, tôi sẽ cho bạn một câu trả lời kỹ thuật hơn. Đó là tất cả về bảng chuyển vị, độ sâu tìm kiếm và điểm cắt. Cuộc thảo luận ở đây RẤT NHIỀU kỹ thuật hơn các câu trả lời khác, nhưng nó sẽ có ích cho bất cứ ai muốn học lập trình cờ vua.

Đó là một sự hiểu lầm phổ biến rằng nếu một vị trí được đánh giá trước đó, điểm đánh giá có thể được sử dụng lại miễn là có đủ bộ nhớ để lưu trữ các di chuyển. Lập trình cờ vua phức tạp hơn thế. Ngay cả khi có bộ nhớ vô hạn, bạn vẫn phải tìm kiếm các vị trí một lần nữa. Đối với mỗi di chuyển, một điểm đánh giá được gắn với độ sâu và ràng buộc của nó. Chẳng hạn, nếu động cơ lưu trữ di chuyển ở mức không cao, mục nhập bảng sẽ có giới hạn thấp hơn. Điều này có nghĩa, nếu bạn đang tìm kiếm một vị trí, bạn vẫn phải kiểm tra giới hạn xem bạn có thể sử dụng điểm đánh giá trước đó hay không.

Ngoài ra, mỗi đánh giá có một chiều sâu gắn liền với nó. Trong khuôn khổ lặp lại sâu, khi bạn tăng độ sâu cho mỗi lần lặp, bạn vẫn phải tìm kiếm các vị trí mà bạn đã tìm kiếm trong lần lặp trước.

Câu trả lời ngắn cho câu hỏi của bạn là một công cụ lưu trữ tất cả các vị trí được phân tích trước đó (miễn là đủ bộ nhớ), nhưng những kết quả được lưu trữ đó không thể được sử dụng lại dễ dàng như bạn nghĩ . Trong giai đoạn mở đầu, nơi có ít sự lặp lại, những kết quả được lưu trữ này hữu ích nhất cho việc đặt hàng di chuyển và hàng tá các heuristic giảm di chuyển. Ví dụ: người ta sẽ cho rằng nước đi tốt nhất từ ​​độ sâu cuối cùng là nước đi tốt nhất ở độ sâu hiện tại, vì vậy chúng tôi sẽ sắp xếp danh sách di chuyển và tìm kiếm nước đi tốt nhất trước bất kỳ động thái nào khác. Hy vọng rằng, chúng tôi sẽ nhận được một điểm cắt sớm thất bại cao.

Chúng tôi không có bộ nhớ vô hạn để lưu trữ các vị trí. Chúng ta cần xác định thuật toán băm. Thuật toán băm Zobrist cung cấp cho chúng ta phân phối giả ngẫu nhiên, nhưng sớm hay muộn chúng ta vẫn phải thay thế một số mục hiện có.


0

Mỗi động cơ có chương trình quản lý thời gian riêng. Một số công cụ và GUI cho phép bạn đặt tốc độ mà động cơ sẽ phát. Công cụ luôn tính toán / đánh giá / minimax nhiều nhất có thể do các ràng buộc áp đặt bởi các chương trình con quản lý thời gian hoặc cài đặt người dùng. Nếu một động cơ suy nghĩ trong một thời gian dài, có khả năng vì điều khiển thời gian cho trò chơi là chậm, hoặc người dùng đã đặt nó để chơi chậm.

Vị trí và đánh giá mà động cơ đã tính được lưu trữ trong bảng băm. Người dùng có thể đặt kích thước của hàm băm có sẵn trong cài đặt của hầu hết các công cụ UCI. Bản thân động cơ sử dụng một lượng RAM nhất định và nếu bạn đặt kích thước bảng băm quá cao, máy tính sẽ bắt đầu lưu trữ hàm băm trên ổ cứng của bạn dưới dạng RAM ảo. Bộ nhớ ổ cứng được truy cập chậm hơn RAM và bạn thường có thể nghe thấy ổ cứng đang quay đi. Rất nhiều người dùng đặt kích thước bảng băm sao cho phù hợp với RAM có sẵn.

Một tỷ lệ lớn của bất kỳ bảng băm nào cũng trở nên vô dụng sau khi động cơ và đối thủ của nó đã thực hiện các động tác của họ khi các vị trí khác được xem xét không còn phù hợp. Công cụ sẽ sử dụng lại các đánh giá được lưu trữ trong hàm băm, nhưng một số đánh giá chứng minh không chính xác do hiệu ứng đường chân trời một khi động cơ đi sâu xuống cùng dòng, do đó, nó thường phải sắp xếp lại các ứng cử viên di chuyển.

Vì số lượng băm là hữu hạn, một công cụ cũng phải đưa ra quyết định về việc xóa thông tin nào khỏi hàm băm của nó khi thêm thông tin mới. Công cụ không biết trước những động tác nào sẽ được phát, do đó, nó có thể vô tình xóa thông tin sẽ hữu ích khi thêm dữ liệu mới.

Động cơ nói chung không kiểm tra tất cả các động thái pháp lý đến một độ sâu nhất định. Họ loại bỏ một số nhánh của cây khỏi sự cân nhắc dựa trên việc cắt tỉa tiến và lùi. Ngoài ra, nếu vị trí nút lá chưa chụp hoặc kiểm tra chưa được thực hiện, động cơ sẽ tiếp tục xuống dòng đó cho đến khi đạt đến vị trí yên tĩnh (không hoạt động). Cây thực tế có lẽ khá sâu ở một số nơi, trong khi các dòng khác có thể đã bị cắt sau một số ít di chuyển.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.