Ottimizzare AStar per trovare la posizione più vicina alla destinazione irraggiungibile


11

Ho implementato AStar in Java e funziona bene per un'area con ostacoli in cui la destinazione scelta è raggiungibile.

Tuttavia, quando la destinazione non è raggiungibile, il "percorso" calcolato non è in alcun modo verso la posizione più vicina (alla posizione non raggiungibile) ma è invece un percorso casuale.

Esiste un modo fattibile per modificare AStar nel trovare il percorso verso la posizione più vicina a una destinazione non raggiungibile?

Risposte:


20

Tieni traccia del nodo con il più basso EstimatedDistanceToEnd(cioè il più basso h(x)), e se non è possibile raggiungere un nodo finale da cui tornare indietro, fai invece il backtrack da quel nodo.


Semplice. Lo adoro!
John McDonald,

Ho appena schiaffeggiato la testa e sono andato "doh" quando ho letto la tua risposta. Grazie!
Drago Shivan,

1

Questa non è davvero una domanda A *. A * riguarda la ricerca di un percorso dal punto A al punto B. Anche se può essere esteso, i risultati potrebbero essere facilmente disordinati e imprevedibili. Ciò di cui hai bisogno invece è un algoritmo che seleziona la destinazione raggiungibile più vicina.

Ecco un modo per farlo: Se A * restituisce un percorso valido (nodi di inizio / fine nei nodi di input della corrispondenza del percorso), restituisce il percorso. Altrimenti...

  • Inizia la ricerca dal nodo iniziale
  • Attraversa tutti i nodi collegati (ricorda di contrassegnare quelli visitati per evitare la ricorsione infinita)
  • Confronta le distanze con la destinazione per trovare il nodo più vicino

Qualcosa come Flood Fill sembra appropriato en.wikipedia.org/wiki/Flood_fill nota che devi ancora A * dal nodo iniziale al nodo con la distanza più bassa. Si noti inoltre che ciò comporta sempre l'ispezione di tutti i nodi collegati e può quindi essere estremamente lento.
Roy T.

Sì, potrebbe essere lento. Ma molto probabilmente la lentezza verrebbe dall'aver sparpagliato i nodi nella memoria; che può essere facilmente risolto. Inoltre, è possibile accelerarlo sacrificando un po 'di precisione: basta saltare i collegamenti troppo lontani o puntare nella direzione sbagliata.
snake5,

1
@Roy: A *, BFS e tutti gli algoritmi di pathfinding simili saranno esattamente lenti come il flood-fill, poiché tutti devono ispezionare tutti i nodi collegati per assicurarsi che non vi sia alcun percorso verso la fine. Esistono tuttavia modi per alleviare questo problema; vedi qui .
BlueRaja - Danny Pflughoeft il
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.