Untuk berhasil menerapkan min / max ke gim strategi berbasis giliran, Anda harus menerapkan dengan benar semua teknik catur yang tersedia ...
Fungsi evaluasi
Bahkan mesin catur memiliki kekuatan yang sangat buruk, jika fungsi evaluasi Anda buruk. Versi paling sederhana dari fungsi evaluasi adalah: 1 = game dimenangkan oleh putih, -1 = game dimenangkan oleh hitam, 0 = semua kasus lainnya; Tapi, ini akan memberi Anda kinerja yang sangat buruk. Hal yang sama terjadi pada gim berbasis giliran Anda! Jika Anda ingin menggunakan min / max (dengan pemangkasan alpha / beta dan semacamnya) seperti dalam catur, Anda juga harus menerapkan fungsi evaluasi yang masuk akal! Selain itu, Anda tidak dapat membandingkan kinerja algoritme tersebut ketika diterapkan pada permainan strategi Anda dengan kasus yang diterapkan pada catur.
Apa fungsi evaluasi mesin catur, adalah mengevaluasi hal-hal seperti:
- Seberapa baik posisi sepotong di papan tulis?
- Berapa kali sepotong diserang?
- Berapa kali bagian itu dilindungi?
- Seberapa baik masing-masing bagian bebas "bergerak" di papan tulis? (atau: Berapa banyak ubin yang "dikontrol")
Bagian-bagian dari fungsi evaluasi tersebut pertama-tama harus "diterjemahkan" ke dalam gim Anda:
- Posisi bidak: Apakah misalnya di atas bukit, yang memperpanjang jangkauan pemotretannya?
- Diserang: Berapa banyak setiap bagian dalam bahaya? (misalnya jumlah nilai serangan unit yang dapat menyerang unit khusus dikalikan dengan beberapa probabilitas untuk diserang olehnya; probabilitas meningkat, jika unit sudah rusak; berkurang jika banyak unit lain berada dalam jangkauan unit penyerang)
- Serangan Sendiri: Berapa banyak unit yang bisa diserang oleh masing-masing unit ini?
- Perlindungan: Berapa banyak potongan sendiri di sebelahnya (untuk membantu)? Mungkin sebuah unit mungkin tidak menyerang unit di bawah jarak minimum dan lebih baik melindunginya dengan unit yang memiliki kemungkinan untuk menyerang unit terdekat.
- Mobilitas: Seberapa mobile unit Anda? (bisakah itu melarikan diri?)
Peringkat yang berbeda harus disimpulkan dengan fungsi pembobotan (factor_a * rating_a + factor_b * ranting_b + ...) untuk semua unit ...
Dalam permainan strategi juga sumber daya (emas, kayu, ...) yang tersisa harus diperhitungkan.
Jika fungsi evaluasi Anda cukup baik, Anda tidak perlu benar-benar mencari "mendalam" ke pohon untuk sebagian besar kasus. Jadi Anda mungkin hanya perlu melihat lebih dekat pada 3 atau 10 pilihan paling menjanjikan. Lihat bab selanjutnya ...
Kemungkinan bergerak di setiap posisi
Hal yang paling bermasalah tentang menggunakan min / max untuk permainan strategi adalah bahwa Anda dapat memerintahkan beberapa unit dalam satu giliran, sedangkan dalam catur Anda hanya diizinkan untuk memerintahkan satu unit (kecuali untuk castling, tetapi ini adalah kombinasi gerakan yang jelas). Ini menyebabkan 5 ^ N gerakan yang mungkin untuk N unit untuk setiap "posisi" (istilah catur), jika Anda hanya akan memutuskan antara "bergerak ke utara, selatan, barat, timur atau berhenti" untuk setiap unit. Anda dapat menyelesaikan ini dengan memecah perintah kompleks menjadi perintah tingkat rendah: misalnya memilih tindakan untuk unit A, masuk ke kedalaman dan memutuskan untuk unit B .... memutuskan untuk unit N ... dan kemudian akhiri giliran ini. Tapi, ini saja tidak mengubah kerumitan! Anda harus mengoptimalkan urutan tindakan yang ditugaskan ke unit (misalnya, unit B pertama, C, D dan kemudian unit A). Anda bisa mencatat dampak keputusan untuk setiap unit selama perhitungan terakhir dan kemudian mengurutkan berdasarkan kepentingan. Dengan cara ini pemangkasan alpha-beta dapat digunakan untuk memotong kombinasi buruk dari pohon pencarian sangat awal. Prioritas tertinggi harus selalu "tidak melakukan apa-apa lagi dan akhiri giliran Anda" (pemangkasan gerakan nol) di setiap iterasi. Dengan cara ini Anda dapat "melewati" menugaskan sebagian besar tugas ke sebagian besar unit dan membiarkan mereka melanjutkan apa yang telah mereka lakukan sebelumnya. Dengan cara ini pencarian akan masuk ke kedalaman dengan cepat dengan hanya melihat unit "kritis" (misalnya yang benar-benar dalam pertempuran sekarang). Pastikan untuk hanya memerintahkan setiap unit sekali ... Anda juga dapat menggunakan beberapa keacakan untuk memastikan bahwa unit "penting" juga mendapatkan perintah dari waktu ke waktu. Terutama, unit menyelesaikan beberapa pekerjaan (mis
Iterative Deepening + Caching / Hash Table
Kemudian, Anda bisa "memperdalam interatif" untuk masuk ke kedalaman lebih dan lebih sampai batas waktu telah tercapai. Jadi Anda akan mencari lebih dalam jika ada lebih sedikit unit, dan Anda selalu memiliki "hasil" jika Anda berhenti mencari solusi yang lebih baik. Pendalaman berulang harus menggunakan tabel hash untuk cache hasil pencarian sebelumnya. Ini juga memungkinkan untuk menggunakan kembali beberapa hasil dari pencarian belokan terakhir (cabang dari pohon pencarian yang mencakup perintah yang sebenarnya dieksekusi di belokan terakhir). Untuk mengimplementasikan ini, Anda memerlukan fungsi hashing yang sangat bagus (lihat "kunci zobrist"), yang dapat diperbarui secara iteratif. Memperbarui kunci hash berarti, bahwa Anda dapat mengambil kunci hash dari "posisi" lama dan hanya dapat menendang perubahan posisi (mis. mengambil unit pada posisi x dan meletakkannya di posisi y). Dengan cara ini menghitung kunci hash cepat dan Anda tidak perlu memproses situasi seluruh papan untuk menghitungnya, hanya untuk memeriksa apakah hash berisi entri sebelumnya untuk posisi ini. Di satu sisi Anda harus memastikan bahwa tidak ada tabrakan hash terjadi.
Perilaku Non-deterministik
Perilaku non-deterministik adalah masalah untuk pencarian min / max. Ini berarti, tidak yakin apakah Anda akan mengenai target yang diserang (mis. Probabilitas adalah 10%). Maka Anda tidak bisa begitu saja merencanakan ini terjadi. Dalam hal ini Anda perlu memodifikasi algoritme dan meletakkan lapisan "probabilitas" di antaranya. Ini agak seperti "pergantian probabilitas". Setiap hasil independen harus dipertimbangkan secara terpisah. Evaluasi melalui "lapisan" kedalaman ini kemudian harus diambil sampelnya (monte carlo sampling) dan hasil evaluasi mendalam harus ditimbang dengan probabilitas kejadian. Hasil yang berbeda dari lapisan probabilitas harus dianggap seperti gerakan lawan yang berbeda (tetapi bukannya min / maks "rata-rata" harus dihitung). Ini tentu saja akan meningkatkan kompleksitas pohon pencarian.
Ringkasan
Saat menerapkan semua teknik tersebut (yang semuanya digunakan oleh mesin catur saat ini) ke permainan deterministik, Anda pasti akan dapat mencapai hasil yang masuk akal untuk sebuah permainan juga. Untuk permainan non-deterministik, ini mungkin akan lebih rumit, tapi saya pikir masih dapat dikelola.
Sumber yang bagus untuk menjelaskan teknik-teknik tersebut (untuk catur) adalah http://chessprogramming.wikispaces.com/
Anda bahkan dapat menerapkan semacam keacakan terarah dalam pencarian min / max. Alih-alih secara deterministik menyelidiki hasil terbaik terlebih dahulu di setiap iterasi, Anda dapat mengacak ini dan membiarkan urutannya ditentukan oleh distribusi probabilitas yang didasarkan pada evaluasi saat ini ...