Nếu được trao khả năng xử lý vô hạn, liệu có một thuật toán nào có thể chơi cờ hoàn hảo?


29

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?


8
Bạn có ý nghĩa gì bởi cờ vua hoàn hảo?
Herb Wolfe

5
@HerbWolfe Tôi cho rằng anh ta có nghĩa là nó không bao giờ thực hiện một động thái nào cho phép đối thủ của mình buộc phải thua và từ chức nếu, và chỉ khi, mọi động thái có thể cho phép đối thủ của mình buộc phải thua.
David Schwartz

5
@DavidSchwartz - "cờ hoàn hảo", tất nhiên, không thể được định nghĩa. Không thể "sức mạnh xử lý vô hạn". Điều này có nghĩa là "thực hiện tất cả các chuỗi hướng dẫn trong 0 lần"? "Có vô số bộ xử lý có sẵn"? FWIW - định nghĩa của tôi về "cờ hoàn hảo" là "không bao giờ thua trò chơi".
Bob Jarvis - Phục hồi Monica

24
Vâng, nó được gọi là lực lượng vũ phu. Với khả năng xử lý vô hạn, bạn không cần thực hiện cắt tỉa alpha-beta, mặc dù bạn cũng có thể cần một lượng lưu trữ khá lớn để giữ cây tìm kiếm của mình.
Michael

4
Khái niệm "thuật toán" và khái niệm sức mạnh xử lý vô hạn không thực sự trộn lẫn. Lý thuyết về thuật toán và khả năng tính toán đều dựa trên giả định đạt được kết quả trong một số bước hữu hạn. Nếu bạn cho phép vô số bước, sự khác biệt giữa những gì có thể tính toán được và những gì không biến mất.
Michael Kay

Câu trả lời:


62

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.


13
@Wildcard Không, nó không giả định bất cứ điều gì: nó chỉ chứa tất cả các trò chơi cờ vua hợp pháp và nó sẽ chọn tất cả những trò chơi mà người chơi trong tay không thua.
gents

11
@gents, tôi đã đề cập đến bước "từ chức" của thuật toán. Đó hoàn toàn không phải là một bước cần thiết.
tự đại diện

38
Quy tắc ba lần lặp lại giới hạn không gian tìm kiếm, vì vậy máy tính không cần phải vô cùng mạnh mẽ, chỉ đơn thuần là mạnh mẽ về mặt thiên văn.
Hoa Long Tâm

9
Để tham khảo, hãy so sánh giới hạn dưới của số lượng trò chơi có thể ( 10 ^ 120 ) với số lượng nguyên tử trong vũ trụ quan sát được (theo thứ tự 10 ^ 80 ). Thuật toán đơn giản nhất sẽ phải tìm tất cả các trò chơi đó và lưu trữ dữ liệu của chúng. Lưu trữ một trò chơi trên mỗi nguyên tử sẽ mất gấp 10 ^ 40 lần số nguyên tử mà chúng ta ước tính trong vũ trụ quan sát được.
Kỹ sư Toast

6
Câu trả lời này là tuyệt vời cho đến cuối cùng khi bạn đề cập đến một "máy tính vô cùng mạnh mẽ". Đó không phải là ý bạn, và cụm từ đó không thuộc về câu hỏi cũng như cuộc thảo luận.
Don nở

25

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.


9
Một lưu ý phụ, nếu bạn thực sự tạo ra một bảng như vậy, bất kể bạn lưu trữ thông tin trên cái gì, nó sẽ nặng gấp khoảng 10 ^ 43 lần so với vũ trụ quan sát được; xem xét có ~ 10 ^ 123 vị trí cờ có thể và chỉ ~ 10 ^ 80 baryon trong vũ trụ quan sát được.
Shufflepants

6
@Shufflepants ai nói tôi đang lưu trữ nó bằng baryons?
Michael

3
@Christoph Và giả sử bảo tồn thông tin, và giả sử bạn có máy dò và siêu máy tính của bạn với khả năng xử lý vô hạn, bạn có thể từ từ trong quá trình một thứ gì đó như một năm googolplex đọc ra cơ sở bảng như bức xạ diều hâu.
Shufflepants

3
@Shufflepants Lưu ý rằng một chiến lược chiến thắng thực tế có thể cần ít không gian hơn so với toàn bộ bảng. Chẳng hạn, Nim có một chiến lược chiến thắng rất đơn giản để mô tả, không cần xây dựng một bảng khổng lồ gồm tất cả các trạng thái có thể.
Federico Poloni

1
Giải pháp này như đã nêu là không khả thi. Khối lượng của một bảng như vậy sẽ tạo thành một lỗ đen và không thể lấy hết dữ liệu từ nó.
emory

19

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 đề.


Đo không phải sự thật. Ông nói bạn có sức mạnh xử lý vô hạn, nhưng không nói gì về không gian vô hạn.
ubadub

@ubadub: Chúng tôi sẽ không cần không gian vô hạn. Độ dài của trò chơi bị giới hạn do quy tắc 50 di chuyển và quy tắc có thể được tạo thành để sắp xếp tất cả các di chuyển có thể từ một vị trí. Khi chúng có thể được sắp xếp, chúng có thể được lưu trữ dưới dạng một số nguyên. Đây là tất cả bộ nhớ cần thiết để đi bộ toàn bộ cây. Và nếu bạn có thời gian vô hạn, bạn có thể đi bộ cây bao nhiêu lần tùy ý, vì vậy bạn không phải lưu trữ mọi trò chơi cờ có thể.
vsz

