Percorso più breve su un grafico non diretto?


19

Quindi ho pensato che questa domanda (sebbene un po 'di base) appartenesse qui:

Supponiamo di avere un grafico con nodi di dimensioni 100 disposti in un modello 10x10 (pensa alla scacchiera). Il grafico non è indirizzato e non è ponderato. Lo spostamento attraverso il grafico implica lo spostamento di tre spazi in avanti e uno spazio a destra oa sinistra (simile a come un cavaliere di scacchi si muove su una tavola).

Dato un nodo iniziale fisso, come si potrebbe trovare il percorso più breve verso qualsiasi altro nodo sulla scheda?

Ho immaginato che ci sarebbe solo un vantaggio tra i nodi che sono mosse praticabili. Quindi, date queste informazioni, vorrei trovare il percorso più breve da un nodo iniziale a un nodo finale.

Il mio pensiero iniziale era che ogni bordo fosse ponderato con il peso 1. Tuttavia, il grafico non è indirizzato, quindi Djikstras non sarebbe la soluzione ideale. Pertanto, ho deciso di farlo usando una forma modificata di una prima ricerca approfondita.

Tuttavia, per la vita non sono riuscito a visualizzare come ottenere il percorso più breve usando la ricerca.

Un'altra cosa che ho provato è stata mettere il grafico in forma di albero con il nodo iniziale come radice, quindi selezionare il risultato più superficiale (numero di riga più basso) che mi ha dato il nodo finale desiderato ... questo ha funzionato, ma era incredibilmente inefficiente, e quindi non funzionerebbe per un grafico più grande.

Qualcuno ha qualche idea che potrebbe indirizzarmi nella giusta direzione su questo?

Grazie mille.

(Ho provato a inserire una visualizzazione del grafico, ma non sono riuscito a causa della mia scarsa reputazione)

Risposte:


19

Se i bordi nel grafico rappresentano solo spostamenti validi tra determinate posizioni, l'uso di Dijkstra funzionerebbe perfettamente. Tuttavia, poiché il grafico non è ponderato, sarebbe eccessivo. Una semplice prima ricerca fornirà la risposta ottimale.


ohhhhhh non avevo nemmeno pensato a un BFS! grazie mille!
gfppaste,

Com'è eccessivo? l'implementazione potrebbe essere un po 'più difficile nient'altro

Vorrei anche aggiungere che BFS è più efficiente. BFS ha O(|E|), mentre Dijkstra ha O(|E| + |V|log(|V|).
Doug Ramsey,

@ user742 BFS è più veloce di Djikstras. Djikstra è O(mn)mentre BFS èO(V + E)
CodyBugstein il

13

Nicholas ha già fornito una risposta perfetta. Tuttavia, lasciami affrontare il tuo tentativo originale di utilizzare la ricerca approfondita.

Innanzitutto, Dijkstra (che funziona bene con nodi non ponderati come notato da Nicholas Mancuso) o l'ampiezza della prima ricerca si traduce in uno spreco esponenziale della tua memoria. Il loro vantaggio, tuttavia, è che non espandono mai alcun nodo mentre sono garantiti per trovare soluzioni ottimali. Sfortunatamente, la loro limitazione è piuttosto importante e non ci si dovrebbe aspettare che si ridimensionino ragionevolmente.

dmun'XKiodmun'X+io×Kdmun'X=K=1 allora sei sicuro di trovare la soluzione ottimale mentre usi la memoria lineare nella profondità della soluzione.

BB-1B

Saluti,

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.