Pathfinding per la fuga


61

Come sai, ci sono molte soluzioni quando bacchetta per trovare il percorso migliore in un ambiente bidimensionale che porta dal punto A al punto B.

Ma come faccio a calcolare un percorso quando un oggetto si trova nel punto A e vuole allontanarsi dal punto B, il più velocemente e lontano possibile?

Un po 'di informazioni di base: il mio gioco utilizza un ambiente 2d che non è basato su tessere ma ha una precisione in virgola mobile. Il movimento è basato su vettori. L'individuazione del percorso viene effettuata suddividendo il mondo di gioco in rettangoli che sono percorribili o non percorribili e costruendo un grafico dai loro angoli. Ho già il percorso tra i punti che funzionano usando l'algoritmo Dijkstras. Il caso d'uso dell'algoritmo in fuga è che in determinate situazioni, gli attori del mio gioco dovrebbero percepire un altro attore come un pericolo e fuggire da esso.

La banale soluzione sarebbe quella di spostare l'attore in un vettore nella direzione opposta alla minaccia fino a quando non viene raggiunta una distanza "sicura" o l'attore raggiunge un muro in cui si copre di paura.

Il problema con questo approccio è che gli attori saranno bloccati da piccoli ostacoli che potrebbero facilmente aggirare. Fintanto che muoversi lungo il muro non li avvicinerebbe alla minaccia che potrebbero fare, ma sembrerebbe più intelligente quando eviterebbero ostacoli in primo luogo:

inserisci qui la descrizione dell'immagine

Un altro problema che vedo è con i vicoli ciechi nella geometria della mappa. In alcune situazioni un essere deve scegliere tra un percorso che lo fa allontanare più velocemente ora, ma termina in un vicolo cieco in cui sarebbe intrappolato, o un altro percorso che significherebbe che all'inizio non sarebbe così lontano dal pericolo (o anche un po 'più vicino) ma d'altra parte avrebbe una ricompensa a lungo termine molto più grande in quanto alla fine li porterebbe molto più lontano. Quindi la ricompensa a breve termine di allontanarsi velocemente deve essere in qualche modo valutata rispetto alla ricompensa a lungo termine di allontanarsi lontano .

inserisci qui la descrizione dell'immagine

C'è anche un altro problema di valutazione per le situazioni in cui un attore dovrebbe accettare di avvicinarsi a una minaccia minore per allontanarsi da una minaccia molto più grande. Ma ignorare completamente tutte le minacce minori sarebbe anche sciocco (ecco perché l'attore in questo grafico fa di tutto per evitare la minaccia minore nell'area in alto a destra):

inserisci qui la descrizione dell'immagine

Esistono soluzioni standard per questo problema?


8
+1 Ottima domanda con grandi effetti visivi. Rende davvero chiara la domanda.
MichaelHouse

Risposte:


24

Questa potrebbe non essere la soluzione migliore, ma ha funzionato per me creare un'intelligenza artificiale in fuga per questo gioco .

Passaggio 1. Converti l'algoritmo di Dijkstra in A * . Questo dovrebbe essere semplice semplicemente aggiungendo un euristico, che misura la distanza minima rimasta al bersaglio. Questa euristica viene aggiunta alla distanza percorsa finora durante il calcolo del punteggio di un nodo. Dovresti comunque apportare questa modifica, poiché aumenterà in modo significativo il tuo percorso.

