Apakah mesin catur menyimpan semua posisi yang dianalisis sebelumnya antara gerakan


17

Saya mulai bermain dengan mesin catur. Saya perhatikan bahwa mesin catur terbaik bisa memakan waktu beberapa menit untuk bergerak. Saya bertanya-tanya mengapa. Sebelum setiap gerakan, mesin memeriksa semua gerakan hukum di masa depan hingga batas tertentu. Namun kemudian sepertinya mengulangi latihan ini untuk langkah selanjutnya. Mengingat bahwa langkah sebelumnya sudah termasuk dalam pohon gerakan diperiksa, apakah ini tidak efisien? Atau apakah saya salah paham?

[Sunting: Saya berasumsi bahwa alasan mengapa memindahkan analisis tidak di-cache adalah karena beberapa keterbatasan memori komputer yang hanya membuatnya lebih cepat untuk memulai kembali analisis]

Jawaban:


20

Memprogram mesin catur adalah wilayah yang sangat rumit, jadi di depan saya akan mengarahkan Anda ke Wiki Pemrograman Catur , yang memiliki banyak informasi hebat tentang topik ini.

Latar Belakang

Perhitungan catur (dan banyak hal serupa) umumnya dimodelkan dan dianggap sebagai "pohon permainan" atau " pohon keputusan ". Secara umum, pohon ini adalah grafik terarah, dengan satu simpul di atas (posisi saat ini), mengarah ke sebuah simpul untuk setiap gerakan yang mungkin, masing-masing mengarah ke lebih banyak simpul untuk setiap gerakan selanjutnya yang mungkin , dan seterusnya.

Dalam bentuknya yang paling sederhana dan kasar, engine Catur menghasilkan semua posisi pada pohon ini hingga batas kedalaman ("lapis"), mengevaluasi setiap posisi yang dihasilkan berdasarkan beberapa kriteria kompleks 1 . Kemudian memainkan langkah yang tampaknya mengarah pada hasil terbaik. Saat ini, banyak teknik yang sangat rumit telah dikembangkan untuk membatasi jumlah posisi yang harus dilihat oleh mesin, tetapi saya akan mengabaikannya untuk tujuan jawaban ini, karena mereka tidak mengubah masalah sebenarnya di tangan.

Matematika Tangent

Alasan dasar bahwa mesin biasanya mengambil jumlah waktu yang sama untuk mempertimbangkan setiap gerakan adalah bahwa ukuran pohon keputusan meningkat secara eksponensial dengan kedalaman ( k).

Pertimbangkan posisi awal. Bagian atas pohon ( k=0) adalah satu simpul. Ada dua puluh langkah pertama yang mungkin untuk White, jadi ada dua puluh node di kedalaman k=1. Kemudian, Black juga memiliki dua puluh gerakan yang tersedia untuk masing-masing opsi White: jadi k=2, ada 20 * 20 = 400posisi yang memungkinkan! Dan itu hanya akan semakin buruk ketika para pemain mengembangkan karya mereka!

Sebagai contoh, mari kita berpura-pura bahwa selalu ada dua puluh kemungkinan gerakan untuk setiap pemain pada waktu tertentu 2 . Anda menginstruksikan komputer untuk melihat ke depan lima langkah untuk setiap pemain (sepuluh lapis). Mari kita lihat ukuran pohon brute-force di setiap level. Untuk bersenang-senang, kami juga akan melihat jumlah posisi di pohon (dari atas ke tingkat yang diberikan).

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

Hasil dari setiap level yang secara eksponensial lebih besar dari level sebelumnya adalah bahwa ukuran keseluruhan pohon didominasi oleh level bawah . Perhatikan contoh di atas: level terakhir saja berisi sepuluh triliun node. Seluruh sisa pohon hanya berisi lima ratus miliar. Lapis kesepuluh berisi sekitar 95% dari node di seluruh pohon (ini sebenarnya benar di setiap tingkat). Dalam praktiknya, apa artinya ini adalah semua waktu pencarian dihabiskan untuk mengevaluasi langkah "terakhir".

Menjawab

