Wie komme ich am günstigsten von links nach rechts?
Du bist auf der Suche nach dem kürzesten Weg von Frankfurt nach München? Dabei könnte dir der Dijkstra-Algorithmus helfen. Allerdings weißt du schon, dass München südlich von Frankfurt liegt. Da der Dijkstra-Algorithmus seine Suche kreisförmig um den Start ausbreitet, könnte man die Suche beschleunigen, denn Städte im Norden möchtest du gar nicht erst betrachten.
Der A*-Algorithmus bietet sich für dieses Problem an. Er funktioniert ähnlich wie der Dijkstra-Algorithmus, sucht allerdings gezielter, da für einen Zielknoten, wie hier München, zunächst geschätzt wird, wie groß die Distanz sein wird.
Da der A*-Algorithmus sehr mit dem Dijkstra-Algorithmus verwandt ist, kannst du auch hier in einem Graphen, dessen Kanten mit den Distanzen zwischen verschiedenen Städten beschriftet sind, den kürzesten Weg zwischen zwei Städten ermitteln. Natürlich können die Kantenbeschriftungen auch beim A*-Algorithmus etwas anderes repräsentieren, wie zum Beispiel die Mautkosten auf den Autobahnen zwischen den Städten. Es ist jedoch wichtig, dass sie nicht negativ sind.
Startknoten, von dem aus der günstigste Weg zum Zielknoten berechnet wird | |
Zielknoten, zu dem vom Startknoten aus der günstigste Weg berechnet wird | |
Knoten, dessen Bearbeitung abgeschlossen ist | |
Knoten, der gerade bearbeitet wird | |
Knoten, der sich in der Warteschlange befindet | |
"Vorgängerkante", die der günstigste Weg zum Knoten benutzt |
BEGIN
d(v[1]) ← 0, parent(v[1]) ← v[1]
FOR i = 2,..,n DO
d(v[i]) ← ∞, parent(v[i]) ← NULL
h(v[i]) ← √(Σ(v[i].coord-ziel.coord)2)
queue.insert(v[1], 0)
WHILE queue ≠ ∅ DO
u = queue.extractMin()
IF u == ziel DO RETURN "Weg gefunden"
FOR ALL (u,w) ∈ E DO
dist ← d(u) + l(u,w)
IF w ∈ queue AND d(w) > dist DO
d(w) = dist, f = dist + h(u)
parent(w) = u
ELSE IF parent(w) == NULL THEN
d(w) = dist, f = dist + h(u)
parent(w) = u, queue.insert(w,f)
RETURN "Ziel nicht erreichbar"
END
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.
Startknoten, von dem aus der günstigste Weg zum Zielknoten berechnet wird | |
Zielknoten, zu dem vom Startknoten aus der günstigste Weg berechnet wird | |
Knoten, dessen Bearbeitung abgeschlossen ist | |
Knoten, der gerade bearbeitet wird | |
Knoten, der sich in der Warteschlange befindet | |
"Vorgängerkante", die der günstigste Weg zum Knoten benutzt |
BEGIN
d(v[1]) ← 0
FOR i = 2,..,n DO
d(v[i]) ← ∞, parent(v[i]) ← NULL
WHILE queue ≠ ∅ DO
u = queue.extractMin()
FOR ALL (u,w) ∈ E DO
dist ← d(u) + l(u,w)
IF w ∈ queue AND d(w) > dist DO
d(w) = dist, parent(w) = (u,w)
ELSE IF parent(w) == NULL THEN
d(w) = dist, parent(w) = (u,w)
queue.insert(w,dist)
END
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.
Startknoten, von dem aus der günstigste Weg zum Zielknoten berechnet wird | |
Zielknoten, zu dem vom Startknoten aus der günstigste Weg berechnet wird | |
Knoten, dessen Bearbeitung abgeschlossen ist | |
Knoten, der gerade bearbeitet wird | |
Knoten, der sich in der Warteschlange befindet | |
"Vorgängerkante", die der günstigste Weg zum Knoten benutzt |
BEGIN
d(v[1]) ← 0, parent(v[1]) ← v[1]
FOR i = 2,..,n DO
d(v[i]) ← ∞, parent(v[i]) ← NULL
h(v[i]) ← √(Σ(v[i].coord-ziel.coord)2)
WHILE queue ≠ ∅ DO
u = queue.extractMin()
IF u == ziel DO RETURN "Weg gefunden"
FOR ALL (u,w) ∈ E DO
dist ← d(u) + l(u,w)
IF w ∈ queue AND d(w) > dist DO
d(w) = dist, f = dist + h(u)
parent(w) = u
ELSE IF parent(w) == NULL THEN
d(w) = dist, f = dist + h(u)
parent(w) = u, queue.insert(w,f)
RETURN "Ziel nicht erreichbar"
END
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.