Algoritmi di ricerca del percorso?


24

Ho pubblicato prima questa domanda sullo stack di overflow, ma immagino che nessuno sia molto interessato ai videogiochi lì ...

Quali sono alcuni algoritmi di ricerca del percorso utilizzati nei giochi di tutti i tipi? (Di tutti i tipi in cui i personaggi si muovono, comunque) Dijkstra è molto usato? Penserei di no, poiché in realtà non traccia i passi da fare per arrivare da qualche parte, giusto? Se lo capisco bene, determina solo quale oggetto è il più vicino. Non sto davvero cercando di codificare nulla; fare solo qualche ricerca, anche se incollare pseudocodice o qualcosa del genere, andrebbe bene (posso capire Java e C ++). Sto fondamentalmente cercando una rapida panoramica della ricerca del percorso in generale.

So che A * è come l'algoritmo da usare nei giochi 2D. È fantastico e tutto, ma per quanto riguarda i giochi 2D che non sono basati su griglia? Cose come Age of Empires o Link's Awakening. Non ci sono spazi quadrati distinti su cui navigare, quindi cosa fanno?

Cosa fanno i giochi 3D? Ho letto questa cosa http://www.ai-blog.net/archives/000152.html , che sento essere una grande autorità in materia, ma non spiega davvero COME, una volta impostate le maglie, la ricerca del percorso è terminata. SE A * è quello che usano, allora come viene fatto qualcosa del genere in un ambiente 3D? E come funzionano esattamente le spline per arrotondare gli angoli?


2
Penso che questa domanda sia troppo aperta per il formato di domande e risposte di SE. FAQ
John McDonald

1
I giochi che hai citato devono suddividere la mappa in nodi per A * in un modo o nell'altro. Quel processo di suddivisione non deve comportare la griglia dei quadrati e ci sono molti modi per farlo. Controlla questo video su youtube.com/watch?v=nGC_kBCoHYc , un buon gioco fa in modo che i giocatori non possano dire cosa stanno effettivamente facendo dietro le quinte.
XiaoChuan Yu,

1
Ci sono molte domande qui, quindi non posso davvero scrivere una risposta, ma noterò che Dijkstra restituisce un percorso e la maggior parte degli algoritmi di pathfinding sono multiuso. Converti il ​​tuo mondo, 2D o 3D, in un grafico collegato ed esegui un algoritmo di pathfinding su di esso.
Gregory Avery-Weir,

Solo per riferimento: ho risposto alla domanda su Stack Overflow .
Julian,

1
Mi permetta di rantolare. Questa domanda ha ottenuto 4 voti positivi su SO, rispetto a 4 voti stretti qui su GDSE. Non posso fare a meno di pensare che i moderatori su questo sito siano eccessivamente aggressivi. Certo, posso vedere come la domanda va contro le linee guida specificate nelle FAQ, ma citando, tali linee guida sono in atto al fine di evitare diminishing the usefulness of our site. Questa domanda è già stata preferita 3 volte, il che prova che è stata utile per alcuni utenti. Quindi non posso fare a meno di pensare che votare per chiuderlo e rischiare un'eventuale rimozione sia molto più controproducente.
David Gouveia,

Risposte:


62

Troppe domande contemporaneamente, quindi è difficile dare una risposta concreta ma discutere alcuni di questi argomenti. Dividerò la risposta in due e cercherò di affrontarla nel miglior modo possibile. Non pretendo che nessuna di queste liste sia completa , ma sono alcuni dei diversi metodi che potrei ricordare.


Parte 1 - Pathfinding Algorithms

