Come implementare l'algoritmo AO *?


16

Ho notato che quando implementiamo algoritmi di ricerca vengono utilizzate diverse strutture di dati. Ad esempio, utilizziamo le code per implementare l'ampiezza della prima ricerca, stack per implementare la ricerca approfondita e min-heap per implementare l' algoritmo A * . In questi casi, non è necessario costruire esplicitamente l'albero di ricerca.

Ma non riesco a trovare una semplice struttura di dati per simulare il processo di ricerca dell'algoritmo AO * . Vorrei sapere se costruire esplicitamente l'albero di ricerca è l'unico modo per implementare l'algoritmo AO *? Qualcuno può fornirmi un'implementazione efficiente?


3
Benvenuto! Ricorda di includere riferimenti a materiale non standard che utilizzi. Dato che AO * non ha articoli su Wikipedia, un link è sicuramente in ordine. Spero di averne trovato uno buono, per favore controlla.
Raffaello

1
Non è solo un grafico (con una funzione che consente di passare al nodo "successivo")?
soandos,

sarebbe d'aiuto se qualcuno avesse appena abbozzato come AO * differisce dall'algoritmo A *. non riuscivo a capirlo dal link. per quanto riguarda l'implementazione, qualsiasi struttura per alberi sembra ragionevole ... sta attraversando un albero giusto?
vzn

Risposte:


1

Per quanto riguarda questo articolo ogni volta che si espande un nodo nell'algoritmo AO *, è necessario tornare indietro per aggiornare tutti i costi stimati dei suoi predecessori.

Quando si utilizza una struttura di dati lineare per contenere i nodi, è necessario attraversare gli elementi di dati in sequenza e solo un elemento di dati può essere preso direttamente (stack, coda, coda di priorità ...).

In AO * ogni volta che viene preso un nodo per l'espansione in base al suo costo stimato l'algoritmo scorre su tutti i nodi che sono i suoi predecessori (per aggiornare il loro costo stimato). Ciò significa che a volte dovresti prendere un elemento in base al suo costo stimato ea volte in base al suo successore. Non esiste un ordine di sequenza in grado di soddisfare entrambe queste condizioni nel caso generale. Probabilmente esiste un modo per usare strutture di dati lineari "nidificate", ma dovrebbe semplicemente imitare una struttura ad albero e sarà invece meglio costruire l'albero di ricerca.


0

Sto solo andando fuori da quella descrizione a cui ti sei collegato, ma che dire di un BST? Potresti essere in grado di costruirlo per bilanciare i nodi irrisolti. Ciò potrebbe farti risparmiare tempo al passaggio 2 e contribuirebbe a ridurre il tempo complessivo a seconda del numero di attraversamenti. Ovviamente, se bilanciassi / ordinassi il tuo albero in base a nodi irrisolti, probabilmente saresti almeno migliore di una struttura di dati più semplicistica, mantenendo potenzialmente in / intorno al tempo logaritmico.

http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree


2
E puoi farlo?
Raffaello

non è così chiaro per me come sarebbe usato il BST perché i BST hanno un indice numerico per ciascun nodo e li usano per posizionarli. qual è l'indice numerico utilizzato?
vzn
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.