Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler."—  Präsentation transkript:

1

2 Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler Fachbereich GIS HTW

3 -2- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen 4.3.2 Minimum Spannung Trees MST für gewichtete Graphen Zur Wiederholung: Beispiele am Applet In Informatik 2: Algorithmen von Kruskal und Prim Kurze Wiederholung (mit anderer Sichtweise): Beide Algorithmen basieren auf folgender „Greedy-Strategie“ (was ist eine Greedy-Strategie?): while Kantenmenge A noch kein spanning tree dofinde eine sichere Kante {u,v} für A füge {u,v} zu A hinzu return A Sicher für A: ist A ein Subset eines MST, dann ist A nach Hinzunahme der Kante immer noch ein Subset eines MST

4 -3- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Kruskal: Der Algorithmus bildet aus einem „Wald“ nach und nach einen MST Pseudonotation: Gegeben: Graph G mit Knotenmenge V(G), Kantenmenge E(G) mit Gewichten Gesucht: MST als Kantenmenge A Start: A = {} jedes Element aus V(G) bildet einen (trivialen) Baum sortiere alle Kanten aus E(G) in aufsteigender Reihenfolge ihrer Gewichte w

5 -4- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Hauptschleife: for jede Kante {u,v} aus E in aufsteigender Reihenfolge if (u und v gehören zu unterschiedlichen Bäumen X und Y des Walds) füge {u,v} zu A hinzu vereinige X und Y zu einem neuen Baum Z Ende: return A

6 -5- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Prim: Der MST wird Knoten für Knoten gebildet jeweils unter Hinzunahme einer Kante und der beteiligten Knoten Der Algorithmus benutzt eine priority queue PQ für Kanten, Priorität gemäss Gewicht der Kanten Gesucht: MST als Baum A (d.h. enthält Knoten und Kanten) Start: A enthält einen Startknoten r, leere priority queue PQ

7 -6- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Hauptscheife: while A enthält noch nicht alle Knoten des Graphs sei u der zuletzt zu A hinzugefügte Knoten insert in PQ alle Kanten {u,v} für nicht zu A gehörende v remove Kante {x,y} aus PQ, füge sie und den dadurch hinzukommenden Knoten zu A hinzu Ende: return A

8 -7- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Bemerkungen: Wir müssen dafür sorgen, dass wir keine unnötigen Kanten hinzunehmen. Dies bedeutet entweder  jedes mal, wenn wir einen Knoten zum MST hinzufügen, müssen wir aus der PQ alle Kanten zu diesem Knoten entfernen oder  wir müssen dafür sorgen, dass immer nur eine Kante zu einem noch nicht zum MST gehörenden Knoten in PQ ist (dann natürlich die „leichteste“) In der Folge verfolgen wir die zweite Alternative.

9 -8- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Natürlich müssen wir hierzu die PQ Item für Item durchsuchen. Dies ist keine besonders effiziente Angelegenheit, aber wir haben keine Wahl. Auch bei der ersten Alternative müssten wir dies zu einem anderen Zeitpunkt machen. Zur Implementierung: Wir betrachten im folgenden einen Ausschnitt aus der Implementierung mit dem MST-Algorithmus mstw (w steht für „weighted“).

10 -9- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen public void mstw() // minimum spanning tree { currentVert = 0; // start at 0 while(nTree < nVerts-1) // while not all verts in tree { // put currentVert in tree vertexList[currentVert].isInTree = true; nTree++;

11 -10- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen // insert edges adjacent to currentVert into PQ for(int j=0; j<nVerts; j++) // for each vertex, { if(j==currentVert) // skip if it's us continue; if(vertexList[j].isInTree) // skip if in the tree continue; int distance = adjMat[currentVert][j]; if( distance == INFINITY) // skip if no edge continue; putInPQ(j, distance); // put it in PQ (maybe) }

12 -11- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen if(thePQ.size()==0) // no vertices in PQ? {... Was bedeutet das ? } // remove edge with minimum distance, from PQ Edge theEdge = thePQ.removeMin(); int sourceVert = theEdge.srcVert; currentVert = theEdge.destVert; // display edge from source to current... } // end while(not all verts in tree)

13 -12- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen // mst is complete for(int j=0; j<nVerts; j++) // unmark vertices vertexList[j].isInTree = false; } // end mstw optionale Übungsaufgabe: Gesamtapplikation für MST für gewichtete Graphen mit allen zugehörigen Datenstrukturen:  vertex, edge, graph  priorityQ  übliche Methoden + putInPQ (Achtung, das ist nicht das insert von priorityQ!)

14 -13- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen 4.4 shortest path Das Grundproblem „finde den kürzesten (billigsten, leichtesten,...) Pfad von einem Knoten u zu einem Knoten v eines gewichteten Graphen G“ stellt sich in einer riesigen Anzahl von konkreten Anwendungen wie  Integrierte Schaltkreise  Projektplanung  Routenplanung ...

15 -14- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Es gibt etliche Varianten des Problems:  Single-source shortest path  Finde den jeweils kürzesten Weg von einem Knoten u zu allen anderen Knoten v des Graphs  Single destination shortest path  Finde den jeweils kürzesten Weg zu einem Knoten v von allen anderen Knoten u des Graphs  Single pair shortest path  Wie vorne, wird natürlich von single source „mitgelöst“. Ausserdem: es gibt single pair keinen grössenordnungsmässig schnelleren als single source  All-pair shortest path  Finde den jeweils kürzesten Weg einem beliebigen Knoten u und einem beliebigen anderen Knoten v des Graphs. Es gibt schnellere Lösungen als single source für alle Knoten.

16 -15- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Single source shortest path Beipiel am Applet Algorithmus von Dijkstra  verwendet ein shortest path array spath  die Zeile der Adjazenzmatrix, die zum Startknoten gehört  wird ständig upgedated  markiert „abgearbeitete“ Knoten, jeweils einen pro Schritt  z.B. indem aus ihnen ein spanning tree gebaut wird  bei jedem Schritt  wähle den kleinsten Eintrag in spath für noch nicht abgearbeitete Knoten  füge den entsprechenden Knoten v zum spanning tree hinzu  update spath für alle Knoten, zu denen ein Weg über v kürzer ist als der bisher kürzeste

17 -16- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen public void adjust_sPath() { // adjust values in shortest-path array sPath int column = 1; // skip starting vertex while(column < nVerts) // go across columns { // if this column's vertex already in tree, skip it if( vertexList[column].isInTree ) { column++; continue; }

18 -17- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen // calculate distance for one sPath entry // get edge from currentVert to column int currentToFringe = adjMat[currentVert][column]; // add distance from start int startToFringe = startToCurrent + currentToFringe; // get distance of current sPath entry int sPathDist = sPath[column].distance;

19 -18- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen // compare distance from start with sPath entry if(startToFringe < sPathDist) // if shorter, { // update sPath sPath[column].parentVert = currentVert; sPath[column].distance = startToFringe; } column++; } // end while(column < nVerts) } // end adjust_sPath()


Herunterladen ppt "Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler."

Ähnliche Präsentationen


Google-Anzeigen