Jika diberi kekuatan pemrosesan yang tak terbatas, apakah ada algoritma yang bisa bermain catur dengan sempurna?


29

Apakah ada algoritma seperti itu di mana, jika diberi kekuatan pemrosesan yang tak terbatas, komputer dapat bermain catur dengan sempurna sehingga tidak akan pernah kalah?

Jika demikian, di mana saya dapat menemukan kode semu untuknya?


8
Apa yang Anda maksud dengan catur sempurna?
Herb Wolfe

5
@HerbWolfe Saya berasumsi dia berarti bahwa itu tidak pernah membuat langkah yang memungkinkan lawannya untuk memaksanya kalah dan mengundurkan diri jika, dan hanya jika, setiap gerakan yang memungkinkan memungkinkan lawannya untuk memaksanya kalah.
David Schwartz

5
@DavidSchwartz - "catur sempurna", tentu saja, tidak dapat didefinisikan. Tidak dapat "kekuatan pemrosesan yang tak terbatas". Apakah ini berarti "mengeksekusi semua urutan instruksi dalam 0 waktu"? "Apakah tersedia prosesor dalam jumlah tak terbatas"? FWIW - definisi saya tentang "catur sempurna" adalah "tidak pernah kehilangan permainan".
Bob Jarvis - Reinstate Monica

24
Ya, itu disebut brute force. Dengan kekuatan pemrosesan yang tak terbatas Anda tidak perlu melakukan pemangkasan alpha-beta, meskipun Anda mungkin juga membutuhkan jumlah penyimpanan yang agak besar untuk menahan pohon pencarian Anda.
Michael

4
Konsep "algoritma" dan konsep daya pemrosesan tak terbatas tidak benar-benar bercampur. Teori algoritma dan komputabilitas semuanya didasarkan pada asumsi untuk mencapai hasil dalam sejumlah langkah terbatas. Jika Anda diizinkan jumlah langkah yang tak terbatas, perbedaan antara apa yang dapat dihitung dan apa yang tidak hilang.
Michael Kay

Jawaban:


62

Apakah ada algoritma? Iya nih. Menurut Teorema Zermelo , ada tiga kemungkinan untuk permainan dua pemain dengan informasi lengkap deterministik sempurna terbatas seperti catur: apakah pemain pertama memiliki strategi kemenangan, atau pemain kedua memiliki strategi kemenangan, atau salah satu pemain dapat memaksakan hasil seri. Kami belum (belum) tahu untuk catur mana. (Sebaliknya, Dam, telah diselesaikan : salah satu pemain dapat memaksakan hasil seri.)

Secara konseptual, algoritma ini cukup sederhana: membangun pohon permainan yang lengkap , menganalisis node daun (posisi akhir permainan), dan membuat gerakan awal yang menang, mengundurkan diri, atau menawarkan undian.

Masalahnya terletak pada perinciannya: ada sekitar 10 43 posisi yang mungkin, dan jumlah gerakan yang bahkan lebih besar (sebagian besar posisi dapat dicapai dalam lebih dari satu arah). Anda benar-benar membutuhkan komputer Anda yang sangat kuat untuk mengambil keuntungan dari ini, karena komputer yang dapat memanfaatkan algoritma ini tidak dapat masuk ke dalam alam semesta yang diketahui, atau tidak akan menyelesaikan perhitungan sampai beberapa saat setelah alam semesta berakhir.


13
@Wildcard Tidak, itu tidak menganggap apa-apa: itu hanya berisi semua kemungkinan permainan catur legal dan itu akan memilih semua yang mana pemain yang ada di tangan tidak kalah.
gented

11
@gented, saya merujuk pada langkah "mundur" dari algoritma. Itu sama sekali bukan langkah yang perlu.
Wildcard

38
Aturan tiga-pengulangan membatasi ruang pencarian, sehingga komputer tidak harus sangat kuat, hanya sangat kuat secara astronomis.
Hoa Long Tam

