Perché non è possibile utilizzare DFS per trovare percorsi più brevi in ​​grafici non ponderati?


16

Capisco che l'uso di DFS "così com'è" non troverà un percorso più breve in un grafico non ponderato.

Ma perché ottimizzare DFS per consentirgli di trovare percorsi più brevi in ​​grafici non ponderati è una prospettiva così disperata? Tutti i testi sull'argomento dichiarano semplicemente che non può essere fatto. Non sono convinto (senza averlo provato da solo).

Conoscete qualche modifica che consentirà a DFS di trovare i percorsi più brevi nei grafici non ponderati? Altrimenti, cos'è l'algoritmo che lo rende così difficile?


1
L'algoritmo di pathfinding più comune sui grafici non ponderati è A *, con la leggera modifica che i legami vengono spezzati più vicino al traguardo. Ciò fornirà un algoritmo simile a DFS, in quanto proverà prima il percorso più diretto, e solo verso l'esterno se necessario.
BlueRaja - Danny Pflughoeft il

1
Prova a usare DFS su alcuni grafici (ben scelti); se davvero non funziona, dovresti riscontrare problemi. A proposito, la tua domanda si legge come se funzionasse su grafici ponderati.
Raffaello

Risposte:


12

L'unico elemento di ricerca approfondita che perfezionate è l'ordine in cui vengono studiati i bambini. La versione normale procede in ordine arbitrario, cioè nell'ordine in cui sono memorizzati i bambini.

L'unica alternativa possibile (verso percorsi più brevi) che posso trovare è un approccio avido, che sta guardando i bambini in ordine di distanza dal nodo corrente (dal piccolo al grande). È facile costruire un controesempio per questa regola:

contro esempio per regola avida
[ fonte ]

Ora, questa non è una prova che non esiste una strategia di scelta del figlio successivo da investigare che farà trovare a DFS percorsi più brevi.

Tuttavia, indipendentemente dalla regola¹, è possibile creare grafici con DFS impegnata in una lunga deviazione nel primo nodo, proprio come ho fatto per la regola golosa. Assegna bordi e pesi in modo tale che la regola scelga di visitare primo e assegna a un peso maggiore di quello di . Pertanto, è plausibile che DFS non riesca mai a trovare percorsi più brevi (nei grafici generali).( s , a ) a ( a , b ) ( s , t )(s,t)(s,a)a(a,b)(s,t)

Si noti che, poiché è possibile esprimere ogni grafico ponderato (intero positivo) come grafico non ponderato - è sufficiente sostituire i bordi con il costo con una catena con nodi - gli stessi esempi riguardano DFS su grafici non ponderati. Qui, la situazione è in realtà ancora più desolante: senza pesi, cosa può usare DFS per determinare il prossimo bambino da visitare?c - 1cc1


  1. Finché la regola è deterministica. In caso contrario, non è sempre possibile trovare percorsi più brevi.

Correggimi se sbaglio, ma questo significa che DFS può trovare il percorso più breve in qualsiasi grafico, ma ci vorrà tempo esponenziale mentre lo fai?
Anmol Singh Jaggi il

@AnmolSinghJaggi No. DFS trova sempre e solo un percorso.
Raffaello

10

Larghezza -primo-ricerca è l'algoritmo che troverà percorsi più brevi in un grafo non pesato.

Esiste una semplice modifica per passare da DFS a un algoritmo che troverà i percorsi più brevi su un grafico non ponderato. In sostanza, si sostituisce lo stack utilizzato da DFS con una coda. Tuttavia, l'algoritmo risultante non è più chiamato DFS. Invece, avrai implementato breadth-first-search.

Il paragrafo precedente fornisce un'intuizione corretta, ma semplifica un po 'la situazione. È facile scrivere codice per il quale il semplice scambio fornisce un'implementazione della prima ricerca ampia, ma è anche facile scrivere codice che inizialmente sembra un'implementazione corretta ma in realtà non lo è. È possibile trovare una domanda cs.SE correlata su BFS vs DFS qui . Puoi trovare dei simpatici pseudo-codici qui.


3

Puoi!!!

Contrassegna i nodi come visitati mentre stai andando in profondità e deseleziona mentre ritorni, mentre ritorni quando trovi un altro ramo (i) che ripete lo stesso.

Risparmia costi / percorso per tutte le possibili ricerche in cui hai trovato il nodo target, confronta tutti tali costi / percorsi e scegli quello più breve.

Il grosso (e intendo GRANDE) problema di questo approccio è che visiterai più volte lo stesso nodo, il che rende dfs una scelta ovvia per l'algoritmo del percorso più breve.


1
st

1
@ user2407394 Hai effettivamente implementato questa variante di DFS una volta ed eseguito correttamente per un grafico moderatamente grande? Sarei titubante nel chiamare questa variazione come DFS. La chiamerei ricerca approfondita del primo percorso.
John L.,

Ho implementato questo tipo di approccio, il suo funzionamento è molto lento. Sto pensando di aggiungere mnemonization per migliorare le prestazioni.
Mic

@ user2407394 sembra che funzionerebbe, ma come si fa a controllare quando fermarsi perché non ci sarebbe un elenco "visitato" se si deselezionano tutti?
Joe Black

0

BFS ha una bella proprietà che controllerà tutti i bordi dalla radice e manterrà la distanza dalla radice agli altri nodi il più minimale possibile, ma dfs salta semplicemente al primo nodo adiacente e va in profondità. PUOI modificare DFS per ottenere il percorso più breve, ma finirai solo in un algoritmo che presenta una complessità temporale maggiore o finirà per fare la stessa cosa che fa BFS


-3

È possibile trovare il percorso tra due vertici con il numero minimo di spigoli tramite DFS. possiamo applicare un approccio di livello


2
Si prega di fornire maggiori dettagli. Non so quale algoritmo stai cercando di descrivere in questa singola frase.
David Richerby,

-3

Puoi

basta attraversare il grafico in modo dfs e controllare

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

Ecco il link per la soluzione completa


1
La risposta accettata afferma che ciò non è possibile, il che contraddice la tua richiesta. Puoi spiegare perché pensi che tuttavia questo approccio funzioni? (o spiega perché questo approccio funziona in generale)
Lucertola discreta

Non è solo ripetere la risposta di user2407394 , solo con un codice difficile da capire (non hai definito il significato di nessuna di queste variabili, e non è ovvio per me) invece di una spiegazione?
David Richerby,

Sì, è l'implementazione della risposta di user2407394. Scusa per l'inconveniente. Ho aggiunto commenti nel codice. Puoi controllarlo ora.
Anmol Middha,
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.