Jadi bagaimana hubungannya dengan pertanyaan Anda? Nah, katakanlah komputer diatur ke sepuluh lapis, seperti di atas, dan selanjutnya "mengingat" hasil evaluasinya. Ini menghitung langkah, memainkannya, dan kemudian Anda bergerak. Sekarang dua gerakan telah dibuat, sehingga memangkas semua posisi dari memori terkait dengan gerakan yang tidak terjadi, dan dibiarkan dengan pohon yang turun delapan langkah yang sudah dihitung: 26.947.368.421 posisi!

Baiklah! Jadi kita hanya perlu menghitung dua lapis terakhir! Dengan menggunakan perkiraan 20 gerakan pada setiap kedalaman, jumlah total gerakan yang perlu kita hitung di sini masih lebih dari sepuluh triliun. Posisi yang kami hitung hanya menyumbang 2,5% dari kemungkinan! Jadi, bahkan dengan menyimpan hasil langkah terakhir, yang terbaik yang bisa kita harapkan adalah peningkatan 2,5% dalam kecepatan! Pada intinya, inilah sebabnya bahkan jika program Anda menyimpan hasil sebelumnya, Anda biasanya tidak melihat percepatan yang signifikan di antara gerakan (kecuali kasus ketika komputer menemukan pasangan yang dipaksa atau sesuatu, tentu saja!).


Penafian Penyederhanaan

Ada banyak kerumitan yang terlibat dalam pertanyaan ini, itulah sebabnya saya ditautkan ke pemrograman wiki di bagian paling atas dan hanya berusaha menjelaskan jawabannya dalam istilah matematika yang luas. Pada kenyataannya, program biasanya melakukan cache bagian pohon dari gerakan ke gerakan, dan ada alasan lain mengapa itu tidak cukup dengan sendirinya - beberapa alasan sederhana (misalnya garis tertentu mungkin terlihat bagus untuk delapan gerakan, tetapi diakhiri dengan punggung) -teman kawin pada langkah sembilan!) dan banyak yang sangat rumit (umumnya terkait dengan berbagai metode pemangkasan pintar). Jadi komputer harus terus melihat ke depan dalam upaya untuk menghindari membuat asumsi buruk berdasarkan kedalaman cut-off langkah sebelumnya.


1 Saya tidak akan membahas fungsi heuristik di sini, karena itu adalah area yang sangat kompleks, tetapi seringkali ada beberapa keuntungan yang dapat dicapai melalui skema caching posisi di sini juga.

2 Faktor percabangan rata-rata 20 mungkin jauh terlalu rendah .


Sangat menarik, ini menjelaskan mengapa RAM saya hampir runtuh ketika saya telah menganalisis secara mendalam dengan mesin saya (sebuah misteri yang mengejutkan saya selama beberapa waktu sekarang).
Pablo S. Ocal

Terima kasih! Sangat menarik. Saya menemukan diskusi mesin catur wiki menarik.
Dom

3

Mesin catur biasa akan menyimpan beberapa posisi dan skor alpha-beta bracketing dalam tabel transposisi yang dapat dikonsultasikan selama pencarian berikutnya. Tabel ini tidak dikonsultasikan secara langsung untuk memilih langkah berikutnya, tetapi membuat pencarian langkah itu lebih efisien dalam dua cara.

  1. Suatu posisi kemungkinan akan ditemui beberapa kali dalam pohon pencarian, yang dicapai oleh transposisi atau permutasi dari urutan gerakan. Karena tabel dapat dikonsultasikan, posisi seperti itu mungkin hanya perlu dievaluasi beberapa kali (untuk kedalaman pencarian tetap yang berbeda) alih-alih puluhan kali posisi tersebut dikunjungi dan ditinjau kembali.

  2. Teknik standar untuk pencarian alpha-beta adalah dengan menggunakan iterative deepening , berulang kali memeriksa pohon pada kedalaman pencarian yang lebih besar hingga kedalaman terminal tercapai. Skor penilaian yang dihitung dalam iterasi sebelumnya digunakan untuk memesan gerakan yang dicari dalam iterasi selanjutnya. Alpha-beta diketahui berkinerja lebih baik (yaitu memangkas lebih banyak pohon pencarian) jika gerakan yang baik dicari sebelum gerakan yang buruk.


3

Contoh membuktikan memori mesin:

Pertimbangkan posisi-posisi di mana ditemukan hal-hal teoretis yang dalam, khususnya permainan yang dimainkan Caruana vs Topalov tahun ini. Ketika Anda membiarkan mesin menganalisis posisi setelah bergerak 12 untuk waktu yang kurang lebih singkat (katakanlah 10-15 menit) Anda dapat memeriksa gerakan yang disarankan dan melihat bahwa TN ( 13.Re2!) tidak muncul di antara mereka. Perkenalkan gerakan itu sendiri, mundurlah dan biarkan mesin menganalisis lagi posisi yang sama untuk waktu yang kurang lebih sama. Anehnya, setelah beberapa pemikiran, sekarang mesin menganggap TN sebagai langkah terbaik dan menyetujuinya.

EDIT: Jawaban asli (dijaga di bawah) salah, namun, ini memberikan contoh yang berguna dari memori mesin, yang telah dikutip di bagian atas.

Sejauh yang saya tahu, mereka tidak, yaitu, mereka memulai pencarian pohon hampir dari awal di setiap gerakan.

Namun, mereka harus memiliki semacam fungsi yang mengaktualisasikan nilai untuk setiap gerakan, dan fungsi ini pasti memiliki memori jangka pendek. Beberapa contoh adalah posisi di mana hal-hal baru yang mendalam ditemukan, khususnya permainan yang dimainkan Caruana vs Topalov tahun ini. Ketika Anda membiarkan mesin menganalisis posisi setelah bergerak 12 untuk waktu yang kurang lebih singkat (katakanlah 10-15 menit) Anda dapat memeriksa gerakan yang disarankan dan melihat bahwa TN ( 13.Re2!) tidak muncul di antara mereka. Perkenalkan gerakan itu sendiri, mundurlah dan biarkan mesin menganalisis lagi posisi yang sama untuk waktu yang kurang lebih sama. Anehnya, setelah beberapa pemikiran, sekarang mesin menganggap TN sebagai langkah terbaik dan menyetujuinya.

Saya bukan ahli perangkat lunak catur, tetapi ini terjadi. Paling tidak sebagian dapat dijelaskan jika (seperti yang dikatakan) fungsi yang mengevaluasi gerakan untuk posisi memiliki memori.


2
Tidak. Mesin tidak memulai pencarian pohon dari awal. Lihat jawaban saya.
SmallChess

Maaf tapi saya menemukan jawaban Anda agak menyesatkan
BlueTrin

1
Saya mencoba membuatnya lebih jelas. Seperti yang dikatakan, jawabannya salah, namun contohnya tetap dan bagus untuk diperiksa (bagi kami orang romantik, itu memberi kami beberapa harapan bahwa meskipun komputer lebih kuat dari manusia, terkadang intuisi, pengalaman, dan kerja keras dapat "mengalahkan" kemampuan mereka. asli).
Pablo S. Ocal

@ Pedro, teladan Anda baik-baik saja. Ada memori karena pertama kali Anda menjalankan pencarian, mesin menyimpan evaluasi posisi dalam sebuah tabel. Ketika Anda mencari posisi yang sama lagi, mesin akan dapat mencari lebih cepat. Karena itu akan memberi Anda hasil yang berbeda.
SmallChess

Hasil edit terakhir adalah untuk @BlueTrin, yang berpikir itu menyesatkan.
Pablo S. Ocal

2

Henry Keiter sudah memberi Anda jawaban umum, saya akan memberikan jawaban yang lebih teknis. Ini semua tentang tabel transposisi, kedalaman pencarian, dan cutoff. Diskusi di sini JAUH lebih teknis daripada jawaban lain, tetapi akan bermanfaat bagi siapa pun yang ingin belajar pemrograman catur.

Ini adalah kesalahpahaman umum bahwa jika suatu posisi dievaluasi sebelumnya, skor evaluasi dapat digunakan kembali selama ada cukup memori untuk menyimpan gerakan. Pemrograman catur lebih rumit dari itu. Meskipun diberi memori tak terbatas, Anda masih harus mencari posisi lagi. Untuk setiap gerakan, skor evaluasi dilampirkan dengan dalam dan terikatnya. Misalnya, jika mesin menyimpan gerakan dengan kegagalan-tinggi, entri tabel akan memiliki batas yang lebih rendah. Ini berarti, jika Anda sedang mencari posisi Anda masih harus memeriksa batas apakah Anda dapat menggunakan skor evaluasi sebelumnya.

