Apakah AI seperti catur benar-benar tidak dapat diterapkan dalam game strategi berbasis giliran?

13

Jelas, mencoba menerapkan algoritma min-max pada pohon gerakan lengkap hanya berfungsi untuk permainan kecil (saya minta maaf kepada semua penggemar catur, dengan "kecil" Saya tidak bermaksud "sederhana"). Untuk permainan strategi berbasis giliran yang tipikal di mana papan sering lebih lebar dari 100 ubin dan semua bagian di satu sisi dapat bergerak secara bersamaan, algoritma min-max tidak dapat diterapkan.

Saya bertanya-tanya apakah algoritma min-max parsial yang membatasi dirinya untuk konfigurasi papan N pada setiap kedalaman tidak cukup baik? Dengan menggunakan algoritma genetika, dimungkinkan untuk menemukan sejumlah konfigurasi papan yang sesuai dengan fungsi evaluasi. Mudah-mudahan, konfigurasi ini mungkin juga cocok untuk tujuan jangka panjang.

Saya akan terkejut jika ini belum dipikirkan sebelumnya dan dicoba. Benarkah? Bagaimana cara kerjanya?

Joh
sumber
1
Anda dapat bereksperimen dengan Difusi Kolaboratif . Ini bekerja dengan nilai difusiong ke dalam grid, musuh kemudian mendaki kotak. Ini berfungsi setidaknya untuk merintis jalan. Jika Anda membuat lebih banyak nilai untuk difus (secara terpisah?) Dan pendakian bukit yang lebih canggih (pilih ke mana harus pergi berikutnya berdasarkan beberapa nilai) ...
user712092
Bagaimana dengan Alpha-Beta Prunning ? Ini adalah versi min-max yang lebih baik.
user712092
Saya melihat Alpha-Beta Prunning sebagai semacam min-max.
Joh
Ya itu. Tetapi harus lebih cepat. Tidak tahu apakah itu membantu Anda ...
user712092
Saya agak menyerah pada ide itu. Saya condong ke arah naskah AI yang "longgar" di mana saya menggunakan kendala alih-alih instruksi khusus tentang cara bereaksi terhadap berbagai peristiwa. Saya memiliki harapan bahwa GA atau algoritma optimasi lainnya dapat memberikan perilaku yang cukup pintar.
Joh

Jawaban:

5

Itu tergantung pada mekanisme permainan. Game tree min-max mungkin tidak berlaku secara keseluruhan, tapi mungkin itu berlaku di beberapa area. Adalah umum bahwa beberapa lokasi pada peta secara strategis penting. Min-max dapat diterapkan pada tingkat strategis yang mana dari lokasi-lokasi itu untuk dikendalikan. Pada tingkat taktis, untuk x kuadrat di sekitar setiap lokasi strategis, min-max dapat digunakan untuk memutuskan bagaimana unit dikerahkan untuk menangkap dan mempertahankannya.

mghicks
sumber
9

Ini bukan algoritma minimax, namun orang-orang yang bertanggung jawab atas Killzone AI merilis makalah berdasarkan fungsi evaluasi posisi yang juga digunakan beberapa catur catur.

Ini sangat sederhana karena yang dilakukan adalah mengambil posisi di papan berdasarkan pengetahuan agen saat ini. Jadi, jika agennya rendah kesehatannya, maka posisi yang jauh dari musuhnya akan diberikan skor yang lebih tinggi karena lebih disukai berada di luar jangkauan musuh.

Makalah ini dapat ditemukan di AI Game Programming Wisdom 3 dan berjudul Dynamic Tactical Position Evaluation.

Draft makalah ini dapat ditemukan online di sini:
http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

Semoga itu bisa membantu.

Ray Dey
sumber
2

Saya tidak berpikir itu akan cukup baik. Memilih konfigurasi N tertentu, berapa banyak dan yang mana, hampir tidak mungkin dilakukan pada sesuatu yang kompleks. Ingatlah bahwa jika game Anda memiliki sumber daya tak terbatas atau sesuatu yang serupa, maka mungkin ada lingkaran dalam cara itu dapat dimainkan, membuat mengeksploitasi AI seperti itu relatif mudah.

DeadMG
sumber
2

Saya akan menyarankan setidaknya menerapkan min-max dengan pemangkasan alpha-beta.

Tanpa mencobanya dan memutuskan itu tidak praktis (yaitu kinerja yang mengerikan), dan tanpa latar belakang yang lebih banyak tentang mekanisme permainan, saya tidak melihat mengapa Anda berpikir min-max tidak dapat diterapkan.

Ukuran papan berpotensi menjadi masalah, tetapi dengan pemangkasan, membuang jalur yang hilang memungkinkan pencarian yang lebih dalam dengan jumlah perhitungan yang sama, jadi mungkin area papan yang lebih besar tidak akan menjadi masalah saat dipangkas? Selain itu, dengan asumsi ukuran papan itu sendiri adalah masalah mungkin prematur, ukuran papan tidak sebanyak kompleksitas mekanisme dan berapa banyak gerakan yang dimungkinkan dari setiap posisi papan. Jika gim Anda memiliki area yang luas tetapi jarang penduduknya, jumlah kemungkinan pergerakan dari setiap kondisi papan mungkin tidak jauh berbeda dibandingkan jika papan itu cukup besar untuk memenuhi semua bagian. Tentu saja jika Anda memiliki papan raksasa yang 90% penuh dan semuanya dapat bergerak di mana saja setiap belokan, itu akan membutuhkan banyak pencarian.

