Có tồn tại một thuật toán như vậy không, nếu có sức mạnh xử lý vô hạn, một máy tính có thể chơi cờ hoàn hảo để nó không bao giờ thua?
Nếu vậy, tôi có thể tìm mã giả cho nó ở đâu?
Có tồn tại một thuật toán như vậy không, nếu có sức mạnh xử lý vô hạn, một máy tính có thể chơi cờ hoàn hảo để nó không bao giờ thua?
Nếu vậy, tôi có thể tìm mã giả cho nó ở đâu?
Câu trả lời:
Liệu một thuật toán tồn tại? Vâng. Theo Định lý của Zermelo , có ba khả năng cho một trò chơi hai người chơi thông tin hoàn hảo xác định hữu hạn như cờ vua: hoặc người chơi thứ nhất có chiến lược chiến thắng hoặc người chơi thứ hai có chiến lược chiến thắng hoặc người chơi có thể rút thăm. Chúng tôi không (chưa) biết nó dành cho cờ vua. (Mặt khác, cờ đam đã được giải quyết : một trong hai người chơi có thể buộc một trận hòa.)
Về mặt khái niệm, thuật toán khá đơn giản: xây dựng một cây trò chơi hoàn chỉnh , phân tích các nút lá (vị trí kết thúc trò chơi) và thực hiện chiến thắng ban đầu, từ chức hoặc đưa ra một trận hòa.
Vấn đề nằm ở chi tiết: có khoảng 10 43 vị trí có thể, và số lần di chuyển thậm chí còn lớn hơn (hầu hết các vị trí có thể đạt được theo nhiều cách). Bạn thực sự cần máy tính mạnh mẽ vô hạn của mình để tận dụng lợi thế này, vì một máy tính có thể tận dụng thuật toán này không thể phù hợp với vũ trụ đã biết hoặc sẽ không hoàn thành tính toán cho đến khi nào đó sau khi vũ trụ kết thúc.
Xem https://en.wikipedia.org/wiki/Endgame_tablebase .
Với sức mạnh máy tính vô hạn, người ta có thể xây dựng một bàn như vậy cho vị trí bắt đầu và giải cờ vua .
Trong thực tế, chỉ có các vị trí có tối đa bảy "người đàn ông" (cầm đồ và quân cờ, đếm các vị vua) đã được giải quyết bằng cách sử dụng siêu máy tính hiện tại, vì vậy chúng tôi rất xa cách giải cờ vua. Độ phức tạp của vấn đề tăng theo cấp số nhân với số lượng mảnh.
Nếu bạn thực sự có sức mạnh xử lý vô hạn , một thuật toán như vậy sẽ thực sự không đáng để viết. Vì cờ vua có số lượng hữu hạn các trạng thái có thể, về lý thuyết bạn chỉ có thể lặp qua tất cả chúng cho đến khi bạn tìm thấy một lối chơi hoàn hảo. Nó sẽ không hiệu quả khủng khiếp, nhưng nếu bạn có sức mạnh xử lý vô hạn , nó sẽ không thành vấn đề.
Để trực tiếp giải quyết câu hỏi: có, có một thuật toán như vậy. Nó được gọi là minimax. (Các bảng cuối trò chơi được tạo bằng cách sử dụng thuật toán này (ngược lại!), Nhưng thuật toán minimax đơn giản cũ là tất cả những gì bạn cần). Thuật toán này có thể chơi bất kỳ trò chơi tổng hai người chơi nào một cách hoàn hảo. Tìm mã giả ở đây:
https://en.wikipedia.org/wiki/Minimax
lưu ý rằng các biến thể của thuật toán này được sử dụng bởi các chương trình cờ vua máy tính hiện đại.
Không chỉ có một thuật toán để chơi cờ hoàn hảo, có thể viết một chương trình ngắn sẽ (cung cấp tài nguyên vô hạn) chơi bất kỳ trò chơi hai người có thời gian hữu hạn hoàn hảo về kiến thức hoàn hảo.
Công cụ trò chơi thậm chí không cần biết luật chơi của trò chơi. Tất cả những gì nó cần là một đại diện mờ đục của "trạng thái trò chơi" và các chức năng (a) được cung cấp cho bất kỳ trạng thái trò chơi nào, cung cấp danh sách các trạng thái trò chơi tiếp theo hợp pháp và (b) đưa ra trạng thái trò chơi, quyết định xem đó có phải là chiến thắng cho người chơi 1 không , một chiến thắng cho người chơi 2, một trận hòa, hoặc nó không phải là trạng thái kết thúc.
Với các chức năng đó, một thuật toán đệ quy đơn giản "giải quyết" trò chơi.
Thực tế này đã được ám chỉ trong các câu trả lời trước bởi cờ vua lập trình (minimax) và bởi Acccumulation (người cung cấp một phiên bản của chương trình bằng python).
Tôi đã viết một chương trình như vậy hơn 20 năm trước. Tôi đã thử nó bằng cách chơi noughts-and-cross (tic-tac-toe nếu bạn là người Mỹ). Chắc chắn nó đã chơi một trò chơi hoàn hảo.
Tất nhiên điều này sẽ giảm nhanh chóng trên bất kỳ máy tính có thể tưởng tượng cho bất kỳ trò chơi nghiêm trọng nào. Bởi vì nó là đệ quy, nó đang xây dựng toàn bộ cây trò chơi một cách hiệu quả, do đó bạn sẽ nhận được một "tràn ngăn xếp" (chơi chữ rất nhiều dự định) trước khi bạn có thể phân tích 10 ^ 123 trạng thái cờ được đề cập trong các câu trả lời khác. Nhưng thật vui khi biết rằng về nguyên tắc chương trình nhỏ này sẽ thực hiện công việc.
Đối với tôi điều này cũng nói lên một điều thú vị về AI: tuy nhiên nhiều "trí thông minh" mà bạn nghĩ được thể hiện bởi Deep Blue, hoặc Go Zero, hoặc thực sự bởi một người chơi Cờ vua hoặc cờ vây, có một ý nghĩa trong đó những trò chơi này có tầm quan trọng chính xác, có thể tính toán được các giải pháp. Thách thức là làm thế nào để có được một giải pháp tốt mặc dù không tối ưu trong thời gian hợp lý.
Tôi sẽ bỏ qua các khả năng rút thăm hoặc các chuỗi di chuyển vô hạn để đơn giản. Một khi thuật toán được hiểu, không khó để mở rộng nó cho các trường hợp đó.
Đầu tiên, một số định nghĩa:
Bất kỳ động thái nào thắng trò chơi cho người chơi thực hiện di chuyển đó là một nước cờ chiến thắng.
Bất kỳ di chuyển nào làm mất trò chơi cho người chơi thực hiện di chuyển đó là một động thái thua.
Bất kỳ động thái nào khiến người chơi khác có ít nhất một nước cờ chiến thắng cũng là một nước đi thua. (Vì đối thủ có thể thực hiện động tác đó và buộc thua.)
Bất kỳ động thái nào khiến người chơi khác chỉ mất di chuyển cũng là một nước cờ chiến thắng. (Không có vấn đề gì đối thủ của bạn làm, bạn sẽ giành chiến thắng.)
Một chiến lược hoàn hảo có nghĩa là luôn luôn thực hiện các động thái chiến thắng nếu có còn lại và từ chức khi một người chỉ còn lại các bước di chuyển.
Bây giờ, thật tầm thường khi viết một chiến lược hoàn hảo. Đơn giản chỉ cần nổ tất cả các chuỗi di chuyển có thể và xác định các động thái thắng / thua. Bỏ qua bế tắc, điều này cuối cùng sẽ xác định mọi di chuyển là một động thái chiến thắng hoặc một động thái thua cuộc.
Bây giờ, chiến lược là tầm thường. Nhìn vào tất cả các động thái có thể của bạn. Nếu bất kỳ động thái chiến thắng vẫn còn, lấy một và giành chiến thắng. Nếu chỉ mất di chuyển, hãy từ chức, vì đối thủ của bạn có thể buộc bạn thua.
Không khó để điều chỉnh chiến lược để bao gồm khả năng bế tắc.
Cập nhật : Chỉ trong trường hợp không rõ cách thức này xác định mọi di chuyển là thắng nhiều hơn hoặc di chuyển thua, hãy xem xét:
n
số lần di chuyển trong trò chơi cờ vua dài nhất có thể. (Hiện tại chúng tôi đang bỏ qua các chuỗi không giới hạn, mặc dù bao gồm chúng không khó.)n
động thái trước chúng ta cần xem xét.n-1
trước là một nước đi thắng hoặc một nước đi thua vì các nước n
đi kết thúc trò chơi dài nhất.n-2
được theo sau chỉ bằng các động thái thắng hoặc thua di chuyển và do đó, bản thân nó là một nước đi chiến thắng hoặc di chuyển thua.1. d4
với ...resigns
?
Giả sử bạn có ba chức năng: win_state
, get_player
, và next_states
. Đầu vào cho win_state
là trạng thái trò chơi và đầu ra là -1 nếu màu trắng nằm trong checkmate, 0 nếu đó là hòa, 1 nếu màu đen nằm trong checkmate và mặt None
khác. Đầu vào cho get_player
là trạng thái trò chơi và đầu ra là -1 nếu đến lượt đen và 1 nếu đến lượt trắng. Đầu vào cho next_states
là một danh sách các trạng thái trò chơi tiếp theo có thể xảy ra do di chuyển hợp pháp. Sau đó, chức năng sau đây, khi được cung cấp trạng thái trò chơi và người chơi, sẽ cho bạn biết trạng thái trò chơi nào sẽ chuyển sang để người chơi đó giành chiến thắng.
def best_state(game_state,player)
def best_result(game_state):
if win_state(game_state):
return(win_state)
else:
player = get_player(game_state)
return max([best_result(move)*player for move in next_states(game_state)])*player
cur_best_move = next_states(games_state)[0]
cur_best_outcome = -1
for state in next_states(game_state):
if best_result(state)*player > cur_best_outcome:
cur_best_outcome = best_result(state)*player
cur_best_move = state
return(best_move)
Vâng. Dễ thôi. Bạn thậm chí không cần sức mạnh xử lý vô hạn. Tất cả những gì bạn cần là một bảng tra cứu có chứa, cho mỗi vị trí bảng có thể, di chuyển tốt nhất để chơi ở vị trí đó. Đây là mã giả:
def play-move(my-color, board-position):
return table-of-best-moves[my-color, board-position]
Điều hấp dẫn duy nhất là cái bàn tra cứu này sẽ phải rất, rất lớn, có lẽ lớn hơn cả thiên hà Milky Way và phải mất một thời gian dài để xây dựng nó có lẽ dài hơn cả thời đại hiện tại của vũ trụ, trừ khi có một số sự đều đặn chưa được khám phá trong cờ vua làm cho nó đơn giản hơn nhiều so với chúng ta có thể thấy ngay bây giờ. Nhưng nếu bạn có bảng tra cứu này, chương trình con để chọn một nước đi hoàn hảo mỗi lần có thể được thực hiện chỉ bằng một lệnh CPU.
Ngoài ra, với kiến thức hiện tại về cờ vua, không có cách nào để chắc chắn rằng lối chơi hoàn hảo đảm bảo bạn sẽ không thua. Ví dụ: nếu chơi hoàn hảo đảm bảo chiến thắng cho Trắng, thì Đen sẽ thua ngay cả khi Đen chơi hoàn hảo.