Як змусити агенти A * уникати інших агентів?


19

Я реалізую багатоагентний алгоритм A * на карті плитки. Агенти рухаються лише по осях X і Y. Я уникаю зіткнень між ними, перевіряючи, де інші під час обчислення шляхів.

Це добре працює, за винятком ситуації, коли агентам доводиться пропускати одну і ту ж плитку з різних напрямків. У таких ситуаціях оптимальним рішенням було б один агент чекати, коли інший пройде:

Зразок ситуації

Крім того, якщо немає північного коридору, то проходження маршруту не вдається.

Як я міг реалізувати такий алгоритм?


2
Відповіді на те, як побудувати "AI трафіку"? тут актуальні.
Анко

Кілька коментарів 1) Я думаю, що я не один, вважаючи на 100% нормальним, що двоє ворогів можуть якось перекриватися при перетині. Тільки якщо ви виберете дуже реалістичний стиль, який був би дивним, але з іншого боку це нормально із Zelda. 2) Ви можете розглянути можливість дозволити шлях з роздільною здатністю карти (* 2, * 2), тож два вороги можуть перетинати шлях на 1 одиницю. 3) Ви також можете розробити свої карти, щоб завжди було доступно кілька шляхів (можливо, цікаве обмеження, хто знає? :-)).
GameAlchemist

Відповіді:


18

Ви можете почати, не допускаючи прокладання маршруту. У разі невдачі виберіть випадковий час у майбутньому, щоб повторно спробувати маршрутизацію. Деякі протоколи мережевого протоколу низького рівня працюють таким чином , і це досить добре. Що вам потрібно зробити, це створити контури один за одним і позначити як використані всі плитки, через які пройде агент. Якщо подальші шляхи не зможуть перезапустити випадковий таймер, це допоможе розширити пошук нових шляхів та розбити помилки циклічного циклу.

Другу частину вашої проблеми можна вирішити, повернувши два шляхи. Перший шлях - це регулярне повернення, навіть якщо воно не виходить з блоку. Другий шлях - це шлях, який повністю ігнорує всіх агентів. Потім ви можете скористатися знаннями, отриманими з цих двох шляхів, щоб вирішити, чи краще буде чекати чи пройти довгий шлях. Евристика для цього рішення потребує певної роботи, але краще, ніж взагалі нічого не намагатися.

У дуже поганому випадку, коли ваші агенти сильно заблоковані коридорами на одній ширині, як це, можливо, вам доведеться додати безпечні місця, щоб стояти там, де агенти можуть швидко пройти і чекати, коли відкриється їхній реальний шлях (тому агент не робить просто зачекайте і перекрийте коридор).


19

Замість того, щоб вирішити свою проблему, ось спосіб взяти лимони і зробити лимонад.

Багато років тому мій друг працював над дуже відомим FPS, який мав саме проблему, яку ви описуєте: обмежена область мала б кількість символів AI, які мали певні бажані позиції, і алгоритм пошуку шляхів постійно їх натикав один в одного. Зокрема, гравець, скажімо, кинув гранату в маленьку кімнату, повну ворогів, і символи AI в цьому районі намагалися б бігти до свого виходу, але набігали один на одного і в кінцевому підсумку зупинялися, обертаючись, вдарити когось іншого, розвернутися тощо. Це виглядає дуже нереально.

Не вдалося спробувати створити кращий алгоритм простеження маршруту, який міг би успішно працювати за умови жорсткого обчислювального бюджету. Тож замість вирішення проблеми проходження маршрутів мій друг додав дуже дешевий чек до ШІ: якщо AI двічі за короткий проміжок часу наткнувся на інший ШІ, перестаньте намагатися знайти вихід і замість цього зайняйтеся прикриттям. Отож, що трапляється - ПК розбирає гранату і бачить купу ворогів, що біжать за виходами. Ті, хто вдарив один про одного, обертаються, і, схоже, вони розуміють, що вони не можуть вийти, тому вони пригнулися і прикривають голову перед тим, як підірватись. Це як реалістично виглядає, так і дуже задовольняє гравця.

Чи є якийсь подібний спосіб ви можете перетворити недолік вашого алгоритму, що створює зіткнення, і перетворити його на перевагу?


1
+1 Мені це подобається, це підривно і повністю функціонально =)
Патрік Хьюз

3

Зазвичай мені найкраще розширити шлях * до інших форм пошуку шляху для інших локалізованих сценаріїв; уникання одиниць, як правило, є одним із них, особливо в світі, де одночасно рухаються декілька агентів і створюються таким чином динамічні блокатори).

Як правило, для цього може працювати техніка, що слідує за краєм. Коли ви стежите за маршрутом, наштовхуєтесь на блокатор, який не був частиною початкового обчислення контуру, ви в основному вибираєте напрямок (за годинниковою або проти годинникової стрілки) і намагаєтеся перейти блокатор, об'їжджаючи його в тому напрямку. Якщо ви не можете, ви чекаєте, коли блокатор вирішиться сам (хоча це може призвести до тупикової ситуації).

