Dijkstra-Algorithmus vs Breite erste Suche nach dem kürzesten Pfad im Diagramm


11

Ich habe diese Frage in StackOverflow gestellt. Ich wurde gebeten, hier einzuziehen. hier ist es also:

Ich brauche einige Klarstellungen und Eingaben bezüglich des Dijkstra-Algorithmus im Vergleich zur Breitensuche in gerichteten Graphen, wenn diese korrekt sind.

Der Dijkstra-Algorithmus findet den kürzesten Weg von Knoten Azu Knoten Fin einem gewichteten Diagramm, unabhängig davon, ob es einen Zyklus gibt oder nicht (solange keine negativen Gewichte vorhanden sind).

ADafür werden jedoch alle Pfade von zu allen anderen Knoten im Diagramm berechnet, und wir erfassen den Pfad von Abis, Findem wir die Sequenzen der Knoten in umkehren prev.

BFS: Findet den kürzesten Pfad von Knoten Azu Knoten Fin einem nicht gewichteten Diagramm, schlägt jedoch fehl, wenn ein Zyklus erkannt wird.

BFS berechnet jedoch nur den Pfad von Knoten A zu Knoten F und nicht unbedingt den gesamten Pfad von Knoten A. Wenn Knoten F früh erreicht wird, wird nur der Pfad zurückgegeben.

Beispielgraph

Antworten:


17
  1. BFS schlägt nicht fehl, wenn ein Zyklus erkannt wird. http://en.wikipedia.org/wiki/Breadth-first_search

  2. Dijkstra berechnet auch nicht alle Pfade von A nach F. Es stoppt, wenn es den kürzesten Weg von A nach F findet.

  3. In einem ungewichteten Diagramm können Sie mit BFS auch nach dem kürzesten Pfad von A zu allen anderen Knoten im selben Lauf suchen! (Lass es einfach nicht aufhören, sobald es F findet)

  4. Sie können einen Algorithmus vom Typ BFS verwenden, um den kürzesten Pfad zu finden, wenn Sie wissen, dass alle Längen ganze Zahlen sind, die kleiner als eine 'kleine' Zahl k in O (k (v + e)) sind, indem Sie jede Kante (u, w) der Länge n ersetzen Bei einem Pfad von n-1 Knoten zwischen u und w beträgt die Länge jeder Kante im Pfad 1.

Hoffe das hilft.



@ User1988876: Als allgemeiner Kommentar, wenn Sie an der Antwort von Aditya interessiert sind, würde ich Ihnen dringend empfehlen, seine Antwort zu verbessern (wie ich es tatsächlich getan habe). Das ist normalerweise eine gute Idee auf einer solchen Site.
Carlos Linares López

1
Entschuldigung für die späte Antwort. Nehmen Sie eine beliebige Kante eines Graphen, dessen Gewichtung kleine positive (weniger als k) Ganzzahlen (u, v) des Gewichts sind, z. B. 5. Ersetzen Sie die Kante uv durch einen Pfad wie folgt: u-uv1-uv2-uv3-uv4-v ( uv1 bis uv5 sind neue Knoten) mit dem Gewicht jeder Kante dazwischen als 1. Tun Sie dies für jede Kante. Nachdem alle Gewichte des resultierenden Graphen 1 sind, können Sie es sich als ungerichteten Graphen mit <= k | v | vorstellen Eckpunkte und <= k | e | Kanten. Verwenden Sie BFS, um den kürzesten Pfad zu finden. Im Allgemeinen ist dies nicht besser als Dijkstra, da die Gewichte beliebig groß und in einem Diagramm nicht integriert sein können.
Aditya

6

Obwohl Adityas Antwort gut ist, möchte ich einige Punkte klarstellen.

Breitensuche

Breadth-First Search (BFS) verwendet nur eine Warteschlange, um Knoten zu und von zu verschieben. Dies bedeutet, dass Knoten in der Reihenfolge ihrer Tiefe besucht werden.