Passaggio 2. Creare una variazione dell'euristica, che invece di stimare la distanza dall'obiettivo misura la distanza dal pericolo (i) e annulla questo valore. Questo non raggiungerà mai un obiettivo (dato che non ce n'è nessuno), quindi è necessario terminare la ricerca in qualche punto, magari dopo un numero specifico di iterazioni, dopo che è stata raggiunta una distanza specifica o quando vengono gestiti tutti i percorsi possibili. Questa soluzione crea in modo efficace un percorso che trova la via di fuga ottimale con la data limitazione.


1
Si noti che usare semplicemente qualcosa come una distanza in linea retta dal pericolo come l'euristica nel passaggio 2 generalmente non darà un'euristica ammissibile. Ovviamente, ciò non significa che non puoi provare ad usarlo comunque, ma potrebbe non generare percorsi di fuga ottimali. Per ottenere un'effettiva euristica ammissibile per questo "reverse A *", penso che dovresti usare il normale A * / Dijkstra per calcolare la distanza effettiva di ogni quadrato dal pericolo.
Ilmari Karonen,

+1 Penso che questo dia il miglior rapporto qualità-prezzo per quanto riguarda lo sforzo verso i risultati.
MichaelHouse

33

Se vuoi davvero che i tuoi attori siano intelligenti nel fuggire, semplicemente il tracciamento di Dijkstra / A * non lo taglierà. La ragione di ciò è che, per trovare la via di fuga ottimale da un nemico, l'attore deve anche considerare come il nemico si muoverà all'inseguimento.

Il seguente diagramma di MS Paint dovrebbe illustrare una situazione particolare in cui l'utilizzo di un solo pathfinding statico per massimizzare la distanza dal nemico porterà a un risultato non ottimale:

Schema di un attore in fuga da un nemico in un labirinto a forma di P.

Qui, il punto verde sta fuggendo dal punto rosso e ha due scelte da prendere per un percorso. Scendendo lungo il sentiero a destra gli permetterebbe di andare molto più lontano dalla posizione corrente del punto rosso , ma alla fine intrappolerebbe il punto verde in un vicolo cieco. La strategia ottimale, invece, è che il punto verde continui a correre attorno al cerchio, cercando di rimanere dalla parte opposta rispetto al punto rosso.

Per trovare correttamente tali strategie di escape, avrai bisogno di un algoritmo di ricerca contraddittoria come la ricerca minimax o i suoi perfezionamenti come la potatura alfa-beta . Un tale algoritmo, applicato allo scenario sopra con una profondità di ricerca sufficiente, dedurrà correttamente che prendere il vicolo cieco verso destra porterà inevitabilmente alla cattura, mentre rimanere sul cerchio non lo farà (finché il punto verde può superare il uno rosso).

Naturalmente, se ci sono più attori di entrambi i tipi, tutti questi dovranno pianificare le proprie strategie - separatamente o, se gli attori cooperano, insieme. Tali strategie di inseguimento / fuga di più attori possono diventare sorprendentemente complesse; per esempio, una possibile strategia per un attore in fuga è cercare di distrarre il nemico guidandolo verso un obiettivo più allettante. Naturalmente, ciò influenzerà la strategia ottimale dell'altro bersaglio, e così via ...

In pratica, probabilmente non sarai in grado di eseguire ricerche molto approfondite in tempo reale con molti agenti, quindi dovrai fare affidamento molto sull'euristica. La scelta di queste euristiche determinerà quindi la "psicologia" dei tuoi attori: quanto agiscono in modo intelligente, quanta attenzione prestano alle diverse strategie, quanto sono cooperative o indipendenti, ecc.


7

Hai il pathfinding, quindi puoi ridurre il problema a scegliere una buona destinazione.

Se sulla mappa ci sono destinazioni assolutamente sicure (ad esempio, se la minaccia non è in grado di seguire il tuo attore), scegli una o più zone vicine e scopri quale ha il costo di percorso più basso.

Se il tuo attore in fuga ha amici ben armati, o se la mappa include pericoli a cui l'attore è immune ma la minaccia non lo è, scegli un posto aperto vicino a un tale amico o pericolo e pathfind a quello.

Se il tuo attore in fuga è più veloce di qualche altro attore a cui potrebbe anche interessare la minaccia, scegli un punto nella direzione di quell'altro attore, ma al di là di esso, e il percorso verso quel punto: "Non devo correre più veloce dell'orso , Devo solo superarti. "

Senza la possibilità di scappare, uccidere o distrarre la minaccia, il tuo attore è condannato, giusto? Quindi scegli un punto arbitrario a cui correre, e se ci arrivi, e la minaccia ti sta ancora seguendo, che diavolo: girati e combatti.


7

Dal momento che specificare una posizione target appropriata potrebbe essere complicato in molte situazioni, vale la pena considerare il seguente approccio basato su mappe di griglia di occupazione 2D. Viene comunemente definita "iterazione del valore" e, combinata con gradiente-discesa / salita, fornisce un algoritmo di pianificazione del percorso semplice e abbastanza efficiente (a seconda dell'implementazione). Per la sua semplicità, è noto nella robotica mobile, in particolare per i "robot semplici" che navigano in ambienti interni. Come suggerito sopra, questo approccio fornisce un mezzo per trovare un percorso lontano da una posizione iniziale senza specificare esplicitamente una posizione target come segue. Si noti che è possibile specificare una posizione target, se disponibile. Inoltre, l'approccio / algoritmo costituisce una prima ricerca,

Nel caso binario, la griglia griglia di occupazione 2D è quella per celle di griglia occupate e zero altrove. Nota che questo valore di occupazione può anche essere continuo nell'intervallo [0,1], tornerò su quello sotto. Il valore di una determinata cella della griglia g i è V (g i ) .

La versione base

  1. Supponendo che la cella della griglia g 0 contenga la posizione iniziale. Impostare V (g 0 ) = 0 e inserire g 0 in una coda FIFO.
  2. Prendere la prossima griglia di celle g io dalla coda.
  3. Per tutti i vicini g j di g i :
    • Se g j non è occupato e non è stato visitato in precedenza:
      • V (g j ) = V (g i ) +1
      • Mark g j come visitato.
      • Aggiungi g j alla coda FIFO.
  4. Se non viene ancora raggiunta una determinata soglia di distanza, continuare con (2.), altrimenti continuare con (5.).
  5. Il percorso si ottiene seguendo la pendenza più ripida a partire da g 0 .

Note sul passaggio 4.

  • Come indicato sopra, il passaggio (4.) richiede di tenere traccia della distanza massima coperta, che è stata omessa nella descrizione sopra per motivi di chiarezza / brevità.
  • Se viene fornita una posizione target, l'iterazione viene interrotta non appena viene raggiunta la posizione target, ovvero elaborata / visitata come parte del passaggio (3.).
  • Ovviamente è anche possibile elaborare semplicemente l'intera mappa della griglia, vale a dire continuare fino a quando tutte le celle (libere) della griglia sono state elaborate / visitate. Il fattore limitante è ovviamente la dimensione della griglia-mappa insieme alla sua risoluzione.

Estensioni e ulteriori commenti

L'equazione di aggiornamento V (g j ) = V (g i ) +1 lascia molto spazio per applicare tutti i tipi di euristica aggiuntiva tramite il ridimensionamento V (g j )o il componente aggiuntivo al fine di ridurre il valore per alcune opzioni di percorso. La maggior parte, se non tutte, tali modifiche possono essere incorporate in modo piacevole e generico usando una griglia con valori continui da [0,1], che costituisce effettivamente una fase di pre-elaborazione della griglia iniziale binaria. Ad esempio, aggiungendo una transizione da 1 a 0 lungo i limiti degli ostacoli, "l'attore" rimane preferibilmente libero da ostacoli. Una tale griglia-mappa può, ad esempio, essere generata dalla versione binaria mediante sfocatura, dilatazione ponderata o simili. L'aggiunta di minacce e nemici come ostacoli con un ampio raggio di sfocatura, penalizza i percorsi che si avvicinano a questi. Si può anche usare un processo di diffusione sulla griglia globale in questo modo:

V (g j ) = (1 / (N + 1)) × [V (g j ) + sum (V (g i ))]

dove " somma " si riferisce alla somma su tutte le celle della griglia vicine. Ad esempio, invece di creare una mappa binaria, i valori iniziali (interi) potrebbero essere proporzionali all'entità delle minacce e gli ostacoli presentano minacce "piccole". Dopo aver applicato il processo di diffusione, i valori della griglia dovrebbero / devono essere ridimensionati su [0,1] e le celle occupate da ostacoli, minacce e nemici dovrebbero essere impostate / forzate su 1. Altrimenti il ​​ridimensionamento nell'equazione di aggiornamento potrebbe non funziona come desiderato.

Esistono molte variazioni su questo schema / approccio generale. Gli ostacoli, ecc. Potrebbero avere valori piccoli, mentre le celle della griglia libere hanno valori elevati, che possono richiedere una pendenza nell'ultimo passaggio a seconda dell'obiettivo. In ogni caso, l'approccio è, IMHO, sorprendentemente versatile, abbastanza facile da implementare e potenzialmente piuttosto veloce (soggetto a dimensioni / risoluzione della griglia della mappa). Infine, come con molti algoritmi di pianificazione del percorso che non assumono una posizione target specifica, esiste l'ovvio rischio di rimanere bloccati in vicoli ciechi. In una certa misura, potrebbe essere possibile applicare fasi di post-elaborazione dedicate prima dell'ultima fase per ridurre questo rischio.

Ecco un'altra breve descrizione con un'illustrazione in Java-Script (?), Sebbene l'illustrazione non abbia funzionato con il mio browser :(

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

Maggiori dettagli sulla pianificazione sono disponibili nel seguente libro. L'iterazione del valore è discussa in modo specifico nel capitolo 2, sezione 2.3.1 Piani a lunghezza fissa ottimali.

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

Spero che aiuti, cordiali saluti, Derik.


3

Che ne dici di concentrarti sui predatori? Facciamo solo raycast a 360 gradi sulla posizione di Predator, con densità appropriata. E possiamo avere campioni di rifugio. E scegli il miglior rifugio.

caso 1

caso 2


0

Un approccio che hanno in Star Trek Online per i branchi di animali è quello di scegliere una direzione aperta e proseguire in quel modo, rapidamente, de-spawn degli animali dopo una certa distanza. Ma questa è principalmente un'animazione de-spawn glorificata per le mandrie che dovresti spaventare dall'attaccarti, e non adatta ai mob di combattimento reali.

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.