Seperti yang Anda tahu ada banyak solusi ketika Anda menemukan jalan terbaik dalam lingkungan 2 dimensi yang mengarah dari titik A ke titik B.
Tetapi bagaimana cara menghitung jalur ketika suatu objek berada di titik A, dan ingin menjauh dari titik B, secepat dan sejauh mungkin?
Sedikit informasi latar belakang: Game saya menggunakan lingkungan 2d yang tidak berbasis ubin tetapi memiliki akurasi floating point. Gerakan ini berbasis vektor. Pathfinding dilakukan dengan mempartisi dunia game menjadi empat persegi panjang yang dapat dilalui atau tidak berjalan dan membangun grafik dari sudutnya. Saya sudah memiliki pathfinding antara poin yang bekerja dengan menggunakan algoritma Dijkstras. Kasus penggunaan untuk algoritma pelarian adalah bahwa dalam situasi tertentu, aktor dalam permainan saya harus menganggap aktor lain sebagai bahaya dan melarikan diri darinya.
Solusi sepele adalah dengan hanya memindahkan aktor dalam vektor ke arah yang berlawanan dari ancaman sampai jarak "aman" tercapai atau aktor mencapai dinding di mana ia kemudian menutupi dalam ketakutan.
Masalah dengan pendekatan ini adalah bahwa para aktor akan terhalang oleh hambatan kecil yang dapat dengan mudah mereka lewati. Selama bergerak di sepanjang dinding tidak akan membuat mereka lebih dekat dengan ancaman, mereka bisa melakukan itu, tetapi itu akan terlihat lebih pintar ketika mereka akan menghindari rintangan di tempat pertama:
Masalah lain yang saya lihat adalah dengan jalan buntu pada geometri peta. Dalam beberapa situasi makhluk harus memilih antara jalan yang membuatnya lebih cepat sekarang tetapi berakhir di jalan buntu di mana ia akan terperangkap, atau jalan lain yang berarti bahwa ia tidak akan sejauh itu dari bahaya pada awalnya (atau bahkan sedikit lebih dekat) tetapi di sisi lain akan memiliki hadiah jangka panjang yang jauh lebih besar karena pada akhirnya akan membuat mereka jauh lebih jauh. Jadi reward jangka pendek semakin menjauh cepat harus entah bagaimana dihargai terhadap reward jangka panjang semakin menjauh jauh .
Ada juga masalah peringkat lain untuk situasi di mana seorang aktor harus menerima untuk bergerak lebih dekat ke ancaman kecil untuk menjauh dari ancaman yang jauh lebih besar. Tetapi mengabaikan sama sekali semua ancaman kecil akan menjadi bodoh juga (itu sebabnya aktor dalam grafik ini berusaha menghindari ancaman kecil di area kanan atas):
Apakah ada solusi standar untuk masalah ini?
sumber
Jawaban:
Ini mungkin bukan solusi terbaik, tetapi berhasil bagi saya untuk membuat AI yang melarikan diri untuk game ini .
Langkah 1. Konversikan algoritma Dijkstra Anda menjadi A * . Ini harus sederhana dengan hanya menambahkan heuristik, yang mengukur jarak minimum yang tersisa ke target. Heuristik ini ditambahkan ke jarak yang ditempuh sejauh ini ketika mencetak node. Anda harus melakukan perubahan ini, karena itu akan meningkatkan pencari jalan Anda secara signifikan.
Langkah 2. Buat variasi heuristik, yang alih-alih memperkirakan jarak ke target, ia mengukur jarak dari bahaya dan meniadakan nilai ini. Ini tidak akan pernah mencapai target (karena tidak ada), jadi Anda harus menghentikan pencarian di beberapa titik, mungkin setelah jumlah iterasi tertentu, setelah jarak tertentu tercapai atau ketika semua rute yang mungkin ditangani. Solusi ini secara efektif menciptakan pencari jalan yang menemukan rute pelarian yang optimal dengan batasan yang diberikan.
sumber
Jika Anda benar-benar ingin aktor Anda pintar melarikan diri, hanya pathfinding Dijkstra / A * tidak akan memotongnya. Alasan untuk ini adalah bahwa, untuk menemukan jalan keluar yang optimal dari musuh, aktor juga perlu mempertimbangkan bagaimana musuh akan bergerak dalam pengejaran.
Diagram MS Paint berikut ini harus menggambarkan situasi tertentu di mana hanya dengan menggunakan pathfinding statis untuk memaksimalkan jarak dari musuh akan menghasilkan hasil yang kurang optimal:
Di sini, titik hijau melarikan diri dari titik merah, dan memiliki dua pilihan untuk diambil jalurnya. Menuruni jalur kanan akan memungkinkannya untuk melangkah lebih jauh dari posisi titik merah saat ini , tetapi pada akhirnya akan menjebak titik hijau di jalan buntu. Strategi optimal, sebaliknya, adalah untuk titik hijau untuk terus berjalan di sekitar lingkaran, mencoba untuk tetap berada di sisi yang berlawanan dari titik merah.
Untuk menemukan strategi pelarian yang tepat seperti itu, Anda memerlukan algoritma pencarian permusuhan seperti pencarian minimum atau perbaikannya seperti pemangkasan alpha-beta . Algoritme seperti itu, diterapkan pada skenario di atas dengan kedalaman pencarian yang memadai, akan dengan tepat menyimpulkan bahwa mengambil jalan buntu ke kanan pasti akan mengarah ke penangkapan, sedangkan tetap di lingkaran tidak akan (selama titik hijau dapat berlari lebih cepat dari merah).
Tentu saja, jika ada banyak aktor dari kedua jenis, semua ini perlu merencanakan strategi mereka sendiri - baik secara terpisah atau, jika para aktor bekerja sama, bersama. Strategi mengejar / melarikan diri multi-aktor seperti itu bisa menjadi sangat kompleks; misalnya, salah satu strategi yang memungkinkan bagi aktor yang melarikan diri adalah mencoba mengalihkan perhatian musuh dengan mengarahkannya ke sasaran yang lebih menggoda. Tentu saja, ini akan mempengaruhi strategi optimal dari target lain, dan seterusnya ...
Dalam praktiknya, Anda mungkin tidak akan dapat melakukan pencarian yang sangat mendalam secara real time dengan banyak agen, sehingga Anda harus banyak mengandalkan heuristik. Pilihan heuristik ini kemudian akan menentukan "psikologi" aktor Anda - seberapa pintar mereka bertindak, berapa banyak perhatian yang mereka berikan pada strategi yang berbeda, seberapa kooperatif atau mandiri mereka, dll.
sumber
Anda mendapat pathfinding, sehingga Anda dapat mengurangi masalah untuk memilih tujuan yang baik.
Jika ada tujuan yang benar-benar aman di peta (misalnya pintu keluar yang tidak dapat ditindaklanjuti oleh aktor Anda), pilih satu atau lebih yang terdekat, dan cari tahu mana yang memiliki biaya jalur terendah.
Jika aktor Anda yang melarikan diri memiliki teman-teman yang bersenjata lengkap, atau jika peta tersebut mengandung bahaya yang tidak dapat ia tahan terhadap ancaman tersebut tetapi ancamannya tidak, pilihlah tempat terbuka di dekat teman atau bahaya seperti itu dan temukan jalan ke sana.
Jika aktor Anda yang melarikan diri lebih cepat daripada aktor lain yang mungkin juga tertarik dengan ancamannya, pilih satu titik ke arah aktor lain itu, tetapi di luar itu, dan temukan di titik itu: "Saya tidak perlu berlari lebih cepat daripada beruang itu. , Aku hanya perlu berlari lebih cepat darimu. "
Tanpa kemungkinan untuk melarikan diri, atau membunuh atau mengganggu ancaman, aktor Anda akan hancur, kan? Jadi pilihlah titik sembarang untuk lari, dan jika Anda sampai di sana, dan ancaman masih mengikuti Anda, apa-apaan: berbalik dan bertarung.
sumber
Karena menentukan posisi target yang tepat mungkin sulit dalam banyak situasi, pendekatan berikut berdasarkan pada kisi-kisi hunian 2D mungkin perlu dipertimbangkan. Ini biasanya disebut sebagai "iterasi nilai", dan dikombinasikan dengan gradient-descent / ascent, memberikan algoritma perencanaan jalur yang sederhana dan cukup efisien (tergantung pada implementasi). Karena kesederhanaannya, ini terkenal dalam robotika seluler, khususnya untuk navigasi "robot sederhana" di lingkungan dalam ruangan. Seperti tersirat di atas, pendekatan ini menyediakan sarana untuk menemukan jalan dari posisi awal tanpa secara eksplisit menentukan posisi target sebagai berikut. Perhatikan bahwa posisi target dapat secara opsional ditentukan, jika tersedia. Juga, pendekatan / algoritme merupakan pencarian pertama yang luas,
Dalam kasus biner, peta kisi hunian 2D adalah satu untuk kisi-kisi sel yang diduduki dan nol di tempat lain. Perhatikan bahwa nilai hunian ini juga dapat berkelanjutan dalam kisaran [0,1], saya akan kembali ke yang di bawah ini. Nilai sel grid g i yang diberikan adalah V (g i ) .
Versi Dasar
Catatan pada Langkah 4.
Ekstensi dan Komentar Lebih Lanjut
Pembaruan-persamaan V (g j ) = V (g i ) +1 menyisakan banyak ruang untuk menerapkan semua jenis heuristik tambahan dengan menurunkan skala V (g j )atau komponen tambahan untuk mengurangi nilai opsi jalur tertentu. Sebagian besar, jika tidak semua, modifikasi tersebut dapat dengan baik dan umum digabungkan menggunakan peta-kotak dengan nilai kontinu dari [0,1], yang secara efektif merupakan langkah pra-pemrosesan dari peta-peta biner awal. Misalnya, menambahkan transisi dari 1 ke 0 di sepanjang batas hambatan, menyebabkan "aktor" lebih baik tetap bersih dari hambatan. Peta kisi seperti itu, misalnya, dapat dihasilkan dari versi biner dengan mengaburkan, pelebaran berbobot, atau serupa. Menambahkan ancaman dan musuh sebagai rintangan dengan radius kabur yang besar, menghukum jalur yang mendekati ini. Kita juga dapat menggunakan proses difusi pada keseluruhan peta-grid seperti ini:
V (g j ) = (1 / (N + 1)) × [V (g j ) + jumlah (V (g i ))]
di mana " penjumlahan " mengacu pada penjumlahan dari semua sel-sel grid yang berdekatan. Sebagai contoh, alih-alih membuat peta biner, nilai awal (integer) bisa proporsional dengan besarnya ancaman, dan hambatan menghadirkan ancaman "kecil". Setelah menerapkan proses difusi, nilai grid harus / harus diskalakan ke [0,1], dan sel-sel yang ditempati oleh hambatan, ancaman, dan musuh harus ditetapkan / dipaksa ke 1. Jika tidak, penskalaan dalam persamaan pembaruan dapat tidak berfungsi seperti yang diinginkan.
Ada banyak variasi dalam skema / pendekatan umum ini. Rintangan, dll. Bisa memiliki nilai kecil, sedangkan sel-sel jaringan bebas memiliki nilai besar, yang mungkin memerlukan penurunan gradien pada langkah terakhir tergantung pada tujuannya. Bagaimanapun, pendekatannya adalah, IMHO, sangat fleksibel, cukup mudah diimplementasikan, dan berpotensi agak cepat (tergantung pada ukuran / resolusi kisi-peta). Akhirnya, seperti halnya banyak algoritma perencanaan jalan yang tidak menganggap posisi target tertentu, ada risiko yang jelas terjebak dalam jalan buntu. Sampai taraf tertentu, dimungkinkan untuk menerapkan langkah-langkah pasca-pemrosesan khusus sebelum langkah terakhir untuk mengurangi risiko ini.
Berikut ini deskripsi singkat lainnya dengan ilustrasi di Java-Script (?), Meskipun ilustrasinya tidak berfungsi dengan browser saya :(
http://www.cs.ubc.ca/~poole/demos/mdp/vi.html
Banyak detail lebih lanjut tentang perencanaan dapat ditemukan dalam buku berikut. Iterasi nilai secara khusus dibahas dalam Bab 2, Bagian 2.3.1 Rencana Panjang Tetap Optimal.
http://planning.cs.uiuc.edu/
Semoga itu bisa membantu, salam hormat, Derik.
sumber
Bagaimana dengan berfokus pada predator? Mari kita hanya raycast 360 derajat pada posisi Predator, dengan kepadatan yang sesuai. Dan kita dapat memiliki sampel perlindungan. Dan pilih tempat perlindungan terbaik.
sumber
Salah satu pendekatan yang mereka miliki di Star Trek Online untuk kawanan hewan adalah dengan memilih arah terbuka dan menuju ke sana, cepat, de-pemijahan hewan setelah jarak tertentu. Tapi itu sebagian besar animasi de-spawn dimuliakan untuk kawanan Anda seharusnya menakut-nakuti dari menyerang Anda, dan tidak cocok untuk gerombolan pertempuran yang sebenarnya.
sumber