Wenn die Kosten aller Betreiber gleich sind (so dass sie als gleich 1 angesehen werden), wird garantiert, dass eine optimale Lösung gefunden wird.

Beachten Sie daher Folgendes:

  1. Es werden nur Pfade aufgelistet, bis die Lösung gefunden ist. Es kann nicht gesagt werden, dass dieser Algorithmus den kürzesten Weg vom Quellknoten zum Zielknoten berechnet (Punkt!). Es berechnet nur die Entfernung zu allen Pfaden, auf die es auf dem Weg zum Ziel stößt. Mit anderen Worten, was auch immer über den Pfad zum Zielknoten gesagt wird, kann gleichermaßen über jeden anderen von ihm entdeckten Pfad gesagt werden.

  2. Nichts hindert BFS daran, auf Diagramme mit beliebigen Kosten angewendet zu werden. Der einzige zu beachtende Punkt ist, dass der Algorithmus die Vollständigkeit beibehält (so dass garantiert wird, dass eine Lösung gefunden wird), obwohl die Zulässigkeit verloren geht (dh nicht garantiert, dass die Lösung als optimal befunden wurde).

  3. Ursprünglich hat BFS keine GESCHLOSSENE Liste zum Speichern aller erweiterten Knoten in Betracht gezogen, sodass Sie irgendwie Recht haben, wenn Sie sagen, dass sie in einen Zyklus fallen könnten. Da jedoch explizit alle Knoten im Speicher gespeichert werden und die speicherintensivere Schicht immer die neueste ist, wird BFS normalerweise um eine CLOSED-Liste erweitert, in der alle zuvor erweiterten Knoten gespeichert sind. Wenn vor dem Erweitern eines Knotens eine Transposition auftritt, kann diese sicher übersprungen werden.

Dijkstra-Algorithmus

In der Tat, wenn Sie eine geschlossene Liste zu BFS hinzufügen, wie in Punkt 3 oben vorgeschlagen, und auch Knoten im Stapel (die sogenannte OPEN-Liste) in aufsteigender Reihenfolge von sortieren g(n) (dh die Kosten des Pfades vom Startzustand bis n) dann haben Sie den Dijkstra-Algorithmus (nun, es gibt noch einen weiteren sehr wichtigen Unterschied, während BFS beim Generieren des Zielknotens stoppt, Dijkstra beim Erweitern ).

Damit:

  1. Wiederum zählt dieser Algorithmus nur Pfade auf, bis die Lösung schließlich gefunden wird. Es ist nicht wahr, dass es alle Knoten im Zustandsraum besucht, und tatsächlich ist bekannt, dass der Dijkstra-Algorithmus vollständig ist (dh er garantiert, dass eine Lösung gefunden wird, falls eine existiert), selbst wenn der zugrunde liegende Graph unendlich ist.

  2. Sie können den Dijkstra-Algorithmus sicher anwenden, wenn Operationen beliebige Kosten verursachen. In der Tat ist dies der Grund, warum Sie die Warteschlange durch einen Heap ersetzt haben, in den Knoten in aufsteigender Reihenfolge ihrer Kosten eingefügt werden.

  3. Edgar Dijkstra hat ursprünglich in Betracht gezogen, eine GESCHLOSSENE Liste zu verwenden (Sie können sein Papier überprüfen, es ist nur wenige Seiten lang und sehr leicht zu lesen), damit die Zyklen richtig berücksichtigt werden.

Ich hoffe, dies hilft, vielleicht ist eine detailliertere Erklärung dieser Algorithmen erforderlich. Wenn ja, zögern Sie nicht, nach ihnen zu fragen

Prost,


1
BFS verwendet eine Warteschlange, keinen Stapel.
nbro

@nbro: Stimmt! Vielen Dank für den Hinweis! Ich habe meine Antwort entsprechend bearbeitet und geändert!
Carlos Linares López
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.