Qual è la differenza tra la ricerca su grafico e la ricerca ad albero?


Risposte:


178

A giudicare dalle risposte esistenti, sembra esserci molta confusione su questo concetto.

Il problema è sempre un grafico

La distinzione tra ricerca ad albero e ricerca su grafo non è radicata nel fatto che il grafo del problema sia un albero o un grafo generale. Si presume sempre che tu abbia a che fare con un grafico generale. La distinzione risiede nel modello di attraversamento utilizzato per la ricerca nel grafico, che può essere a forma di grafico o ad albero.

Se hai a che fare con un problema a forma di albero , entrambe le varianti dell'algoritmo portano a risultati equivalenti. Quindi puoi scegliere la variante di ricerca dell'albero più semplice.

Differenza tra ricerca grafico e albero

Il tuo algoritmo di ricerca del grafico di base è simile al seguente. Con un nodo iniziale start, bordi diretti come successorse una goalspecifica utilizzata nella condizione di ciclo. opentiene in memoria i nodi, che sono attualmente allo studio, l' elenco aperto . Notare che il seguente pseudo codice non è corretto in ogni aspetto (2).

Ricerca ad albero

open <- []
next <- start

while next is not goal {
    add all successors of next to open
    next <- select one node from open
    remove next from open
}

return next

A seconda di come si implementa select from open, si ottengono diverse varianti degli algoritmi di ricerca, come la ricerca in profondità (DFS) (scegli l'elemento più recente), la ricerca in larghezza (BFS) (scegli l'elemento più vecchio) o la ricerca dei costi uniforme (scegli l'elemento con il costo del percorso più basso ), la popolare ricerca A-Star scegliendo il nodo con il costo più basso più il valore euristico e così via.

L'algoritmo sopra indicato è in realtà chiamato ricerca ad albero . Visiterà più volte uno stato del grafico del problema sottostante, se sono presenti più percorsi diretti per il rooting nello stato iniziale. È anche possibile visitare uno stato un numero infinito di volte se si trova su un loop diretto. Ma ogni visita corrisponde a un diverso nodo nell'albero generato dal nostro algoritmo di ricerca. Questa apparente inefficienza a volte è richiesta, come spiegato in seguito.

Ricerca grafico

Come abbiamo visto, la ricerca ad albero può visitare uno stato più volte. E come tale esplorerà più volte il "sottostruttura" trovato dopo questo stato, il che può essere costoso. La ricerca del grafico risolve questo problema tenendo traccia di tutti gli stati visitati in un elenco chiuso . Se un nuovo successore trovato nextè già noto, non verrà inserito nell'elenco aperto:

open <- []
closed <- []
next <- start

while next is not goal {
    add next to closed
    add all successors of next to open, which are not in closed 
    remove next from open
    next <- select from open
}

return next

Confronto

Notiamo che la ricerca del grafico richiede più memoria, poiché tiene traccia di tutti gli stati visitati. Ciò può essere compensato dall'elenco aperto più piccolo, che si traduce in una migliore efficienza di ricerca.

Soluzioni ottimali

Alcuni metodi di implementazione selectpossono garantire di restituire soluzioni ottimali - cioè un percorso più breve o un percorso con un costo minimo (per grafici con costi attaccati ai bordi). Questo vale fondamentalmente ogni volta che i nodi vengono espansi in ordine di costo crescente o quando il costo è una costante positiva diversa da zero. Un algoritmo comune che implementa questo tipo di selezione è la ricerca dei costi uniforme o, se i costi dei passaggi sono identici, BFS o IDDFS . IDDFS evita il consumo aggressivo di memoria di BFS ed è generalmente consigliato per la ricerca non informata (nota anche come forza bruta) quando la dimensione del passo è costante.

UN*

Anche il (molto popolare) algoritmo di ricerca ad albero A * fornisce una soluzione ottimale se utilizzato con un'euristica ammissibile . L' algoritmo di ricerca con grafo A * , tuttavia, fornisce questa garanzia solo quando viene utilizzato con un'euristica coerente (o "monotona") (una condizione più forte dell'ammissibilità).

(2) Difetti dello pseudo-codice

Per semplicità, il codice presentato non:

  • gestire le ricerche fallite, cioè funziona solo se è possibile trovare una soluzione

1
Bella risposta anche se! Puoi approfondire cosa intendi per problema a forma di albero ? Inoltre, come proponi di memorizzare il percorso percorso dall'algoritmo per raggiungere l'obiettivo rispetto alla traversata completa?
Brian

1
@ Il problema a forma di albero di Brian significa che il grafico che stai cercando è un albero. E per la tua seconda domanda: dipende dal problema. Una possibilità è semplicemente memorizzare il percorso di un nodo insieme a ciascun nodo espanso, se possibile.
ziggystar

