Kapitel 5: Kürzeste Pfade Gliederung der Vorlesung 1. 2. 3. 4. 5. 6. 7. 8. 5/3, Folie 1 Fallstudie Bipartite Graphen Grundbegriffe Elementare Graphalgorithmen und Anwendungen Minimal spannende Bäume Kürzeste Pfade Traveling Salesman Problem Flüsse in Netzwerken und Anwendungen Netzplantechnik © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Gliederung des Kapitels a) b) c) d) e) 5/3, Folie 2 Einführung / Problemstellungen Begriffe und Lösungsansatz Kürzeste Pfade von einem Startknoten Kürzeste Pfade zwischen allen Knotenpaaren Spezialfall: Graphen mit nichtnegativen Gewichten © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen • wir schauen uns an, wie man diesen Spezialfall „effizienter“ behandeln kann (/* ... es genügt, jede Kante nur einmal zu benutzen, um die Schätzwerte zu „verbessern“ */) ... um die gewünschte Laufzeitverbesserung zu erzielen, benötigen wir eine geeignete Datenstruktur (/* so genannte binäre Heaps, um MinPrioritätswarteschlangen zu implementieren */) • danach diskutieren wir das Problem, wie man einen kürzesten Pfad von einem Startknoten s zu einem Zielknoten t bestimmen kann, ohne „quasi nebenbei“ kürzeste Pfade vom Startknoten s zu jedem anderen Knoten im Graphen zu bestimmen ... für Anwendungen, etwa bei der Suche nach kürzesten Pfaden bei der Routenplanung, sollten die bisher vorgestellten Verfahren eher nicht verwendet werden 5/3, Folie 3 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen 5/3, Folie 4 • wir schauen uns zunächst den Algorithmus von Dijkstra an (/* inklusive einer „passenden“ Datenstruktur zur Implementierung von so genannten Min-Prioritätswarteschlangen */) • im Anschluss diskutieren wir den, aus dem Bereich der Künstlichen Intelligenz bekannten A*-Algorithmus © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel 3 1 4 2 3 4 3 1 1 4 2 5 2 6 3 1 2 3 4 5 6 +∞ 0 +∞ +∞ +∞ +∞ ... „initiale“ Schätzung der Entfernungen vom Startknoten 2 5/3, Folie 5 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel 3 1 2 4 3 4 3 1 1 4 2 5 2 3 6 Knoten Daktuell Kanten Dneu 1 +∞ [1,4] 3 2 0 [2,1], [2,3], [2,5], [2,6] 0 3 +∞ [3,4], [3,6] 4 4 +∞ 5 +∞ [5,4] 4 6 +∞ [6,5] 2 +∞ ... „erste“ Schätzung unter Berücksichtigung aller Pfade mit der Ecke 2 5/3, Folie 6 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel 3 1 2 4 3 4 3 1 1 4 2 5 2 3 6 Knoten Daktuell Kanten Dneu 1 3 [1,4] 3 2 0 3 4 4 +∞ 5 4 [5,4] 4 6 2 [6,5] 2 0 [3,4], [3,6] 4 +∞ ... „zweite“ Schätzung unter Berücksichtigung aller Pfade mit der Ecke 6 5/3, Folie 7 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel 3 1 2 4 3 4 3 1 1 4 2 5 2 3 6 Knoten Daktuell Kanten Dneu 1 3 [1,4] 3 2 0 3 4 4 +∞ 5 4 6 2 0 [3,4], [3,6] 4 6 [5,4] 4 2 ... „dritte“ Schätzung unter Berücksichtigung aller Pfade mit der Ecke 1 5/3, Folie 8 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel 3 1 2 4 3 4 3 1 1 4 2 5 2 3 6 Knoten Daktuell Kanten 1 3 3 2 0 0 3 4 4 6 5 4 6 2 [3,4], [3,6] Dneu 4 5 [5,4] 4 2 ... „vierte“ Schätzung unter Berücksichtigung aller Pfade mit der Ecke 3 5/3, Folie 9 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel 3 1 2 4 3 4 3 1 1 4 2 5 2 3 6 Knoten Daktuell Kanten 1 3 3 2 0 0 3 4 4 4 5 5 5 4 6 2 [5,4] Dneu 4 2 ... „fünfte“ Schätzung unter Berücksichtigung aller Pfade mit der Ecke 5 5/3, Folie 10 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Zugrunde liegende Datenstrukturen • • • • 5/3, Folie 11 die Adjazenzliste A[1..n] von G ein Array D[1..n] (/* in dem sich die „aktuellen“ Schätzwerte “gemerkt“ werden */) ein Array P[1..n] (/* in dem sich für jeden Knoten der „aktuelle“ Vorgänger „gemerkt“ wird */) ein Array Q[1..n] (/* in dem sich „gemerkt“ wird, welche Knoten noch zu untersuchen sind */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Realisierung (/* Version 1 */) • • • • setze D[j] = +∞ und P[j] = 0 für alle j = 1,...,n setze D[s] = 0 setze Q[j] = 1 für alle j = 1,...,n while es gibt einen Knoten j mit Q[j] = 1 do • • • bestimme einen Knoten i mit Q[i] = 1, der unter allen Knoten j mit Q[j] = 1 den kleinsten Wert D[i] hat setze Q[i] = 0 for alle v ∈ A[i] do • if D[v] > D[i] + w([i,v]) then • 5/3, Folie 12 © 2011 Prof. Steffen Lange - HDa/FbI setze D[v] = D[i] + w([i,v]) und P[v] = i - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) • wenn der Graph G Kanten mit negativem Gewicht hat, leistet der Algorithmus von Dijkstra nicht das Gewünschte 4 3 -3 1 6 5/3, Folie 13 1 2 4 ... Schätzung nach dem Q[3] = 0 gesetzt wurde 1 2 3 4 0 4 5 6 ... „finale“ Schätzung (/* aber es gilt δ(1,3) = 4 */) 1 2 3 4 0 1 5 3 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) • wir untersuchen jetzt, warum der Algorithmus von Dijkstra funktioniert, wenn alle Kanten nichtnegative Gewichte haben (/* ... nebenbei werden wir sehen, weshalb diese Voraussetzung „wichtig“ ist */) • zugrunde liegende Idee: • • es sei u irgendein Knoten wir werden zeigen, dass in dem Schritt, in dem Q[u] = 0 gesetzt wird, bereits D[u] = δ(s,u) gilt ... das dann in späteren Schritten der Wert D[u] nicht mehr verändert wird, sollte klar sein ... diese Aussage beweisen wir induktiv 5/3, Folie 14 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) 5/3, Folie 15 • der Induktionsanfang sollte klar sein (/* im ersten Schritt wird Q[s] = 0 gesetzt und es gilt D[s] = δ(s,s) = 0 nach dem ersten Schritt*/) • die Induktionsvoraussetzung lautet: nach Schritt k gilt für alle Knoten v mit Q[v] = 0 auch D[v] = δ(s,v) • es sei u der Knoten, für den der Wert Q[u] = 0 in Schritt k+1 gesetzt wird • wir nehmen an, dass D[u] > δ(s,u) nach dem Schritt k+1 gilt (/* das nicht D[u] < δ(s,u) gelten kann, sollte unmittelbar klar sein */) • es sei also P = (v0,...,vz+1) ein kürzester Pfad vom Startknoten s zum Knoten u (/* also gilt w(P) = δ(s,u) < D[u] */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) • im Pfad P = (v0,...,vz+1) sei vi der Knoten mit dem maximalen Index, so dass Q[vi] = 0 nach Schritt k gilt • • • wir betrachten das Anfangsstück Pa = (v0,..,vi,vi+1) von P da G nur Kanten mit nichtnegativen Gewicht hat, gilt w(Pa) ≤ w(P) da w(P) < D[u] gilt, muss also auch w(Pa) < D[u] gelten • nach Induktionsvoraussetzung muss nach Schritt k also D[vi] = δ(s,vi) und damit auch D[vi+1] = D[vi] + w(vi,vi+1) gelten • also gilt auch D[vi+1] = w(Pa) ≤ w(P) < D[u] • dann hätte der Algorithmus von Dijsktra den Wert Q[vi+1] anstelle des Wertes Q[u] in Schritt k+1 von 1 auf 0 setzen müssen ... und damit kann unsere Annahme, dass D[u] > δ(s,u) gilt, nicht korrekt sein 5/3, Folie 16 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Laufzeit */) • • offenbar wird jede Kante von G nur einmal „angefaßt“ also benötigt das Ändern der Schätzwerte in der „While-Schleife“ insgesamt nur die Zeit O(m) • die „While-Schleife“ wird insgesamt n mal ausgeführt, wobei jeweils • • getestet wird, ob Q[v] = 1 für wenigstens einen Knoten v gilt (/* das bekommt man mit O(1) vielen Rechenschritten raus */) der Knoten v mit Q[v] = 1 bestimmt (/* das bekommt man mit O(n) vielen Rechenschritten raus*/) ... also benötigt der Algorithmus von Dijkstra insgesamt O(m + n2) viele Rechenschritte ... bei einer anderen, Realisierung benötigt der Algorithmus von Dijkstra insgesamt nur O((m + n)*log(n)) viele Rechenschritte (/* das ist manchmal besser */) 5/3, Folie 17 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Anforderungen an die Datenstruktur • • • • 5/3, Folie 18 es soll eine Menge M von maximal n Elementen verwaltet werden (/* in unserem Fall sind das die Knoten der Graphen*/) jedem Element ist ein Schlüssel zugeordnet (/* in unserem Fall sind das die Schätzwerte für die Entfernungen zum Startknoten */) die Schlüssel können sich über die Zeit ändern (/* in unserem werden die Schätzwerte sukzessive „verbessert“; d.h. sie werden kleiner */) aktuell interessiert stets eine Teilmenge Q ⊆ M (/* in unserem Fall diejenigen Knoten, die noch nicht zur „Verbesserung“ der Schätzwerte herangezogen wurden */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Anforderungen an die Datenstruktur • zu unterstützende Operationen • • • • 5/3, Folie 19 ein Element x ∈ M mit dem Schlüssel s(x) in die Menge Q einfügen ein Element x ∈ Q mit einem minimalen Schlüssel s(x) finden und aus Q entfernen herausbekommen, ob die Menge Q ungleich der leeren Menge ist den Schlüssel eines Elements x ∈ Q von s(x) zu s‘(x) ändern, wobei stets s‘(x) < s(x) gilt © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Grundidee • zur „Verwaltung“ der Elemente von Q verwenden wir ein Array Q[1..n] und eine Variable max, in der sich gemerkt wird, wie viele Elemente aus M aktuell in Q „verwaltet“ werden • die Elemente von Q werden im Array Q[1..n] so abgelegt, dass für alle i = 1,..., max die so genannte Heap-Eigenschaft gilt: • • wenn 2i ≤ max gilt, so gilt s(Q[i]) ≤ s(Q[2i]) wenn 2i+1 ≤ max gilt, so gilt s(Q[i]) ≤ s(Q[2i+1]) ... auf diese Weise ist klar, dass in Q[1] ein Element x ∈ Q mit einem minimalen Schlüssel s(x) abgelegt wurde ... auf diese Weise kann man sicherstellen, dass alle „relevanten“ Operationen in der Zeit O(log(n)) durchgeführt werden können 5/3, Folie 20 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Illustration • es sei Q = { a,b,c,d,e } mit s(a) = 1, s(b) = 2, s(c) = 3 und s(d) = s(e) = 4 Q[1..n] 1 2 3 4 5 a b d c e 6 7 a ... ein „anderer“ Blick auf den gefüllten Teil des Array Q[1..n]: b c d e ... das Array Q[1..n] entspricht einem vollständig aufgefüllten Binärbaum der Tiefe m (/* mit m ≤ log(n) */) 5/3, Folie 21 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Erweiterung • 5/3, Folie 22 um die Schlüssel der Elemente in Q „effizient“ verkleinern zu können, verwenden wir noch ein weiteres Array M[1..n] mit n Elementen, das jedoch mit den Elementen in M indiziert ist (/* in M[x] wird sich „gemerkt“, an welcher Stelle das Element x im Array Q[1..n] „gespeichert“ ist */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Illustration • es sei M = { a,b,c,d,e,f,g } • es sei Q = { a,b,c,d,e } mit s(a) = 1, s(b) = 2, s(c) = 3 und s(d) = s(e) = 4 Q[1..n] M[1..n] 5/3, Folie 23 © 2011 Prof. Steffen Lange - 1 2 3 4 5 a b d c e a b c d 1 2 4 3 HDa/FbI - 6 7 e f g 5 0 0 Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Operation: Element Q[1] entfernen (/* ein Element mit minimalem Schlüssel */) • • • setze min = Q[1], M[min] = 0, Q[1] = Q[max] und M[Q[1]] = 1 setze max = max - 1 und i = 1 while 2i ≤ max do • if 2i + 1 ≤ max then • if s(Q[2i]) ≤ s(Q[2i+1]) then • setze j = 2i • else setze j = 2i+1 else setze j = 2i • • if s(Q[j]) < s(Q[i]) then • • • • 5/3, Folie 24 © 2011 Prof. Steffen Lange vertausche die Werte von M[Q[j]] und M[Q[i]] vertausche die Werte von Q[j] und Q[i] setze i = j else setze i = max + 1 - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Illustration • es sei M = { a,b,c,d,e,f,g } • es sei Q = { a,b,c,d,e } mit s(a) = 1, s(b) = 2, s(c) = 3 und s(d) = s(e) = 4 Q[1..n] Q[1..n] 1 2 3 4 5 a b d c e 6 7 1 2 3 4 b c d e 6 7 M[1..n] M[1..n] 5/3, Folie 25 5 a b c d e f g a b c d e f g 1 2 4 3 5 0 0 0 1 2 3 4 0 0 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Operation: Schlüssel von x von s(x) auf s‘(x) verkleinern • • 5/3, Folie 26 setze i = M[x] while i > 1 do • setze j = i/2 • if s(Q[j]) > s(Q[i]) then • vertausche die Werte von M[Q[j]] und M[Q[i]] • vertausche die Werte von Q[j] und Q[i] • setze i = j © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Illustration • es sei M = { a,b,c,d,e,f,g } • es sei Q = { a,b,c,d,e } mit s(a) = 1, s(b) = 2, s(c) = 3 und s(d) = s(e) = 4 • der Schlüssel von e wird von s(e) = 4 auf s‘(e) = 1 geändert Q[1..n] Q[1..n] 1 2 3 4 5 a b d c e 6 7 1 2 3 4 5 a e d c b 7 M[1..n] M[1..n] 5/3, Folie 27 6 a b c d e f g a b c d e f g 1 2 4 3 5 0 0 1 5 4 3 2 0 0 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Operation: Schlüssel x hinzufügen • • 5/3, Folie 28 setze max = max + 1, Q[max] = x und M[x] = max while i > 1 do • setze j = i/2 • if s(Q[j]) > s(Q[i]) then • vertausche die Werte von M[Q[j]] und M[Q[i]] • vertausche die Werte von Q[j] und Q[i] • setze i = j © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Illustration • es sei M = { a,b,c,d,e,f,g } • es sei Q = { a,b,c,d,e } mit s(a) = 1, s(b) = 2, s(c) = 3 und s(d) = s(e) = 4 • das Element g mit s(g) = 2 wird in Q aufgenommen Q[1..n] Q[1..n] 1 2 3 4 5 a b d c e 6 7 1 2 3 4 5 6 a b g c e d M[1..n] M[1..n] 5/3, Folie 29 7 a b c d e f g a b c d e f g 1 2 4 3 5 0 0 1 2 4 6 5 0 3 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Einschub: Min-Prioritätswarteschlangen (/* mit binären Heaps */) Anmerkung • jede der betrachteten Operationen benötigt offenbar nur O(log(n)) viele Rechenschritte (/* wenn die Menge Q maximal n Elemente hat, so hat der „zugehörige“ vollständig aufgefüllte Binärbaum maximal eine Tiefe der Größe O(log(n)) */) • da man sich in der Variablen max „gemerkt“ hat, wie viele Elemente aktuell zur Menge Q gehören, kann man in Zeit O(1) rausbekommen, ob die Menge Q ungleich der leeren Menge ist 5/3, Folie 30 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Zurück zum Algorithmus von Dijsktra • wir schauen uns jetzt eine andere Realisierung an, bei der MinPrioritätswarteschlangen verwendet werden Zugrunde liegende Datenstrukturen • • • • 5/3, Folie 31 die Adjazenzliste A[1..n] von G ein Array D[1..n] (/* in dem sich die „aktuellen“ Schätzwerte “gemerkt“ werden */) ein Array P[1..n] (/* in dem sich für jeden Knoten der „aktuelle“ Vorgänger „gemerkt“ wird */) ein Array Q[1..n] (/* in dem sich „gemerkt“ wird, welche Knoten noch zu untersuchen sind; als Schlüssel fungieren die Werte im Array D[1..n] */) sowie das zu Q[1..n] gehörende Array M[1..n] © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Realisierung (/* Version 2 */) • • • • setze D[j] = +∞ und P[j] = 0 für alle j = 1,...,n setze D[s] = 0 füge alle Knoten zur Menge Q hinzu while Q ist ungleich der leeren Menge do • • setze u = Q[1] und entferne u aus Q for alle v ∈ A[u] do • if D[v] > D[u] + w([u,v]) then • passe Q an, in dem anstelle des Schlüssels s(v) (/* D[v] */) der Schlüssel s‘(v) (/* D[u] + w([u,v]) */) verwendet wird setze D[v] = D[u] + w([u,v]) und P[v] = u • 5/3, Folie 32 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Laufzeit */) • • offenbar wird jede Kante von G nur einmal „angefaßt“ also benötigt das Ändern der Schätzwerte und das Anpassen der beiden Arrays Q[1..n] und M[1..n] in der „While-Schleife“ insgesamt nur die Zeit O(m*log(n)) • die „While-Schleife“ wird insgesamt n mal ausgeführt, wobei jeweils • • getestet wird, ob Q leer ist (/* das bekommt man mit O(1) vielen Rechenschritten hin */) der Knoten Q[1] bestimmt wird und der Arrays Q[1..n] und M[1..n] angepasst werden (/* das bekommt man in O(n*log(n)) vielen Rechenschritten hin */) ... also benötigt der Algorithmus von Dijkstra insgesamt O((m + n)*(log(n)) viele Rechenschritte 5/3, Folie 33 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten „kritische“ Zusammenfassung • die bisher untersuchten Algorithmen kann man auch zum Bestimmen eines kürzesten Pfades von einem Startknoten s zu einem Zielknoten t verwenden (/* dass sie „quasi nebenbei“ kürzeste Pfade von s zu allen anderen Knoten des Graphen bestimmen ist offensichtlich */) • um etwa beim Algorithmus von Dijkstra Rechenzeit (/* und Speicherplatz zu sparen */) kann man • • „aufhören“, wenn der Zielknoten t aus der Menge Q gestrichen wird einen Knoten v erst dann in die Menge Q aufnehmen, wenn für den „zugehörigen“ Schätzwert D[v] < + ∞ gilt ... Was bringen diese Vorschläge? 5/3, Folie 34 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel • es geht darum, eine kürzeste Route zwischen zwei Städten s und t in Europa zu finden ... ohne diese Verbesserungen müssten sich alle Städte in der Menge Q gemerkt werden ... mit der Verbesserung reduziert sich die Anzahl der Städte „wesentlich“ (/* es werden „im Prinzip“ nur die Städte u aufgenommen, für die die Entfernung von s zu u nicht größer als die von s zu t ist */) 5/3, Folie 35 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel s t ... in manchen Fällen führen diese Verbesserungen dazu, dass man in „vertretbarer“ Zeit und mit „vertretbarem“ Speicherplatz eine kürzeste Route von der Stadt s zur Stadt t findet 5/3, Folie 36 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Beispiel t s ... in manchen Fällen helfen diese Verbesserungen nicht so richtig weiter (/* will man eine Route von München nach Hamburg bestimmen, so werden wenigstens alle Städte in Österreich, Tschechien, Norditalien und Slowenien sowie in Luxemburg, Belgien und den Niederlanden komplett „besucht“ und „benutzt“ */) 5/3, Folie 37 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Weitere Verbesserungsmöglichkeiten • man versucht „Wissen“ über das „aktuell“ zu lösende Problem zu benutzen, um folgendes zu erreichen: • diejenigen Knoten in der Menge Q zu erst „anzufassen“, von denen man vermutet, dass sie mit Blick auf das zu lösende Problem am „brauchbarsten“ sind (/* implizit wird damit auch die Größe von Q beschränkt */) ... bei der Planung von Routen zwischen zwei Städten s und t könnte z.B. für jede Stadt u in Q die „Luftlinien-Entfernung“ von u zu t „herangezogen“ werden, um „brauchbare“ Knoten auszuwählen ... unter den Städten in Q wird stets diejenige Stadt u zu erst „angefasst“, für die Summe aus geschätzter Entfernung von s nach u und „LuftlinienEntfernung“ von u zu t minimal ist 5/3, Folie 38 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Zugehörige algorithmische Fragestellung • gegeben: • • • • • ein gerichteter Graph G = (V,E) eine Gewichtsfunktion w(.) für G ein Startknoten s ein Zielknoten t gesucht: • das Gewicht eines kürzesten Pfades von s zu t (/* falls ein solcher existiert, dann auch einen entsprechenden Pfad */) ... der Graph G habe genau n Knoten (/* der Einfachheit halber sei V = { 1,...,n } */) und m Kanten 5/3, Folie 39 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Zugrunde liegende Idee • der vorzustellenden A*-Algorithmus arbeitet fast genauso wie der Algorithmus von Dijsktra, d.h. • es werden sukzessive Knoten in eine Menge Q aufgenommen • bevor ein Knoten v in die Menge Q aufgenommen wird, muss ein Schätzwert D[v] für die Entfernung δ(s,v) bestimmt werden (/* wobei δ(s,v) ≤ D[v] < +∞] gelten soll */) • in jedem Schritt wird ein Knoten v aus der Menge Q ausgewählt und entfernt • der ausgewählte Knoten v wird verwendet, um die Schätzwerte der Knoten u anzupassen, für die es eine Kante von v nach u gibt • 5/3, Folie 40 der Algorithmus bricht ab, wenn der Zielknoten t entfernt wird © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Zugrunde liegende Idee • beim Algorithmus von Dijsktra wird ein Knoten v ausgewählt, für den der Schätzwert D[v] minimal ist (/* mit Blick auf alle Knoten in Q */) • beim vorzustellenden A*-Algorithmus wird ein Knoten v ausgewählt, für den der Wert D[v] + H[v] minimal ist (/* mit Blick auf alle Knoten in Q */) ... der Wert H[v] ist eine Schätzung für die Entfernung des Zielknotens t zum Knoten v ... der Knoten v, für den der Wert D[v] + H[v] minimal ist (/* mit Blick auf alle Knoten in Q */), ist derjenige von dem man am ehesten erwarten kann, dass er auf einem kürzesten Pfad vom Startknoten s zum Zielknoten t liegt 5/3, Folie 41 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Begriff: Zulässige Heuristik • • • • es seien G = (V,E) ein gerichteter Graph und w(.) die zugehörige Gewichtsfunktion es sei t der Zielknoten für jeden Knoten v ∈ V sei der zugeordnete Wert H[v] eine reelle Zahl die so definierte Heuristik H ist eine zulässige Heuristik für G und t, falls gilt: • • H[t] = 0 0 ≤ H[u] ≤ w(u,v) + H(v) für alle [u,v] ∈ E ... Idee: H[u] sollte nicht „unrealistisch“ viel größer als H[v] sein ... Anmerkung: man verwendet an dieser Stelle üblicherweise den Begriff Heuristik anstelle von Schätzung 5/3, Folie 42 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen zur Wahl von Heuristiken • Heuristiken sollten immer so gewählt werden, dass • • sie zulässig sind (/* sonst ist nicht sicher gestellt, dass der A*-Algorithmus die korrekte Entfernung vom Startknoten s zum Zielknoten t bestimmt */) zu jedem Knoten v der Wert H[v] „schnell“ berechnet werden kann ... wenn die Heuristik zulässig ist, so ist garantiert, dass die Entfernung von v zum Zielknoten nie „überschätzt“ wird (/* die Umkehrung gilt im allgemeinen nicht */) ... die Kunst besteht darin, beide Aspekte „geeignet“ zu kombinieren (/* die Extreme H[v] = 0 bzw. H[v] = δ(v,t) sind erlaubt, aber nicht so richtig „Ziel führend“ */) 5/3, Folie 43 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Zugrunde liegende Datenstrukturen • • • • die Adjazenzliste A[1..n] von G ein Array D[1..n] (/* in dem sich die „aktuellen“ Schätzwerte “gemerkt“ werden */) ein Array P[1..n] (/* in dem sich für jeden Knoten der „aktuelle“ Vorgänger „gemerkt“ wird */) eine Menge Q (/* um sich die Knoten zu merken, welche noch zu untersuchen sind */) ... in einer „ernsthaften“ Realisierung wird die Menge in einer Min-Prioritätswarteschlange verwaltet (/* die Größe der Arrays sollte aus Gründen der Speicherplatzeffizienz „dynamisch“ angepasst“ werden */) 5/3, Folie 44 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Realisierung • • • • setze D[j] = +∞ und P[j] = 0 für alle j = 1,...,n setze D[s] = 0 setze H[0] = 0 setze Q = { s } while es gibt noch einen Knoten j in Q do • • • • bestimme einen Knoten u in Q, der unter allen Knoten j in Q kleinsten Wert D[j] + H[j] hat if u == t then stoppe streiche u aus Q for alle v ∈ A[u] do • bestimme H[v] • if D[v] > D[u] + w([u,v]) then • 5/3, Folie 45 © 2011 Prof. Steffen Lange - HDa/FbI setze D[v] = D[u] + w([u,v]) und P[v] = u - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) • wir untersuchen jetzt, warum der A*-Algorithmus funktioniert, wenn die verwendete Heuristik eine zulässige Heuristik ist (/* ... nebenbei werden wir sehen, weshalb die gewählten Eigenschaften einer zulässigen Heuristik „wichtig“ sind */) • zugrunde liegende Idee: • • es sei u irgendein Knoten wir werden zeigen, dass in dem Schritt, in dem u aus Q gestrichen wird, bereits D[u] = δ(s,u) gilt ... das dann in späteren Schritten der Wert D[u] nicht mehr verändert wird, sollte klar sein ... diese Aussage wird man „nur“ induktiv beweisen können 5/3, Folie 46 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) 5/3, Folie 47 • der Induktionsanfang sollte klar sein (/* im ersten Schritt wird s aus Q entfernt und es gilt danach D[s] = δ(s,u) = 0 */) • die Induktionsvoraussetzung lautet: nach Schritt k gilt für alle Knoten v, die schon mal in Q waren und bereits wieder aus Q entfernt wurden, D[v] = δ(s,v) (/* die Menge dieser Knoten sei im Folgenden mit S bezeichnet */) • es sei u der Knoten, der in Schritt k+1 aus der Menge Q entfernt wird • wir nehmen an, dass D[u] > δ(s,u) nach Schritt k+1 gilt (/* das nicht D[u] < δ(s,u) gelten kann, sollte unmittelbar klar sein */) • es sei also P = (v0,...,vk+1) ein kürzester Pfad vom Startknoten s zum Knoten u (/* also gilt w(P) = δ(s,u) < D[u] */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) • im Pfad P = (v0,...,vz+1) sei vi der Knoten mit dem maximale Index, so dass vi ∈ S nach Schritt k gilt • • wir betrachten das Anfangsstück Pa = (v0,..,vi,vi+1) von P nach Induktionsvoraussetzung muss D[vi] = δ(s,vi) nach Schritt k gelten • also gilt δ(s,u) = D[vi] + w(vi,vi+1)+ w(vi+1,vi+2) + w(vi+2,vi+3) + ... + w(vz,vz+1) • da H eine zulässige Heuristik ist gilt: • • • • 5/3, Folie 48 H(vi+1) ≤ w(vi+1,vi+2) + H(vi+2); also auch H(vi+1) - H(vi+2) ≤ w(vi+1,vi+2) H(vi+2) ≤ w(vi+2,vi+3) + H(vi+3); also auch H(vi+2) - H(vi+3) ≤ w(vi+2,vi+3) ... H(vz) ≤ w(vz,vz+1) + H(vz+1); also auch H(vz) - H(vz-1) ≤ w(vz,vz+1) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Korrektheit */) • durch Einsetzen erhalten wir: • • δ(s,u) ≥ D[vi] + w(vi,vi+1) + H(vi+1) - H(vi+2) + H(vi+2) - H(vi+3) + ... + H(vz-1) - H(vz) also gilt auch: • δ(s,u) ≥ D[vi] + w(vi,vi+1) + H(vi+1) - H(vk) = D[vi+1] + H(vi+1) - H(vk) • wegen H(vk) ≥ 0, gilt auch: δ(s,u) ≥ D[vi+1] + H(vi+1) • da nach Annahme D[u] > δ(s,u) gilt, muss wegen H(u) ≥ 0 aber auch D[u] + H(u) > D[vi+1] + H(vi+1) gelten • dann hätte aber der A*-Algorithmus den Knoten vi+1 anstelle des Knotens u im Schritt k+1 aus der Menge S entfernen müssen ... und damit kann unsere Annahme, dass D[u] > δ(s,u) gilt, nicht korrekt sein 5/3, Folie 49 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen (/* Laufzeit */) 5/3, Folie 50 • zur Laufzeit des A*-Algorithmus kann man allgemein nur sagen, dass sie in der Größenordnung der Laufzeit des Algorithmus von Dijkstra liegt (/* dazu kommt die Zeit zur Bestimmung von H[v] für jeden Knoten v, der in die Menge Q aufgenommen wird */) • die Wahl der verwendeten zulässigen Heuristik ist entscheidend • für viele Anwendungsbereiche sind „sinnvolle“ Heuristiken bekannt © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Eine Spielanwendung aus dem Bereich der Künstlichen Intelligenz • • • es geht darum, dass folgende Puzzle zu lösen (/* früher hieß das Schiebefax und es war in einer 4×4 Version in jedem Spielwarengeschäft erhältlich */) beim Schiebefax sind Kacheln (/* in der 3×3 Version mit den Zahlen 1 bis 8 beschriftet */) so in einen Rahmen eingebaut, dass man sie horizontal und vertikal verschieben kann das Ziel ist es, mit möglichst wenigen Zügen aus der gegebenen Situation die sortierte Zielsituation zu erreichen 5 8 1 4 5/3, Folie 51 © 2011 Prof. Steffen Lange 7 - 2 1 2 3 3 4 5 6 6 7 8 HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Modellierung • • • jede mögliche Situation wird als Knoten in einem gerichteten Graphen aufgefasst von einem Knoten u gibt es eine Kante zu einem Knoten v, falls die zu u gehörende Situation mit einem Zug in die zu v gehörende Situation überführt werden kann jede Kante bekommt das Gewicht 1 5 8 1 4 5 4 5/3, Folie 52 8 2 5 1 3 1 7 6 4 © 2011 Prof. Steffen Lange - HDa/FbI 2 3 7 6 2 5 8 8 3 1 3 7 6 4 7 - Graphen und Optimierung 2 6 5 8 2 1 7 3 4 6 Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Modellierung • um das interessierende Problem zu lösen, ist offenbar in dem nur „implizit“ gegebenen Graph ein kürzester Pfad zwischen den zugehörigen Knoten zu bestimmen 5 8 1 4 5/3, Folie 53 2 ... 3 7 © 2011 Prof. Steffen Lange 6 - HDa/FbI - Graphen und Optimierung 1 2 3 4 5 6 7 8 Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen • es verbietet sich offenbar, den Algorithmus von Dijsktra anzuwenden • • falls ein kürzester Pfad das Gewicht k hat, kann man davon ausgehen, das sukzessive mindestens 2k-1 viele Knoten erzeugt werden müssen (/* in jeder Situation sind mindestens zwei Spielzüge möglich */) mit Hilfe des A*-Algorithmus kann man dieses Problem vermutlich „effizienter“ lösen ... was noch fehlt ist eine zulässige Heuristik 5/3, Folie 54 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Eine zulässige Heuristik • wir verwenden die so genannte Manhattan-Distanz, um die Entfernung einer Situation zur Zielsituation zu „schätzen“ • dazu bestimmen wir für jede Kachel in der „aktuellen“ Situation, wie viele Züge minimal nötig sind, um sie an ihre richtige Position in der Zielsituation zu „verschieben“ und summieren über alle diese Werte 5 8 1 4 5/3, Folie 55 2 3 7 6 • • 1 2 3 4 5 6 7 8 © 2011 Prof. Steffen Lange - für 1,2,3,4,6 und 7: jeweils 1 legaler Zug für 5 und 8: jeweils 2 legale Züge ... für die Situation u gilt: H[u] = 10 HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkungen • • • 5/3, Folie 56 es seien u die aktuelle Situation und v eine durch einen Zug erreichbare Situation falls H[u] bekannt ist, kann man H[v] schnell berechnen (/* es genügt, für die Kachel, die verschoben wurde, zu bestimmen, wie viele Züge jetzt nötig sind, um sie an ihre richtige Position in der Zielsituation zu verschieben */) falls u die Anfangssituation ist, muss ein wenig mehr Aufwand betrieben werden (/* es geht aber immer noch „hinreichend“ schnell */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Hintergrund • es sei F[i,j] die aktuelle Position von Kachel z in der Anfangssituation • • • • • 5/3, Folie 57 da die Kachel 1 ins Feld F[1,1] gehört, wären |i-1|+|j-1| Züge nötig, falls z = 1 gilt da die Kachel 2 ins Feld F[1,2] gehört, wären |i-1|+|j-2| Züge nötig, falls z = 2 gilt da die Kachel 3 ins Feld F[1,3] gehört, wären |i-1|+|j-3| Züge nötig, falls z = 3 gilt ... da die Kachel 8 ins Feld F[3,2] gehört, wären |i-3|+|j-2| Züge nötig, falls z = 8 gilt © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Anmerkung • die angegebene Heuristik ist offenbar eine zulässige Heuristik Begründung: 5/3, Folie 58 • es seien u die aktuelle Situation und v eine durch einen Zug erreichbare Situation • • offenbar gilt entweder H[v] = H[u] + 1 oder H[v] = H[u] - 1 also gilt in beiden Fällen H[u] ≤ w([u,v]) + H[v] © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 5: Kürzeste Pfade Spezialfall: Graphen mit nichtnegativen Gewichten Ergänzung • wenn man mit Hilfe des A*-Algorithmus das betrachtete Beispiel löst • • 5 8 1 4 7 werden insgesamt 24 Situationen „neu erzeugt“ wird festgestellt, dass 10 Züge genügen, um die Anfangssituation in die Zielsituation zu überführen 2 5 2 3 1 8 3 6 4 7 6 5/3, Folie 59 © 2011 Prof. Steffen Lange - HDa/FbI 2 1 5 2 8 3 4 8 3 4 7 6 7 6 2 1 5 2 1 5 2 3 4 8 3 6 7 2 1 8 3 4 7 6 1 ... 5 5 1 4 5 3 4 7 8 6 7 - Graphen und Optimierung 8 6