Una coda di priorità (PQ) è una struttura dati astratta (ADS). Ci sono molte possibilità per implementarle. Sfortunatamente, la priority_queue fornita con la libreria standard C++ è piuttosto limitata e altre implementazioni sono molto più adatte all'implementazione di A *. Spoiler: puoi usare std :: set/multiset invece di std :: priority_queue. Ma continuate a leggere:
Così che cosa avete bisogno dalla coda di priorità per implementare A * è:
- ottiene il nodo con il più basso costo
- Diminuire i costi di elementi arbitrari
Qualsiasi coda di priorità può fare 1., ma per 2., è necessaria una coda di priorità "mutabile". Lo Standard-Lib non può farlo. Inoltre, è necessario un modo semplice per trovare le voci nella coda di priorità, per scoprire dove ridurre le chiavi (Per quando A * trova un percorso migliore per un nodo già aperto). Esistono due modi di base: Archiviare un handle per l'elemento della coda di priorità all'interno del nodo del grafico (o usare una mappa per memorizzare i punti di manipolazione per ciascun nodo del grafico) - oppure inserire i nodi del grafico stessi.
Per il primo caso, in cui si memorizzano gli handle per ciascun nodo, è possibile utilizzare std :: multiset per la coda di priorità. std :: multiset :: first() sarà sempre la tua chiave "low cost", e puoi diminuire una chiave rimuovendola dal set, cambiando il valore e reinserendo e aggiornando l'handle. In alternativa, è possibile utilizzare le code di priorità mutabili da Boost.Heap, che supportano direttamente "tasto di riduzione".
Per il secondo caso, è necessario un qualche tipo di albero binario "intrusivo", dal momento che i nodi di identificazione dei percorsi stessi devono essere nella coda di priorità. Se non si desidera eseguire il rollover, consultare i contenitori associativi ordinati in Boost.Intrusive.
http://stackoverflow.com/questions/11912736/c-a-star-implementation-determining-whether-a-node-is-already-in-priori – Rost
@Rost ha .. che corrispondenza – Icebone1000