Terlepas dari itu, setiap evaluasi memiliki kedalaman yang melekat padanya. Dalam kerangka kerja memperdalam iteratif, saat Anda meningkatkan kedalaman untuk setiap iterasi, Anda masih harus mencari posisi yang sudah Anda cari di iterasi sebelumnya.

Jawaban singkat untuk pertanyaan Anda adalah bahwa mesin menyimpan semua posisi yang dianalisis sebelumnya (sepanjang memori cukup), tetapi hasil yang disimpan tidak dapat digunakan kembali semudah yang Anda kira . Dalam fase pembukaan di mana ada pengulangan yang lebih sedikit, hasil yang disimpan itu paling berguna untuk pemesanan-pindah dan selusin heuristik pengurangan-pindah. Misalnya, orang akan menganggap langkah terbaik dari kedalaman terakhir adalah langkah terbaik di kedalaman saat ini, jadi kami akan mengurutkan daftar langkah dan mencari langkah terbaik sebelum langkah lain. Mudah-mudahan, kita akan mendapatkan cutoff awal gagal-tinggi awal.

Kami tidak memiliki memori tak terbatas untuk menyimpan posisi. Kita perlu mendefinisikan algoritma hashing. Algoritma hashing Zobrist memberi kita distribusi pseudo-acak, tetapi cepat atau lambat kita masih harus mengganti beberapa entri yang ada.


0

Setiap mesin memiliki skema manajemen waktu sendiri. Beberapa engine dan GUI memungkinkan Anda mengatur kecepatan mesin akan bermain. Mesin selalu menghitung / mengevaluasi / minimum sebanyak yang mereka dapat diberikan kendala yang diberlakukan oleh subrutin manajemen waktu atau pengaturan pengguna. Jika sebuah mesin berpikir untuk waktu yang lama, kemungkinan karena kontrol waktu untuk gim itu lambat, atau pengguna telah menyetelnya untuk bermain perlahan.

Posisi dan evaluasi yang telah dihitung mesin disimpan dalam tabel hash. Pengguna dapat mengatur ukuran hash yang tersedia di pengaturan sebagian besar mesin UCI. Mesin itu sendiri menggunakan jumlah RAM tertentu, dan jika Anda mengatur ukuran tabel hash Anda terlalu tinggi, komputer akan mulai menyimpan hash pada hard drive Anda dalam bentuk RAM virtual. Memori hard drive diakses lebih lambat daripada RAM, dan Anda biasanya dapat mendengar hard drive berputar. Banyak pengguna mengatur ukuran tabel hash agar sesuai dengan RAM yang tersedia.

Sebagian besar tabel hash menjadi tidak berguna setelah mesin dan lawannya membuat gerakan mereka karena posisi lain yang dianggap tidak lagi relevan. Mesin akan menggunakan kembali evaluasi yang disimpan dalam hash, tetapi beberapa evaluasi terbukti salah karena efek cakrawala setelah mesin masuk lebih dalam di jalur yang sama, sehingga sering harus memesan ulang urutan kandidatnya.

Karena jumlah hash adalah terbatas, mesin juga harus membuat keputusan tentang informasi apa yang harus dihapus dari hash-nya saat menambahkan informasi baru. Mesin tidak tahu terlebih dahulu gerakan apa yang akan dimainkan, sehingga mungkin secara tidak sengaja menghapus informasi yang akan berguna saat menambahkan data baru.

Mesin pada umumnya tidak memeriksa semua langkah hukum sampai pada tingkat tertentu. Mereka menghilangkan cabang pohon tertentu dari pertimbangan berdasarkan pemangkasan ke depan dan ke belakang. Juga, jika posisi leaf-node telah menangkap atau memeriksa belum dilakukan, mesin akan terus turun garis itu sampai mencapai posisi tenang (diam). Pohon yang sebenarnya mungkin cukup dalam di beberapa tempat, sementara garis lain mungkin telah terpotong setelah sejumlah kecil gerakan.

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.