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 = 400
posisi 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 .