Độ dài của trò chơi bị giới hạn, nhưng nó cực kỳ lớn; như một người khác đã chỉ ra, nếu bạn tạo ra một bảng để lưu trữ tất cả các trò chơi như vậy, "bất kể bạn lưu trữ thông tin trên cái gì, nó sẽ nặng gấp 10 ^ 43 lần so với vũ trụ quan sát được, xem xét có ~ 10 ^ 123 vị trí cờ vua và chỉ ~ 10 ^ 80 baryon trong vũ trụ quan sát được
ubadub

2
@ubadub: Đó là sự thật, nhưng tôi đã không nói về "một bàn để lưu trữ tất cả các trò chơi như vậy". Có nhiều thuật toán liên quan đến cây mà không phải giữ tất cả các nút của toàn bộ cây trong bộ nhớ.
vsz

@ vsz điểm tốt
ubadub

13

Để 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.


4

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ý.


Thuật toán của bạn chỉ hoạt động cho các trò chơi hai người có kiến ​​thức hoàn hảo. Nó sẽ rơi vào các trò chơi thông tin ẩn như Stratego , bởi vì bất kỳ việc thực hiện chức năng (a) nào đều vi phạm các quy tắc trò chơi. Nó cũng thất bại đối với các trò chơi có thời lượng vô hạn: ví dụ: bỏ quy tắc 50 bước khỏi cờ vua và không thể nói rằng hai vị vua đuổi nhau quanh bàn cờ không phải là một trạng thái có thể chiến thắng. Tất cả những gì nó có thể nói là nó không phải là trạng thái kết thúc.
Đánh dấu

Điểm hợp lệ. Tôi sẽ chỉnh sửa câu trả lời của tôi.
gareth

3

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:

  1. 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.

  2. 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.

  3. 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.)

  4. 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.)

  5. 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:

  1. Mỗi động thái dẫn đến một chiến thắng là một động thái chiến thắng.
  2. Mỗi động thái dẫn đến thua lỗ là một nước đi mất.
  3. Mỗi động thái dẫn đến việc đối thủ chỉ có các động thái thắng hoặc thua là một động thái thắng hoặc thua.
  4. Gọi nsố 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ó.)
  5. Không có động thái với các nđộng thái trước chúng ta cần xem xét.
  6. Mọi di chuyển với các nước đi n-1trướ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.
  7. Do đó, mọi di chuyển ở độ sâu 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.
  8. Và như vậy trở lại di chuyển đầu tiên.

1
Định nghĩa của bạn về di chuyển thắng và thua là không đủ toàn diện. Chẳng hạn, nước đi đầu tiên, không thắng trò chơi (số 1), cũng không khiến đối thủ chỉ thua trận (số 4), vì vậy đó không phải là "nước cờ chiến thắng". Nó cũng không thua trò chơi (# 2), cũng không để đối thủ có bất kỳ động thái chiến thắng nào (# 3), vì vậy đó không phải là "thua di chuyển". Chiến lược của bạn yêu cầu mọi di chuyển được xác định là "di chuyển chiến thắng" hoặc "di chuyển thua", điều này đơn giản không phải là trường hợp như bạn đã xác định.
Hạt nhân Wang

2
@NucleWang Nó xác định mọi di chuyển là một nước đi thắng hoặc một nước đi thua. Bạn nghĩ gì thay thế thứ ba là? Hình dung cây của tất cả các trò chơi cờ có thể (và hãy nhớ rằng, hiện tại chúng tôi không bao gồm các mối quan hệ hoặc chuỗi vô hạn). Mỗi chuỗi kết thúc bằng một chiến thắng hoặc thua. Điều này thấm qua cây cuối cùng xác định mọi di chuyển là di chuyển chiến thắng hoặc di chuyển thua.
David Schwartz

13
@NucleWang hoặc nước cờ đầu tiên là nước cờ chiến thắng cho một người chơi, hoặc cờ khác là (như tic-tac-toe) là một trò chơi được vẽ với lối chơi hoàn hảo. Chúng tôi không biết điều đó bởi vì không ai từng có khả năng tính toán để chạy thuật toán này đến khi hoàn thành và không ai tìm thấy bằng chứng trực tiếp hơn.
hobbs 19/12/17

8
Không có sự ngẫu nhiên và không có thông tin ẩn trong cờ vua, điều này không có chỗ cho "có thể". Mọi vị trí đều được thắng, thua hoặc được rút ra (ngay cả khi chúng ta không thể xác định được chúng như vậy). Và lời giải thích này đang bỏ qua tùy chọn "rút ra" vì đơn giản, nhưng chủ yếu là 1) một vị trí được rút ra nếu nó được vẽ theo quy tắc và 2) một vị trí được rút ra nếu nó không có nước cờ chiến thắng, nhưng có ít nhất một động tác khiến đối thủ không có động thái chiến thắng.
hobbs 19/12/17

2
@DavidSchwartz: Trừ khi ai đó ở vị trí thua cuộc, mọi di chuyển không hoàn hảo đều xấu. Ở vị trí thua, nhìn chung sẽ không có một động thái "hoàn hảo" nào [ngoại trừ trong tình huống di chuyển bắt buộc] vì bất kỳ động thái hợp pháp nào cũng có thể có một số khả năng là chiến thắng hoặc di chuyển duy nhất trong một số trường hợp có thể hiểu được (có thể rất cao). Từ chức, tuy nhiên, dường như "động thái" tồi tệ nhất rõ ràng. Giả sử trò chơi được chứng minh là giải quyết chiến thắng cho White với d4. Bạn có muốn chơi một chương trình cờ vua đáp ứng 1. d4với ...resigns?
supercat

2

Giả sử bạn có ba chức năng: win_state, get_player, và next_states. Đầu vào cho win_statelà 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 Nonekhác. Đầu vào cho get_playerlà 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_stateslà 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)

0

Sử dụng bảng tra cứu

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]

Cuộc đuổi bắt

Đ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.

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.