5
È più formale affermare che un "singolo stato" può essere visitato più volte da una ricerca ad albero e NON un nodo. Poiché ogni nodo nell'albero di ricerca corrisponde a un singolo percorso lungo il grafico dello spazio degli stati ed è visitato al massimo una volta dalle ricerche ad albero. (Anche se questo non è vero per Iterative Deepening Search che attraversa l'albero con limiti di profondità crescenti, ma in quel caso anche in ogni iterazione ogni nodo viene visitato una sola volta)
Nader Ghanbari

1
@NaderhadjiGhanbari Se stateo nodeè più adeguato per i vertici del grafo del problema sottostante , in contrasto con il grafo trasversale, dipende dal contesto. Ma l'utilizzo stateper il problema dei vertici del grafo e nodeper il grafo di attraversamento potrebbe sicuramente migliorare la chiarezza della risposta. Proverò a riscriverlo presto. Grazie.
ziggystar

TL; DR: la ricerca del grafico utilizza una struttura dati chiusa mentre la ricerca ad albero no.
shinzou

7

Un albero è un caso speciale di un grafico, quindi qualunque cosa funzioni per i grafici generali funziona per gli alberi. Un albero è un grafo in cui c'è esattamente un percorso tra ogni coppia di nodi. Ciò implica che non contiene alcun ciclo, come afferma una risposta precedente, ma un grafo diretto senza cicli (un DAG, grafo aciclico diretto) non è necessariamente un albero.