Saya juga tidak yakin mengapa gerakan simultan merupakan masalah. Selama Anda melakukan transisi dari satu status papan diskrit ke status lain, dan memiliki fungsi evaluasi, algoritme harus diterapkan.

Saya berasumsi Anda perlu memiliki fungsi evaluasi, dan terlepas dari pencarian yang Anda gunakan, fungsi evaluasi adalah tempat sebagian besar pekerjaan akan dilakukan. Algoritma min-max dengan pemangkasan itu sendiri sangat sederhana untuk diterapkan, sesuatu yang mungkin dapat Anda lakukan dalam satu atau dua jam dan banyak pekerjaan infrastruktur seperti penyimpanan keadaan papan, evaluasi, perpindahan generasi, kemungkinan akan tetap sama terlepas dari pencarian Anda puas.

Suboptimus
sumber
mengenai pergerakan simultan: Pada awalnya saya tidak melihat bagaimana mengubah min-max, yang biasanya dijelaskan menggunakan game berbasis giliran seperti catur, ke case pergerakan simultan. Saya pikir saya mulai melihat bagaimana melakukannya, tetapi itu tidak sepele.
Joh
Saya telah memberikan solusi untuk masalah gerakan simultan Anda di pos saya (tajuk "Kemungkinan gerakan di setiap posisi"). Anda dapat menangani ini hanya dengan melakukan satu gerakan di setiap iterasi yang dikombinasikan dengan gerakan "sekarang saya akhiri" secara eksplisit, yang memberikan giliran kepada lawan. Hal ini memungkinkan pemangkasan alpha-beta menengah untuk memecah kompleksitas gerakan simultan tersebut.
SDwarfs
1

Pemenang tantangan Google AI 2011 menggunakan min-max (kedalaman 1). Kontestan top lainnya menggunakan random sampling . Kontestan ini menyebutkan bahwa campuran sampel min-max dan acak, yang pada dasarnya apa yang saya jelaskan dalam pertanyaan saya, berkinerja buruk. Ini sudah cukup, kurasa.

Di sisi lain, itu menunjukkan kemungkinan untuk menggunakan min-max dalam game besar. Namun tampaknya perlu untuk membatasi hanya pada kelompok kecil semut, bekerja dengan seluruh semut mungkin terlalu lambat. Pengamatan lain yang menarik adalah kedalaman 1 sudah cukup. Kami (manusia) telah menjadi cukup baik dalam bermain catur, dan AI untuk permainan ini membutuhkan pohon pencarian yang lebih dalam untuk menjadi menantang. Game baru yang lebih kompleks belum pernah dimainkan dan dipelajari selama ini, dan AI yang bodoh mungkin memiliki nilai hiburan yang cukup.

Joh
sumber
1

Ide dasar AI catur adalah membuat daftar semua kemungkinan pergerakan dari perkiraan pergerakan terbaik saat ini, kemudian menilai mereka dan mengulangi prosesnya. Ini menjatuhkan mereka dengan peluang terlalu sedikit karena mereka tidak akan diambil (atau dapat dianggap tidak diambil karena mereka tampaknya tidak memberikan keuntungan).

Ide dasarnya mengharuskan Anda membuat daftar semua gerakan yang mungkin, dan mengulangi proses itu untuk semua gerakan itu, dll. Ini dimungkinkan dalam catur (di mana daftar kemungkinan gerakan selanjutnya secara efektif dihitung; papan catur pemula memiliki 20 gerakan yang memungkinkan ) dan sampai pada titik untuk hal-hal lain seperti backgammon, dam dan memecahkan kubus Rubik.

Jika saya mengambil game berbasis giliran sederhana (Civilization 2) sebagai contoh, masing-masing orang Anda dapat pindah ke total 8 kotak (atau 24) dalam satu putaran. Jika Anda memiliki 10 orang (yang tidak banyak, Anda biasanya memiliki lebih banyak pada saat itu mulai agak menarik) jumlah total kemungkinan "bergerak" dari keadaan saat ini (jadi satu tingkat) sudah 8 ^ 10 atau sekitar 4 miliar. Bahkan jika Anda memangkas 99,99% dari itu, Anda masih tidak bisa pergi jauh di pohon karena jumlah gerakan yang mungkin meledak sangat cepat.

Tambahkan ke bahwa permainan itu agak seperti masalah kubus Rubik, di mana Anda hanya melihat kemajuan setelah beberapa gerakan 10 atau 12, masalah meledak ke titik di mana keuntungan dari min / max standar hanya lazim pada kapasitas memori lebih dari yang dimiliki komputer biasa.

Dengan kata lain, strategi yang akan ditemukan akan direproduksi tetapi buruk.

Untuk masalah sebenarnya, bagaimana membuat AI yang layak, saya akan pergi ke arah gerakan acak yang pada dasarnya mengarahkan (menggerakkan setiap pria dengan sedikit kecerdasan dasar), evaluasi dan penyetelan. Lakukan ini secara paralel untuk 100 atau 1000 yang berbeda dan pilih salah satu yang akhirnya menjadi yang terbaik. Anda dapat memberi umpan balik hasil dari ini ke kemudi cerdas asli untuk menyetelnya lagi. Agak seperti simulasi monte-carlo.

omong kosong
sumber
0

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

SDwarfs
sumber