Tiefe-Zuerst-Suche zum finden von kürzesten Pfad?
Ich weiß, diese erfolgt in der Regel mit der Breite zum ersten mal, aber wir sind aufgefordert, es zu tun mit den beiden, die ich bereits erreicht Breite zum ersten mal....
Ich fühle mich wie das ist ein ziemlich typisches Beispiel für die Verwendung eines depth-first-Suche, also ich hatte gehofft, ich könnte hier etwas Hilfe... ich bin versucht zu finden, den kürzesten Weg durch ein Labyrinth mit Tiefe-zuerst-Suche, aber wie der jetzt ich kann nicht umbrochen, mein Kopf herum, wie genau es zu tun. Das ist mein code bisher:
void maze::findPathRecursive(graph &g, int position, int goal) {
if (position == goal) {
isPath = true; //returns true if there is a path to the goal
correctPath.push_back(position); //the path to the goal
} else {
g.mark(position);
g.visit(position);
//gets all the neighbors of the current position
vector<int> neighbors = getNeighbors(position, g);
while (!neighbors.empty()) {
int n = neighbors.back();
neighbors.pop_back();
if (!g.isVisited(n)) {
findPathRecursive(g, n, goal);
}
if (isPath) {
correctPath.push_back(position);
break;
}
}
}
}
Gerade jetzt, was dies bedeutet, ist der erste Weg zum Ziel und bricht von dort aus. Ich weiß, ich werde zu müssen, um loszuwerden, die Pause, und ich habe versucht, einen anderen Vektor zu speichern, der kürzeste Weg, und vergleichen Sie die Längen zwischen ihm und dem früheren kürzeste, aber es ging nicht, weil ich fühle mich wie ich brauche, um unvisit Knoten an einem gewissen Punkt, kann aber nicht herausfinden, wie genau es hier tun.
Jede Hilfe wird sehr geschätzt!!
g ist ein graph, der durch die Art und Weise enthält das Labyrinth.
- Können Sie bestätigen, wenn Ihr graph ist azyklisch?
- nun, wie es jetzt funktioniert ist, dass selbst wenn es einen großen Kreis, der erste Knoten werden als "besucht" markiert und nicht in der Lage wäre, die besucht werden, also wieder in eine Art, ja es ist
- Mögliche Duplikate von DFS-kürzesten Pfad von a maze in C++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weile finden Sie einen Weg (und wenn man Glück hat ein kürzester Pfad) mit DFS, ist es nicht garantiert einen kürzesten Pfad im Allgemeinen. BFS ist Ihre beste Wette.
Es ist jedoch ein Konzept namens Iterative Vertiefung.
Aus Wikipedia:
Pseudocode, wieder aus wikipedia:
Erste Umsetzung eines DFS (sollte genau wie das BFS, sondern verwenden einen stack, anstatt eine Warteschlange), und implementieren Sie dann den Algorithmus-ID.
Hoffe, das hilft.
Im Allgemeinen, die Sie nicht verwenden möchten DFS zu finden, kürzesten Weg (es sei denn, Ihr graph ist definitiv azyklische und auch ungerichtete, in dem Fall, es gibt nur einen Weg, um zu Ihrem Ziel zu beginnen.) Es ist möglich, es kommt aber sehr gekünstelt. Auf Ihrer einfachsten Ebene, DFS ist geschickter bei der Bestimmung, ob es einen Weg gibt, dann bestimmen, was der beste Weg ist.
Ich würde empfehlen, einen Blick auf verschiedene Breite-Zuerst-Suche (BFS) - algorithmen. Wenn Sie das Labyrinth ist auf einem raster, A* ist wahrscheinlich Ihre beste Wette.
Ich bin mir nicht sicher, ob ich verstehe die Frage vollständig, aber in der Regel, würden Sie nicht verwenden, eine Breite-zuerst-Suche (zumindest im einfachsten Fall)? Es scheint mir, dass alle DFS versucht, den kürzesten Weg zu finden hat, zu verwandeln in eine Art von BFS sowieso, wie eine DFS könnte "miss" - Verknüpfungen.
Vielleicht https://cs.stackexchange.com/questions/4914/why-cant-dfs-be-used-to-find-shortest-paths-in-unweighted-graphs und diese http://en.wikipedia.org/wiki/Shortest_path_problem hilft.
Eher als "unvisit" ein Knoten, ich denke, Sie brauchen, um zu speichern, wobei jeder Knoten, wie viele Kanten es dauerte, um dorthin zu gelangen. Wenn Sie es erneut über einen kürzeren Pfad aktualisieren Sie den Rand, zählen für diesen Knoten und alle Knoten, die auf dem besten Pfad von diesem Knoten zum Ziel.