9
Untuk referensi, bandingkan batas bawah untuk jumlah permainan yang mungkin ( 10 ^ 120 ) dengan jumlah atom di alam semesta yang dapat diamati (pada urutan 10 ^ 80 ). Algoritma paling sederhana harus menemukan semua game itu dan menyimpan datanya. Menyimpan satu gim per atom akan membutuhkan 10 ^ 40 kali lebih banyak atom seperti yang kita perkirakan di alam semesta yang teramati.
Engineer Toast

6
Jawaban ini bagus sampai akhir ketika Anda merujuk ke "komputer yang sangat kuat". Itu bukan apa yang Anda maksud, dan frase yang tidak milik di pertanyaan atau diskusi.
Don Hatch

25

Lihat https://en.wikipedia.org/wiki/Endgame_tablebase .

Dengan kekuatan komputer yang tak terbatas, orang dapat membangun meja seperti itu untuk posisi awal dan menyelesaikan catur .

Dalam praktiknya, hanya posisi dengan hingga tujuh "laki-laki" (bidak dan bidak, menghitung raja) telah diselesaikan menggunakan superkomputer saat ini, jadi kami sangat jauh dari menyelesaikan catur. Kompleksitas masalah meningkat secara eksponensial dengan jumlah kepingan.


9
Sebagai catatan tambahan, jika Anda benar-benar menghasilkan tabel seperti itu, tidak peduli apa pun informasi yang Anda simpan, itu akan berbobot sekitar 10 ^ 43 kali lebih banyak dari alam semesta yang dapat diamati; mengingat ada ~ 10 ^ 123 posisi catur yang memungkinkan dan hanya ~ 10 ^ 80 baryon di alam semesta yang dapat diamati.
Shufflepants

6
@Shufflepants yang mengatakan saya menyimpannya menggunakan baryon?
Michael

3
@Christoph Dan dengan asumsi konservasi informasi, dan dengan asumsi Anda memiliki detektor dan komputer super Anda dengan kekuatan pemrosesan yang tak terbatas, Anda bisa perlahan-lahan selama sesuatu seperti tahun googolplex membacakan tablebase sebagai radiasi elang.
Shufflepants

3
@Shufflepants Perhatikan bahwa strategi menang yang sebenarnya mungkin membutuhkan lebih sedikit ruang daripada tablebase lengkap. Misalnya, Nim memiliki strategi kemenangan yang mudah digambarkan, tidak perlu membangun tabel besar dari semua negara yang mungkin.
Federico Poloni

1
Solusi ini sebagaimana dinyatakan tidak layak. Massa dari tabel seperti itu akan membentuk black hole dan tidak mungkin untuk mengekstrak data darinya.
emory

19

Jika Anda benar-benar memiliki kekuatan pemrosesan yang tak terbatas , algoritma seperti itu sebenarnya sepele untuk ditulis. Karena catur memiliki sejumlah kemungkinan keadaan yang terbatas , secara teori Anda bisa mengulanginya semua sampai Anda menemukan jalur permainan yang sempurna. Akan sangat tidak efisien, tetapi jika Anda memiliki kekuatan pemrosesan yang tak terbatas , itu tidak masalah.


Itu tidak benar. Dia mengatakan Anda memiliki kekuatan pemrosesan yang tak terbatas, tetapi tidak mengatakan apa-apa tentang ruang tak terbatas.
ubadub

@ubadub: Kami tidak membutuhkan ruang tanpa batas. Panjang permainan terbatas karena aturan 50-langkah, dan aturan dapat dibuat untuk mengurutkan semua gerakan yang mungkin dari suatu posisi. Karena mereka dapat disortir, mereka dapat disimpan sebagai integer. Ini semua memori yang diperlukan untuk berjalan di seluruh pohon. Dan jika Anda memiliki waktu yang tidak terbatas, Anda dapat berjalan di pohon sesering yang Anda inginkan, jadi Anda tidak perlu menyimpan setiap permainan catur yang mungkin.
vsz

Panjang permainan terbatas, tetapi sangat besar; seperti orang lain tunjukkan, jika Anda menghasilkan sebuah meja untuk menyimpan semua game semacam itu, "tidak peduli apa pun informasi yang Anda simpan, itu akan berbobot sekitar 10 ^ 43 kali lebih banyak dari alam semesta yang dapat diamati; mengingat ada ~ 10 ^ 123 kemungkinan posisi catur dan hanya ~ 10 ^ 80 baryon di alam semesta yang dapat diamati
ubadub

