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 A
zu Knoten F
in einem gewichteten Diagramm, unabhängig davon, ob es einen Zyklus gibt oder nicht (solange keine negativen Gewichte vorhanden sind).
A
Dafür werden jedoch alle Pfade von zu allen anderen Knoten im Diagramm berechnet, und wir erfassen den Pfad von A
bis, F
indem wir die Sequenzen der Knoten in umkehren prev
.
BFS: Findet den kürzesten Pfad von Knoten A
zu Knoten F
in 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.
quelle
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:
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.
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).
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 sortiereng(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:
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.
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.
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,
quelle