Алгоритми пошуку шляху?


24

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

Які алгоритми пошуку шляхів використовуються в іграх усіх типів? (У будь-якому випадку, в якому герої рухаються персонажі) Чи Дікстра застосовується багато? Я б подумав, що ні, оскільки це насправді не простежує кроки, які потрібно зробити, щоб кудись дійти, правда? Якщо я правильно це розумію, він визначає лише, який об’єкт є найближчим. Я не дуже хочу щось кодувати; просто роблю деякі дослідження, хоча якщо вставити псевдокод чи щось таке, це було б добре (я можу зрозуміти Java та C ++). Я в основному шукаю швидкий огляд пошуку шляху в цілому.

Я знаю, що A * - це як алгоритм використання в 2D іграх. Це чудово і все, але як бути з 2D іграми, які не мають сітки? Такі речі, як епоха імперій або пробудження Лінка. Немає чітких квадратних пробілів, до яких можна перейти, і що вони роблять?

Що роблять 3D-ігри? Я прочитав цю штучку http://www.ai-blog.net/archives/000152.html , яку, як я чую, є великим авторитетом у цьому питанні, але це не дуже пояснює ЯК ЯК, коли сітки встановлені, пошук шляху здійснюється. ЯКЩО A * - це те, що вони використовують, то як щось подібне робиться в 3D-середовищі? І як саме працюють шпонки для закруглення кутів?


2
Я думаю, що це запитання є надто відкритим для формату запиту і відповіді SE. FAQ
Джон Макдональд,

1
Ігри, про які ви згадали, повинні так чи інакше розбити карту на вузли для A *. Цей процес розбиття не повинен включати сітки квадратів, і є багато способів зробити це. Перевірте цей vid youtube.com/watch?v=nGC_kBCoHYc , хороша гра робить це так, що гравці не можуть сказати, що вони насправді роблять за лаштунками.
XiaoChuan Yu

1
Тут виникає багато запитань, тому я не можу реально написати відповідь, але зазначу, що Дейкстра повертає шлях, і більшість алгоритмів трафіку є багатоцільовими. Ви конвертуєте свій світ, 2D або 3D, у підключений графік і запускаєте на ньому алгоритм прокладання маршруту.
Григорій Евері-Вейр


1
Дозвольте мені відірватися. Це запитання отримало 4 відгуки щодо ПП порівняно з 4 закритими голосами на GDSE. Не можу не відчути, що модератори на цьому сайті надто агресивні. Звичайно, я бачу, як це питання суперечить вказівкам, зазначеним у FAQ, але цитуючи, ці вказівки існують для того, щоб запобігти diminishing the usefulness of our site. Це питання вже було вподобане 3 рази, що є доказом того, що воно було корисним для деяких користувачів. Тож я не можу не відчути, що голосування про його закриття та ризикування можливим відстороненням є набагато контрпродуктивнішим.
Девід Гувейя

Відповіді:


62

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


Частина 1 - Алгоритми контурного контуру

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

  • Примітивні методи, які не «дивляться вперед» і роблять крок за часом:

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

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

  • Методи, які заздалегідь можуть знайти весь шлях одразу:

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

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

    • Найкращий перший пошук - подібний до першого пошуку в ширині, але використовує евристику, яка спочатку вибирає найперспективнішого сусіда. Повернутий шлях може виявитися не найкоротшим, але швидше пробігти, ніж перший пошук. A * - це тип найкращого першого пошуку.

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

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

  • Тоді існують варіанти A * (або оптимізації контурних маршрутів в цілому), які роблять його швидшим або більш адаптованим до певних ланцюжків, наприклад (див. Відповідні відповіді та вичерпний список на cstheory.SE ):

    • LPA * - Подібно до A *, але може швидше перерахувати найкращий шлях, коли буде зроблено невелику зміну графіка
    • D * Lite - на основі LPA * - це те ж саме, але припускає, що "початкова точка" - це одиниця, що рухається до фінішу під час зміни графіків
    • HPA * (Ієрархічна) - Використовує кілька шарів на різних рівнях абстракції для прискорення пошуку. Наприклад, шар вищого рівня може просто з'єднувати кімнати, тоді як шар нижчого рівня піклується про уникнення перешкод.
    • IDA * (Iterative Deepening) - зменшує використання пам'яті порівняно з звичайним A * за допомогою ітеративного поглиблення.
    • SMA * (спрощена межами пам'яті ) - використовує лише наявну пам'ять для пошуку.
    • Пошук Jump Point - кредити Еріку в коментарях за його згадування! Швидкість пошуку маршрутів на однакових затратах сітчастих картах ( посилання ).

Частина 2 - Представлення простору пошуку

І наостанок вирішити це питання:

Я знаю, що A * - це як алгоритм використання в 2D іграх. Це чудово і все, але як бути з 2D іграми, які не мають сітки?

Тут є дві великі помилки! Фактично:

  1. * Не байдуже, чи гра 2D або 3D, і однаково підходить для обох випадків.
  2. A * працює під будь-яким графічним поданням, тож не байдуже, чи світ є сіткою чи ні.

Тож якщо світові не потрібно бути сіткою, якими іншими способами ви можете їх представляти? Ось короткий огляд способів розділення світового простору для проходження маршруту, і більшість із них працює як для 2D, так і для 3D:

  • Прямокутна сітка - Світ розділів на звичайну сітку квадратів, при цьому кожна комірка в сітці є одним вузлом на графіку, а з'єднання між двома безперешкодними вузлами - це край.

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

  • Квадрат - Ще один спосіб розділити простір, але замість того, щоб розділити в сітку комірок звичайного розміру, розділіть їх на чотири, а потім рекурсивно розділити кожну з них на чотири знову. Додавання третього виміру робить його octree .

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

  • Опуклі багатокутники - Розбиття області прогулянки на сітку з’єднаних між собою опуклих багатокутників. Кожен многокутник стає вузлом, а спільні ребра - ребрами графіка. Наприклад, це можуть бути трикутники, а іноді навіть сітка, створена художником під час створення активів рівня. Часто його називають навігаційною сіткою . Дивіться це посилання . Ось дуже популярний набір інструментів для побудови навігаційної сітки: Переробіток .

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

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

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


1
Дві посилання: 1) Мікко Мононен зробив роботу з пошуку шляху Killzone 3 , і у нього є дуже приємний блог, де він документує процес розробки Recast (navmesh generator) і Detour (набір інструментів для пошуку шляхів), як під ліцензією MIT, так і використовується, наприклад у Королівствах Амалура: Розрахунок . 2) Пошук точки стрибків , я думаю, є однією з найбільших останніх розробок у пошуку маршрутів на основі сітки.
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.