2
@ubadub: Itu benar, tetapi saya tidak berbicara tentang "meja untuk menyimpan semua game semacam itu". Ada banyak algoritma terkait pohon yang tidak harus menyimpan semua node dari seluruh pohon dalam memori.
vsz

@ vsz poin bagus
ubadub

13

Untuk langsung menjawab pertanyaan: ya ada algoritma seperti itu. Ini disebut minimax. (Tablase endgame dihasilkan dengan menggunakan algoritme ini (mundur!), Tetapi hanya algoritma minimax sederhana lama yang Anda butuhkan). Algoritma ini dapat memainkan game dua pemain zero sum dengan sempurna. Temukan pseudocode di sini:

https://en.wikipedia.org/wiki/Minimax

perhatikan bahwa varian dari algoritma ini digunakan oleh program catur komputer modern.


4

Tidak hanya ada algoritma untuk bermain catur sempurna, ada kemungkinan untuk menulis sebuah program pendek yang akan (diberikan sumber daya tak terbatas) memainkan setiap permainan dua pemain dengan durasi terbatas yang terbatas dengan pengetahuan deterministik yang sempurna .

Mesin game bahkan tidak perlu tahu aturan main yang dimainkannya. Yang dibutuhkan hanyalah representasi buram dari "kondisi permainan" dan fungsi yang (a) memberikan status permainan apa pun, memberikan daftar status hukum berikutnya, dan (b) memberikan status permainan, memutuskan apakah itu merupakan kemenangan bagi pemain 1 , kemenangan untuk pemain 2, seri, atau itu bukan status akhir.

Dengan adanya fungsi-fungsi tersebut, algoritma rekursif sederhana "memecahkan" permainan.

Fakta ini telah disinggung dalam jawaban sebelumnya oleh program catur (minimax) dan oleh Akumulasi (yang menyediakan versi program dengan python).

Saya menulis program semacam itu lebih dari 20 tahun yang lalu. Saya mengujinya dengan memainkan noughts-and-crosses (tic-tac-toe jika Anda orang Amerika). Cukup yakin itu memainkan permainan yang sempurna.

Tentu saja ini akan jatuh dengan cepat pada komputer apa pun yang bisa Anda bayangkan untuk game yang serius. Karena bersifat rekursif, ia secara efektif membangun seluruh pohon permainan di tumpukan, sehingga Anda akan mendapatkan "tumpukan tumpah" (permainan kata yang sangat dimaksudkan) sebelum Anda mendekati menganalisis 10 ^ 123 keadaan catur yang dirujuk dalam jawaban lain. Tetapi menyenangkan mengetahui bahwa pada prinsipnya program kecil ini akan melakukan pekerjaan.

Bagi saya ini juga mengatakan sesuatu yang menarik tentang AI: betapapun banyak "kecerdasan" yang Anda pikir diperlihatkan oleh Deep Blue, atau Go Zero, atau memang oleh manusia yang bermain Catur atau Pergi, ada perasaan di mana game-game ini sepele, tepatnya dapat dihitung optimal solusi. Tantangannya adalah bagaimana mendapatkan solusi yang baik meskipun tidak optimal dalam waktu yang wajar.


Algoritme Anda hanya berfungsi untuk gim dua pemain dengan pengetahuan sempurna. Ini akan jatuh ke permainan informasi tersembunyi seperti Stratego , karena setiap implementasi fungsi (a) melanggar aturan permainan. Ini juga gagal untuk game dengan durasi yang berpotensi tak terbatas: misalnya, membatalkan aturan 50-langkah dari catur, dan tidak dapat mengatakan bahwa dua raja saling mengejar di sekitar papan bukan negara yang dapat dimenangkan. Yang dapat dikatakan adalah bahwa ini bukan keadaan akhir.
Tandai

Poin yang valid. Saya akan mengedit jawaban saya.
Gareth

3