Per cominciare, ci sono molti modi per implementare l'individuazione del percorso, ma non tutti restituiscono il percorso più breve o sono efficienti o addirittura affidabili. Per esempio:

  • Metodi primitivi che non "guardano avanti" e fanno un passo alla volta:

    • Backstepping casuale: fai un passo alla volta nella direzione dell'obiettivo. Se si incontra un ostacolo, provare a aggirarlo facendo un passo indietro in una direzione casuale e poi riprovando. Non è affatto affidabile e rimarrà bloccato in una moltitudine di situazioni.

    • Tracciamento degli ostacoli - Un altro approccio, simile al backstepping casuale ma invece di spostarsi indietro casualmente, inizia a tracciare intorno all'oggetto una volta trovata una collisione, come se avessi la mano destra attaccata al muro e dovessi muoverti toccandolo. Quando non ci sono collisioni, continua a muoverti nella direzione dell'obiettivo. Ancora una volta può rimanere bloccato in molte situazioni.

  • Metodi che guardano avanti per trovare l'intero percorso in una volta:

    • Ampia prima ricerca - Attraversamento grafico semplice visitando ogni strato di bambini alla volta, fermati quando viene trovato il percorso. Se il grafico non è ponderato (ovvero la distanza tra ciascun nodo adiacente è sempre la stessa) trova il percorso più breve anche se non in modo troppo efficiente. Per i grafici ponderati potrebbe non restituire il percorso più breve, ma ne troverà sempre uno se esiste.

    • Profondità prima ricerca - Un altro modo per attraversare un grafico, ma invece di portarlo strato per strato, l'algoritmo tenta di cercare prima in profondità nel grafico. Questo metodo può avere problemi se la profondità della ricerca non è limitata, specialmente quando si utilizza un'implementazione ricorsiva, che può portare a un overflow dello stack, quindi di solito è più sicuro implementarlo iterativamente usando uno stack.

    • Migliore prima ricerca - Simile alla prima ricerca di Breadth ma utilizza un'euristica che sceglie prima il vicino più promettente. Il percorso restituito potrebbe non essere il più breve, ma è più veloce da eseguire rispetto all'ampiezza della prima ricerca. A * è un tipo di migliore prima ricerca.

    • Metodo di Dijkstra : tiene traccia del costo totale dall'inizio per ogni nodo visitato e lo utilizza per determinare l'ordine migliore per attraversare il grafico. Funziona con grafici ponderati e restituisce il percorso più breve, ma potrebbe richiedere molte ricerche.

    • A * - Simile a Dijkstra ma utilizza anche un'euristica per stimare la probabilità che ciascun nodo sia vicino all'obiettivo, al fine di prendere la decisione migliore. A causa di questa euristica, A * trova il percorso più breve in un grafico ponderato in modo molto più tempestivo.

  • Quindi ci sono variazioni di A * (o ottimizzazioni di pathfinding in generale) che lo rendono più veloce o più adattato a determinate circostanze, come (vedi risposta correlata e un elenco completo su cstheory.SE ):

    • LPA * - Simile ad A * ma può ricalcolare più rapidamente il percorso migliore quando viene apportata una piccola modifica al grafico
    • D * Lite - Basato su LPA *, fa la stessa cosa, ma presuppone che il "punto iniziale" sia un'unità che si sposta verso la fine mentre vengono apportate modifiche al grafico
    • HPA * (gerarchico) : utilizza diversi livelli a diversi livelli di astrazione per accelerare la ricerca. Ad esempio, uno strato di livello superiore può semplicemente collegare le stanze, mentre uno di livello inferiore si occupa di evitare gli ostacoli.
    • IDA * (Approfondimento iterativo) - Riduce l'utilizzo della memoria rispetto al normale A * utilizzando l'approfondimento iterativo.
    • SMA * (memoria semplificata) : utilizza solo la memoria disponibile per eseguire la ricerca.
    • Jump Point Search - Ringraziamenti a Eric nei commenti per averlo menzionato! Accelera l'individuazione dei percorsi su mappe della griglia a costo uniforme ( link ).

Parte 2 - Ricerca nello spazio di rappresentazione

E infine per rispondere a questa domanda:

So che A * è come l'algoritmo da usare nei giochi 2D. È fantastico e tutto, ma per quanto riguarda i giochi 2D che non sono basati su griglia?

Due grandi idee sbagliate qui! Infatti:

  1. A * non importa se il gioco è 2D o 3D ed è ugualmente appropriato per entrambi i casi.
  2. Un * funziona sotto qualsiasi rappresentazione grafica, quindi non importa se il mondo è una griglia o no.

Quindi se il mondo non ha bisogno di essere una griglia, in quali altri modi puoi rappresentarlo? Ecco una breve panoramica dei modi per partizionare lo spazio mondiale per l'individuazione dei percorsi, e la maggior parte di questi funzionano sia per il 2D che per il 3D:

  • Griglia rettangolare - Suddividi il mondo in una griglia regolare di quadrati con ogni cella nella griglia che rappresenta un nodo nel grafico e la connessione tra due nodi non ostruiti è un bordo.

    inserisci qui la descrizione dell'immagine

  • Quadtree - Un altro modo per partizionare lo spazio, ma invece di partizionare in una griglia di celle di dimensioni regolari, partizionare in quattro, quindi dividere ricorsivamente ciascuno di questi in quattro. L'aggiunta di una terza dimensione la rende un ottetto .

    inserisci qui la descrizione dell'immagine

  • Poligoni convessi - Suddivisione dell'area percorribile in una rete di poligoni convessi interconnessi. Ogni poligono diventa un nodo e i bordi condivisi sono i bordi del grafico. Questi possono essere triangoli per esempio, e talvolta possono anche essere una mesh creata da un artista durante la creazione delle risorse di livello. Spesso definito mesh di navigazione . Vedere questo collegamento . Ecco un set di strumenti per la costruzione di mesh di navigazione molto popolare: rifusione .

    inserisci qui la descrizione dell'immagine

  • Punti di visibilità - Il modo più comune è posizionare un nodo appena fuori da ciascuno dei vertici convessi dell'ostacolo e quindi collegare ciascuna coppia di nodi che possono vedersi . Controlla questo link . Tuttavia, i nodi non devono essere i vertici e possono essere posizionati manualmente dal progettista nella mappa. In tal caso, il sistema viene spesso chiamato grafico waypoint .

    inserisci qui la descrizione dell'immagine


1
Due link: 1) Mikko Mononen ha svolto il lavoro di ricerca di percorsi Killzone 3 , e ha un blog molto carino in cui documenta il processo di sviluppo di Recast (generatore di navmesh) e Detour (toolkit di ricerca di percorsi), entrambi su licenza MIT e usati ad esempio in Kingdoms of Amalur: Reckoning . 2) La ricerca del punto di salto è, a mio avviso, uno dei maggiori sviluppi recenti nella ricerca di percorsi basata sulla griglia.
Eric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.