Tuttavia, se sai che il tuo grafico ha alcune restrizioni, ad esempio che è un albero o un DAG, di solito puoi trovare un algoritmo di ricerca più efficiente rispetto a un grafico senza restrizioni. Ad esempio, probabilmente non ha molto senso usare A *, o la sua controparte non euristica "algoritmo di Dijkstra", su un albero (dove c'è comunque un solo percorso da scegliere, che puoi trovare da DFS o BFS) o su un DAG (dove un percorso ottimale può essere trovato considerando i vertici nell'ordine ottenuto dall'ordinamento topologico).

Per quanto riguarda diretto vs non orientato, un grafo non orientato è un caso speciale di un grafo diretto, ovvero il caso che segue la regola “se c'è un arco (collegamento, transizione) da u a v c'è anche un arco da v a u .

Aggiornamento : nota che se ciò che ti interessa è il modello di attraversamento della ricerca piuttosto che la struttura del grafico stesso, questa non è la risposta. Vedi, ad esempio, la risposta di @ ziggystar.


Hm, il contesto della domanda non mi è completamente chiaro, ma guardandolo di nuovo dopo aver visto la tua risposta, @ziggystar, ho la sensazione che la menzione di A * e AI indichi che potresti avere ragione, e la mia risposta fuori contesto. Ho interpretato "ricerca albero" come "ricerca albero". Non "cercare un grafico generale utilizzando un modello di attraversamento a forma di albero", che è ciò che implica la tua risposta.
njlarsson

@njlarsson Ho incluso la tua riformulazione nella mia risposta. È utile per chiarimenti.
ziggystar

Aggiunta una nota di questo nella risposta. Sospetto che la mia risposta sia quella giusta per molte persone che trovano la loro strada qui tramite Google ecc., Anche se potrebbe essere fuori contesto per ciò che Rayhanur Rahman cercava.
njlarsson

Ho visto molti studenti avere difficoltà nello studio degli algoritmi di ricerca e la tua risposta li fuorvia.
Nader Ghanbari

1
La risposta riguarda anche gli algoritmi di ricerca, ma è vero che non è ciò di cui ha chiesto il poster. Vedere l '"Aggiornamento" nella risposta: nel marzo 2014 mi sono reso conto di aver frainteso la domanda. Il motivo per cui non ho cancellato la risposta è che potrebbe ancora essere utile a qualcuno che è arrivato qui tramite ricerca.
njlarsson

3

L'unica differenza tra un grafico e un albero è il ciclo . Un grafico può contenere cicli, un albero no. Quindi, quando si implementa un algoritmo di ricerca su un albero, non è necessario considerare l'esistenza di cicli, ma quando si lavora con un grafo arbitrario, è necessario considerarli. Se non gestisci i cicli, l'algoritmo potrebbe finire in un ciclo infinito o in una ricorsione infinita.

Un altro punto su cui riflettere sono le proprietà direzionali del grafico con cui hai a che fare. Nella maggior parte dei casi abbiamo a che fare con alberi che rappresentano le relazioni genitore-figlio su ciascun bordo. Un DAG (grafico aciclico diretto) mostra anche caratteristiche simili. Ma i grafici bidirezionali sono diversi. Ciascun bordo in un grafico bidirezionale rappresenta due vicini. Quindi gli approcci algoritmici dovrebbero differire un po 'per questi due tipi di grafici.


3
Per aggiungere a questo, se hai davvero un albero, non è necessario eseguire il rilevamento dei duplicati in A *. Avrai comunque bisogno di un modo per estrarre il percorso finale, quindi potresti ancora avere un elenco chiuso.
Nathan S.

In termini normali, un albero è un grafo diretto con al massimo un percorso tra due vertici. Cioè, ci sono due differenze tra i grafici e gli alberi: Diretto e unicità del percorso. Un algoritmo che lavora su un DAG non ha bisogno di controllare i cicli e un algoritmo che lavora su un albero non ha bisogno di controllare i duplicati.
thiton

1
La terminologia varia, ma non sempre si ritiene che gli alberi siano diretti. Per un albero con radice , cioè quando un nodo è specificato come radice, esiste una direzione implicita, ma gli alberi non devono essere radicati. Inoltre, i grafici generali possono essere diretti o non orientati. Inoltre, se richiedi al massimo un solo percorso tra due vertici, includi anche le foreste . Un albero è normalmente definito come un grafo connesso, cioè deve esserci esattamente un percorso.
njlarsson

Questa risposta ottiene di più dalla differenza tra alberi e grafici nella teoria dei grafi, ma non proprio con i diversi tipi di algoritmi di ricerca.
mlibby

1

GRAFICO CONTRO ALBERO

  • I grafici hanno cicli
  • Gli alberi non hanno cicli "Ad esempio immagina un albero nella tua testa, i rami non hanno connessioni dirette con la radice, ma i rami hanno connessioni con altri rami, verso l'alto"

Ma nel caso di AI Graph-search vs Tree-search

La ricerca del grafico ha una buona proprietà che ogni volta che l'algoritmo esplora un nuovo nodo e lo contrassegna come visitato, "Indipendentemente dall'algoritmo utilizzato", l'algoritmo esplora tipicamente tutti gli altri nodi che sono raggiungibili dal nodo corrente.

Si consideri ad esempio il seguente grafo con 3 vertici AB e C, e si considerino i seguenti gli archi

AB, BC e CA, beh, c'è un ciclo da C ad A,

E quando si esegue DFS a partire da A, A genererà un nuovo stato B, B genererà un nuovo stato C, ma quando C viene esplorato l'algoritmo proverà a generare un nuovo stato A ma A è già visitato, quindi verrà ignorato. Freddo!

Ma per quanto riguarda gli alberi? bene l'algoritmo degli alberi non contrassegna il nodo visitato come visitato, ma gli alberi non hanno cicli, come farebbe un ciclo infinito?

Considera questo albero con 3 vertici e considera i seguenti bordi

A - B - C radicata in A, verso il basso. E supponiamo di utilizzare l'algoritmo DFS

A genererà un nuovo stato B, B genererà due stati A e C, perché gli alberi non hanno "Segna un nodo visitato se è esplorato" quindi forse l'algoritmo DFS esplorerà di nuovo A, generando così un nuovo stato B, quindi stiamo entrando in un ciclo infinito.

Ma hai notato qualcosa, stiamo lavorando su bordi non orientati, cioè c'è una connessione tra AB e BA. ovviamente questo non è un ciclo, perché il ciclo implica che i vertici devono essere> = 3 e tutti i vertici sono distinti tranne il primo e l'ultimo nodo.

ST A-> B-> A-> B-> A non è un ciclo perché viola la proprietà di ciclismo> = 3. Ma in effetti A-> B-> C-> A è un ciclo> = 3 nodi distinti Selezionato, il primo e l'ultimo nodo sono gli stessi controllati.

Considera nuovamente i bordi dell'albero, A-> B-> C-> B-> A, ovviamente non è un ciclo, perché ci sono due B, il che significa che non tutti i nodi sono distinti.

Infine potresti implementare un algoritmo di ricerca ad albero, per evitare di esplorare lo stesso nodo due volte. Ma questo ha delle conseguenze.


Questa risposta è fonte di confusione perché sembra mescolare la situazione in cui il problema è un albero o un grafico con se l'algoritmo di ricerca stesso utilizza un albero o un grafico durante la ricerca.
mlibby

1

In parole semplici, l'albero non contiene cicli e dove può farlo il grafico. Quindi, quando eseguiamo una ricerca, dovremmo evitare cicli nei grafici in modo da non entrare in cicli infiniti.

Un altro aspetto è che l'albero ha in genere una sorta di ordinamento topologico o una proprietà come l'albero di ricerca binario che rende la ricerca così veloce e facile rispetto ai grafici.

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.