Ви також можете реалізувати можливість підрозділів здійснювати спільний шлях; тобто підрозділ може попросити інший блок трохи відсунутись убік, щоб він міг «стиснути повз» блокуючий блок. Це не добре працює в грі на основі плитки, де ви обмежені рухом на основі плитки, оскільки ви все ще можете зайти в тупик в коридорах однієї ширини, як ваш приклад. У такому випадку ви можете передбачити, щоб підрозділи просили будь-який інший "переключити місця", що призводить до вирішення більшості часу. Іноді це призводить до того, що підрозділи стрибають одне інше.

"Уникнення одиниць" є досить поширеною темою, коли обговорюють проходження маршрутів в іграх, для цього є безліч хітів. Зокрема, ви можете ознайомитись із цим питанням на шляху пошуку потоку «поле потоку», який використовується у верховному командувачі 2. РТС, як правило, дуже багато стикаються з цією проблемою і вирішують її всілякими цікавими способами.


Саме це - мабуть, існує дуже поширене уявлення про те, що прокладання маршрутів означає A *, а це просто не так.
Стівен Стадницький

2

Якщо у вас є система руху на основі покрокових / галочок, ви могли б створити 3D графік, де кожен перехід переміщує агент на те, як карта виглядатиме в майбутньому. Тоді дозвольте кожному агенту заявити про плитки, на яких він буде в майбутньому, і позначте їх як недоступні. Кожен агент тоді має додатковий варіант "підключення" до наступного галочки як третій спосіб переходу через графік. Це буде складніше у вашій системі, але має дати кращі результати, ніж випадкове очікування. Ще краще, якщо ви дозволите двом агентам спілкуватися з bt, маючи один з них надіслати повідомлення "Я хочу передати вас", якщо через цей агент проходить найкоротший шлях,


ось документ, який розповідає про той куб часу: www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/… і ось реалізація: allseeing-i.com/ASIPathFinder
Rage

0

Використовуючи алгоритм типу A *, ви маєте найбільшу широту в роботі з евристикою витрат.

У цьому конкретному випадку ви можете скоригувати евристику, щоб збільшити вартість рухів, які беруть агент, близький до іншого агента, проблема там, що ви, ймовірно, в кінцевому підсумку з обома спробами взяти верхній маршрут, і ви могли б закінчитися, коли вони коливаються назад і вперед між стежками, коли вони закриваються один на одного, залежно від точного часу.

Інша можливість - відстежувати маршрути агентів за призначенням та коригувати витрати вгору за іншими передбаченими агентами шляхами. Це ефективно дозволяє агентам в обмеженій мірі координувати один одного. Основна проблема тут полягає в тому, що якщо всі маршрути заблоковані, пошук шляхів може залишатися невдалим для того, який із останніх переміщень агента буде останнім.

У випадку, коли існує лише один шлях, пошук шляхів або провалиться, або вони просуваються один до одного, поки вони не заткнуться.

Якщо жодна з цих ситуацій не є достатньо хорошою, тоді вам слід почати відстежувати час і підрахувати свою вартість. Вартість другого агента повинна бути стільки часу, скільки потрібно першому агенту, щоб зрозуміти, плюс нормальна вартість проходу, таким чином ваш агент міг би правильно визначити, коли чекати, а не піти на інший шлях.

Приведення термінів у відповідність може бути значно більшим зусиллям, тому більшість людей погоджуються на коригування рівня рівня та вартості, поки речі не стануть достатньо хорошими.


0

Зазвичай я б радив вам використовувати поведінку керма, щоб вирішити подібні проблеми під час слідування шляху. І ви все одно можете зайняти багато, щоб отримати натхнення для групування поведінки. Але, на жаль, насправді це не стосується простого руху на основі плитки.

Оскільки у вас вже є робоче уникнення зіткнень у більшості ситуацій, давайте зосередитись саме на цьому. Я здогадуюсь, що ви здійснюєте повторний пошук кожного разу, коли агент хоче рухатись, інакше я не бачу, як вони реагують на інших, що рухаються під час руху. По-друге, я здогадуюсь, ці агенти доброзичливі один до одного.

Ви пропонуєте одному агенту чекати іншого, і я б порадив вам зробити саме це. Дайте агентам доступ до шляхів інших, шукайте першу плитку власного шляху, яка не є частиною іншого шляху, і вирушайте туди. Проблемами з цією технікою можуть бути:

  1. Як ви вирішите, чи є інший прийнятний шлях навколо іншого агента чи ні? Ви не хочете чекати іншого агента, якщо є достатньо місця, щоб обійти його. Невдача проходження маршруту при розгляді іншого агента - це явна ознака ситуації, яку ви хочете виправити, але в прикладі, який ви підсумували, звичайно не відбудеться збій. Але ви можете - з невеликим розрахунком - вирішити, чи дає вам альтернативний шлях A * просто обхід іншого агента невеликим колом або використовує зовсім інший шлях, як північний коридор.

  2. Я не знаю, наскільки далеко може проїхати агент під час одного раунду / операції, але якщо це недостатньо далеко, або якщо всі агенти рухаються паралельно, обидва агенти вирішили би почекати на іншому кінці шляху. Це можна виправити, повідомивши іншому агенту, що ви звільняєте його шлях.


0

Одним із можливих рішень було б відключити зіткнення одиниць у таких жорстких місцях.

Наприклад, у грі Starcraft, робітники (SCV, зонди, дрони) не стикаються між собою під час видобутку кристалів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.