Шлях для втечі


61

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

Але як я обчислюю шлях, коли об’єкт знаходиться в точці А, і хоче відійти від точки В, якнайшвидше і далі?

Трохи довідкової інформації: У моїй грі використовується середовище 2d, яке не засноване на плитці, але має точність з плаваючою комою. Рух вектором. Набір контурів здійснюється шляхом розподілу ігрового світу на прямокутники, які є прохідними або нерозгортаними, та побудову графіка з їх кутів. У мене вже є пошук маршрутів між точками, що працюють за допомогою алгоритму Dijkstras. Приклад використання алгоритму втікання полягає в тому, що в певних ситуаціях актори моєї гри повинні сприймати іншого актора як небезпеку і тікати від нього.

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

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

введіть тут опис зображення

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

введіть тут опис зображення

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

введіть тут опис зображення

Чи є стандартні рішення цієї проблеми?


8
+1 Відмінне запитання із чудовою візуальністю. Це дійсно дає зрозуміти питання.
MichaelHouse

Відповіді:


24

Це може бути не найкращим рішенням, але для мене це створило біг AI для цієї гри .

Крок 1. Перетворіть алгоритм Dijkstra в A * . Це повинно бути простим, просто додавши евристику, яка вимірює мінімальну відстань до мети. Це евристичне значення додається до пройденої відстані при оцінці вузла. Вам слід все-таки внести цю зміну, оскільки це значно підвищить пошук вашого шляху.

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


1
Зауважте, що просто використання чогось типу прямої відстані від небезпеки як евристичного на кроці 2, як правило, не дасть допустимої евристики. Звичайно, це не означає, що ви не можете спробувати використовувати його в будь-якому випадку, але це може не генерувати оптимальні шляхи втечі. Щоб отримати фактично допустиму евристику для цього "зворотного A *", я думаю, вам знадобиться використовувати звичайний A * / Dijkstra, щоб обчислити фактичну відстань кожного квадрата від небезпеки.
Ільмарі Каронен

+1 Я думаю, що це найкращий удар для вашого долара, наскільки зусилля до результатів.
MichaelHouse

33

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

Наведена нижче діаграма MS Paint повинна ілюструвати конкретну ситуацію, коли використання лише статичного наведення маршруту для максимального відстані від супротивника призведе до неоптимального результату:

Діаграма актора, який рятується від ворога в лабіринті у формі П

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

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

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

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


7

У вас є обробка маршруту, тому ви можете зменшити проблему вибору хорошого пункту призначення.

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

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

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

Без можливості втечі, вбивства чи відволікання загрози ваш актор приречений, правда? Тож виберіть довільну точку, до якої слід бігти, і якщо ви туди потрапите, і загроза все ще стежить за вами, що за чорт: поверніться і воюйте.


7

Оскільки визначення відповідної цільової позиції може бути складним у багатьох ситуаціях, наступний підхід, заснований на двовимірних картах заповнення сітки, може бути вартим розгляду. Його зазвичай називають "ітерацією величини", а в поєднанні з градієнтним спуском / підйомом дає простий і досить ефективний (залежно від реалізації) алгоритм планування шляху. Завдяки своїй простоті він добре відомий в мобільній робототехніці, зокрема для «простих роботів», що пересуваються в приміщенні. Як випливало з цього вище, цей підхід забезпечує засіб знаходження шляху від вихідної позиції без чіткого конкретизації цільової позиції наступним чином. Зауважте, що цільове положення може бути необов’язково вказано, якщо воно є. Крім того, підхід / алгоритм являє собою пошук в першу чергу,

У двійковому випадку 2D-карта заповнення сітки - це одна для зайнятих комірок сітки та нуль в інших місцях. Зауважте, що ця величина зайнятості також може бути безперервною у діапазоні [0,1], я повернусь до цього нижче. Значення заданої комірки сітки g i - V (g i ) .

Основна версія

  1. Якщо припустити, що комірка сітки g 0 містить початкове положення. Встановіть V (g 0 ) = 0 і поставте g 0 у чергу FIFO.
  2. З черги візьміть наступну клітинку сітки g i .
  3. Для всіх сусідів g j of g i :
    • Якщо g j не зайнятий і раніше його не відвідували:
      • V (g j ) = V (g i ) +1
      • Позначити g j як відвідане.
      • Додайте g j у чергу FIFO.
  4. Якщо заданий поріг відстані ще не досягнуто, продовжте з (2.), інакше продовжте з (5.).
  5. Шлях отримують, слідуючи найкрутішому градієнтному підйому, починаючи з g 0 .

Примітки до кроку 4.

  • Як зазначено вище, крок (4.) вимагає відстежувати максимальну пройдену відстань, яка була опущена у вищеописаному описі з міркувань чіткості / стислості.
  • Якщо вказана цільова позиція, ітерація припиняється, як тільки цільова позиція досягається, тобто обробляється / відвідується як частина кроку (3.).
  • Звичайно, можна також просто обробити всю сітку-карту, тобто продовжити, поки всі (вільні) сітки-комірки не будуть оброблені / відвідані. Обмежуючим фактором, очевидно, є розмір карти сітки в поєднанні з її роздільною здатністю.

Розширення та подальші коментарі

Рівняння оновлення V (g j ) = V (g i ) +1 залишає достатньо місця для застосування всіх видів додаткової евристики шляхом зменшення масштабу V (g j )або компонент добавки, щоб зменшити значення для певних варіантів шляху. Більшість, якщо не всі, такі модифікації можна красиво та загально включити, використовуючи сітку-карту з постійними значеннями [0,1], що фактично є етапом попередньої обробки початкової, двійкової сітки-карти. Наприклад, додавання переходу від 1 до 0 уздовж меж перешкод змушує "актора" бажано залишатися чистою від перешкод. Така сітка-карта може, наприклад, формуватися з двійкової версії шляхом розмивання, зваженого розширення тощо. Додаючи загрози та ворогів як перешкоди з великим розмитим радіусом, карає шляхи, що наближаються до цих. Можна також використовувати дифузійний процес на загальній карті сітки таким чином:

V (g j ) = (1 / (N + 1)) × [V (g j ) + сума (V (g i ))]

де " сума " позначає суму по всіх сусідніх осередках сітки. Наприклад, замість створення бінарної карти початкові (цілочисельні) значення можуть бути пропорційними величині загроз, а перешкоди представляють "малі" загрози. Після застосування процесу дифузії значення сітки повинні / повинні бути змінені до [0,1], а осередки, зайняті перешкодами, загрозами та ворогами, повинні бути встановлені / примусові до 1. Інакше масштабування в рівнянні оновлення може не працювати за бажанням.

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

Ось ще один короткий опис із ілюстрацією в Java-Script (?), Хоча ілюстрація не працювала з моїм браузером :(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

Детальніше про планування можна знайти в наступній книзі. Ітерація значення конкретно обговорюється в розділі 2.3.1. Оптимальні плани з фіксованою довжиною.

http://planning.cs.uiuc.edu/

Сподіваюся, що допомагає, з повагою, Деріку.


3

Як щодо фокусування на хижаках? Давайте просто випромінюємо 360 градусів на положення Хижака з відповідною щільністю. І ми можемо мати зразки притулку. І вибирайте найкраще притулок.

випадок 1

випадок 2


0

Один із підходів у Star Trek Online для стада тварин - це просто вибрати відкритий напрямок і попрямувати в цьому, швидкому, нерестові тварини після певної відстані. Але це здебільшого прославлена ​​анімаційна анімація для стада, яку ви повинні відлякати від нападу на вас, і не підходить для фактичних бойових натовпів.

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