Saya akan mengabaikan kemungkinan pengundian atau urutan gerakan tanpa batas untuk kesederhanaan. Setelah algoritma dipahami, tidak terlalu sulit untuk memperluasnya ke kasus-kasus tersebut.

Pertama, beberapa definisi:

  1. Setiap langkah yang memenangkan permainan untuk pemain yang melakukan langkah itu adalah langkah yang menang.

  2. Setiap langkah yang kehilangan permainan bagi pemain yang melakukan langkah itu adalah langkah yang kalah.

  3. Setiap gerakan yang meninggalkan pemain lain dengan setidaknya satu gerakan yang menang juga merupakan langkah yang kalah. (Karena lawan dapat mengambil langkah itu dan memaksakan kerugian.)

  4. Setiap langkah yang membuat pemain lain hanya kehilangan langkah juga merupakan langkah yang menang. (Tidak peduli apa pun gerakan lawanmu, kamu akan menang.)

  5. Strategi yang sempurna berarti selalu membuat langkah-langkah kemenangan jika ada yang tersisa dan mengundurkan diri ketika seseorang hanya kehilangan langkah yang tersisa.

Sekarang, sepele untuk menulis strategi yang sempurna. Cukup meledak semua urutan langkah yang mungkin dan identifikasi gerakan menang / kalah. Mengabaikan kebuntuan, ini pada akhirnya akan mengidentifikasi setiap gerakan sebagai langkah menang atau langkah kalah.

Sekarang, strateginya sepele. Lihatlah semua kemungkinan gerakan Anda. Jika ada gerakan kemenangan yang tersisa, ambil satu dan menang. Jika hanya kekalahan yang tersisa, mundur, karena lawan Anda dapat memaksa Anda untuk kalah.

Tidak sulit untuk menyesuaikan strategi untuk memasukkan kemungkinan jalan buntu.

Pembaruan : Untuk berjaga-jaga jika tidak jelas bagaimana hal ini mengidentifikasi setiap gerakan sebagai langkah menang atau kalah, pertimbangkan:

  1. Setiap gerakan yang menghasilkan kemenangan adalah langkah yang menang.
  2. Setiap langkah yang menghasilkan kerugian adalah langkah yang hilang.
  3. Setiap gerakan yang menghasilkan lawan hanya memiliki gerakan menang atau kalah adalah langkah menang atau kalah.
  4. Sebut njumlah gerakan dalam permainan catur terpanjang yang mungkin. (Kami mengabaikan urutan yang tidak terbatas untuk saat ini, meskipun memasukkannya tidak sulit.)
  5. Tidak ada gerakan dengan ngerakan sebelumnya yang perlu kita pertimbangkan.
  6. Setiap gerakan dengan n-1gerakan sebelumnya adalah gerakan menang atau kalah karena ngerakan mengakhiri permainan terpanjang.
  7. Jadi setiap gerakan di kedalaman n-2hanya diikuti oleh gerakan menang atau kalah dan dengan demikian merupakan gerakan menang atau kalah.
  8. Dan selanjutnya kembali ke langkah pertama.

1
Definisi Anda tentang kemenangan dan kekalahan tidak cukup komprehensif. Langkah pertama, misalnya, tidak memenangkan permainan (# 1), atau meninggalkan lawan dengan hanya kehilangan langkah (# 4), jadi itu bukan "langkah menang". Tidak juga kehilangan permainan (# 2), atau meninggalkan lawan dengan langkah kemenangan (# 3), jadi itu bukan "langkah yang kalah". Strategi Anda mengharuskan setiap gerakan didefinisikan sebagai "langkah menang" atau "langkah kalah", yang sebenarnya tidak seperti yang Anda definisikan.
Nuclear Wang

2
@NuclearWang Itu mendefinisikan setiap gerakan baik sebagai langkah menang atau langkah kalah. Menurut Anda apa alternatif ketiga? Visualisasikan pohon dari semua game catur yang mungkin (dan ingat, kami tidak termasuk ikatan atau urutan yang tak terbatas untuk saat ini). Setiap rantai berakhir dengan kemenangan atau kekalahan. Ini meresap melalui pohon yang pada akhirnya mengidentifikasi setiap gerakan sebagai langkah menang atau langkah kalah.
David Schwartz

13
@NuclearWang baik langkah pertama adalah langkah menang untuk satu pemain, atau catur adalah (seperti tic-tac-toe) permainan yang dimainkan dengan bermain sempurna. Kami tidak tahu yang mana karena tidak ada yang pernah memiliki kekuatan komputasi untuk menjalankan algoritma ini sampai selesai, dan tidak ada yang menemukan bukti yang lebih langsung.
hobbs

8
Tidak ada keacakan dan tidak ada informasi tersembunyi dalam catur, yang tidak meninggalkan ruang untuk "mungkin". Setiap posisi dimenangkan, hilang, atau ditarik (bahkan jika kami belum berhasil mengidentifikasinya ). Dan penjelasan ini meninggalkan opsi "ditarik" untuk kesederhanaan, tetapi sebagian besar berjumlah 1) posisi ditarik jika ditarik sesuai dengan aturan, dan 2) posisi ditarik jika tidak memiliki gerakan menang, tetapi memiliki pada setidaknya satu gerakan yang membuat lawan tanpa gerakan kemenangan.
hobbs

2
@ Davidvidchchartz: Kecuali seseorang berada dalam posisi kalah, setiap gerakan yang tidak sempurna itu buruk. Dalam posisi yang kalah, umumnya tidak akan ada satu pun langkah "sempurna" [kecuali dalam situasi yang dipaksakan] karena setiap langkah hukum dapat memiliki kemungkinan menjadi satu-satunya langkah menang atau menggambar dalam beberapa keadaan yang mungkin (mungkin sangat dibuat-buat). Namun, mengundurkan diri akan tampak sebagai "langkah" terburuk yang tidak ambigu. Misalkan game ini terbukti diselesaikan sebagai kemenangan untuk White dengan d4. Apakah Anda ingin bermain program catur yang menanggapi 1. d4dengan ...resigns?
supercat

2

Misalkan Anda memiliki tiga fungsi: win_state, get_player, dan next_states. Input untuk win_stateadalah keadaan permainan, dan outputnya -1 jika putih dalam skakmat, 0 jika imbang, 1 jika hitam dalam skakmat, dan Nonesebaliknya. Input untuk get_playeradalah kondisi permainan, dan outputnya -1 jika giliran hitam dan 1 jika giliran putih. Input untuk next_statesadalah daftar kemungkinan kondisi permainan berikutnya yang dapat dihasilkan dari langkah hukum. Maka fungsi berikut, ketika diberi status permainan dan pemain, harus memberi tahu Anda kondisi permainan yang harus dimenangkan pemain tersebut.

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

Gunakan tabel pencarian

Iya nih. Mudah. Anda bahkan tidak memerlukan kekuatan pemrosesan yang tak terbatas. Yang Anda butuhkan adalah tabel pencarian yang berisi, untuk setiap posisi papan yang memungkinkan, gerakan terbaik untuk bermain di posisi itu. Berikut adalah pseudo-code:

def play-move(my-color, board-position):
    return table-of-best-moves[my-color, board-position]

Tangkapan

Satu-satunya tangkapan adalah bahwa tabel pencarian ini harus sangat, sangat besar — ​​mungkin lebih besar dari galaksi Bima Sakti — dan akan membutuhkan waktu lama untuk membangunnya — mungkin lebih lama dari usia alam semesta saat ini, kecuali ada beberapa keteraturan yang belum ditemukan dalam catur yang membuatnya jauh lebih sederhana daripada yang bisa kita lihat sekarang. Tetapi jika Anda memiliki tabel pencarian ini, subrutin untuk memilih langkah sempurna setiap kali dapat diimplementasikan hanya dalam satu instruksi CPU.

Juga, mengingat pengetahuan kami tentang catur saat ini, tidak ada cara untuk memastikan bahwa permainan yang sempurna menjamin bahwa Anda tidak akan kalah. Misalnya, jika permainan yang sempurna menjamin kemenangan untuk Putih, maka Hitam akan kehilangan bahkan jika Hitam bermain dengan sempurna.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.