Θεωρία ράφων λγόριθμοι BFS, Prim, Dijkstra, Bellman-Ford
Θεωρία γράφων Υπογράφοι και spanning trees Ένας γράφος G =(V,E ) είναι υπογράφος (subgraph) ενός γράφου G=(V,E) αν V ' V και E' E Ένας υπογράφος G =(V,E ) ενός γράφου G=(V,E) ονομάζεται spanning tree του G εάν ο G είναι δένδρο και περιλαμβάνει όλους τους κόμβους του G
Θεωρία γράφων Υπογράφοι και spanning trees Συμπεραίνουμε λοιπόν ότι ένα spanning tree G προκύπτει από ένα γράφο G εάν αφαιρέσουμε ακμές από τον G έτσι ώστε να εκλείψουν τυχόν κύκλοι αλλά ο γράφος να παραμείνει συνδεδεμένος ενικά, ένας γράφος μπορεί να συσχετίζεται με περισσότερα από ένα spanning trees
Θεωρία γράφων Υπογράφοι και spanning trees Το πρόβλημα της εύρεσης ενός spanning tree για ένα γράφο G έχει μελετηθεί εκτενώς Μια από τις γνωστότερες προσεγγίσεις στο πρόβλημα αυτό είναι o αλγόριθμος breadth first search (BFS) οοποίος: πισκέπτεται όλους τους κόμβους και τις ακμές του αρχικού γράφου G Καθορίζει εάν ο G είναι συνδεδεμένος
Spanning trees λγόριθμος BFS φαιρεί όλες τις ακμές του γράφου που δημιουργούν τυχόν κύκλους Πιο συγκεκριμένα, έστω γράφος G=(V,E) e E θεωρούνται ότι είναι στην κατάσταση ρχικά, όλοι οι κόμβοι u V και όλες οι ακμές U (unexplored) Έστω ότι ο αλγόριθμος BFS(G,s) ξεκινάει από τον κόμβο s V
Spanning trees λγόριθμος BFS Ο αλγόριθμος χρησιμοποιεί ένα μηχανισμό συσχετισμού ετικετών: Συσχετίζει την ετικέτα D (discovery) με κάθε ακμή του γράφου την οποία επισκέπτεται για πρώτη φορά Συσχετίζει την ετικέτα V (visited) με κάθε κόμβο του γράφου τον οποίο επισκέπτεται για πρώτη φορά
BFS(G,s) L 0 <s> setlabel(s, V ) i 0 while ( L i <> ) L i + <> for all v in L i for all e in Edges(v) <body> i i + <body>: if (label(e) = U ) w leads(e,v) if (label(w) = U ) setlabel(e, D ) setlabel(w, V ) L i + L i +^<w> else setlabel(e, C )
Spanning trees λγόριθμος BFS Όπου: ια κάθε κόμβο v, η συνάρτησηedges(v) επιστρέφει το σύνολο των ακμών οι οποίες εκκινούν από τον v ια κάθε ακμή ή κόμβο x, η συνάρτηση label(x) επιστρέφει την τρέχουσα ετικέτα του x ια κάθε ακμή ή κόμβο x, η συνάρτηση setlabel(x, L ) προσάπτει την ετικέτα L στον x ια κάθε ακμή e και κόμβο v, ησυνάρτηση leads(e,v) επιστρέφει τον κόμβο στον οποίο καταλήγει η ακμή e εκκινώντας από τον κόμβο v ΗλίσταL i εμπεριέχει τους κόμβους του επιπέδου i
Spanning trees λγόριθμος BFS (Παράδειγμα) Visited Discovered Crossed L 0 αρχικό στάδιο
Spanning trees λγόριθμος BFS (Παράδειγμα) Visited Discovered Crossed L L L
Spanning trees λγόριθμος BFS (Παράδειγμα) Visited Discovered Crossed L L
Spanning trees λγόριθμος BFS (Παράδειγμα) Visited Discovered Crossed L
Spanning trees λγόριθμος BFS (Παράδειγμα) Visited Discovered Crossed L L
Spanning trees λγόριθμος BFS (Παράδειγμα) Visited Discovered Crossed
Spanning trees λγόριθμος BFS O BFS εντοπίζει την απόσταση του συντομότερου μονοπατιού από δεδομένο κόμβο εκκίνησης κ ε προς οποιοδήποτε άλλο κόμβο κ Το συντομότερο μονοπάτι ορίζεται ως ο ελάχιστος αριθμός ακμών που πρέπει να διανύσουμε για να καταλήξουμε από τον κ ε στον κ Κάθε επίπεδο L i ενός spanning tree περιλαμβάνει εκείνους και μόνο εκείνους τους κόμβους που η απόσταση τους από τη ρίζα είναι ακριβώς i ακμές
Spanning trees λγόριθμος του Prim ντοπίζει το ελάχιστο spanning tree για ένα γράφο G=(V,E) με συσχετισμένους συντελεστές βάρους To ελάχιστο spanning tree είναι εκείνο που έχει το ελάχιστο συνολικό μήκος ακμών ρχικά, όλοι οι κόμβοι u V και όλες οι ακμές e E θεωρούνται ότι είναι στην κατάσταση U (unexplored) Έστω ότι ο αλγόριθμος Prim(G,s) ξεκινάει από τον κόμβο s V
Prim(G,s) L {s} setlabel(s, V ) while (L V) dist for all v in L for all e in Edges(v) <body> setlabel(e C, D ) setlabel(next, V ) L L U<next> <body>: if (label(e) = U ) w leads(e,v) if (label(w) = U ) if (weight(e) < dist ) dist weight(e) e C e next w
Spanning trees λγόριθμος Prim (Παράδειγμα) αρχικό στάδιο Visited Chosen L={} L={A} L={A}
Spanning trees λγόριθμος Prim (Παράδειγμα) L={A,} L={A,} L={A,,E} Visited Chosen
Spanning trees λγόριθμος Prim (Παράδειγμα) L={A,,,B} L={A,,E} L={A,,E,B} Visited Chosen
Spanning trees λγόριθμος Prim (Παράδειγμα) L={A,,,B,} L={A,,,B,} L={A,,E,,,} Visited Chosen
Καθορισμός λάχιστου Μονοπατιού Ένα δίκτυο μεταγωγής πακέτων δεδομένων αποτελεί ένα διγράφο Κόμβοι οι πόροι του δικτύου (συμπεριλαμβανομένων των δρομολογητών) κμές οι τηλεπικοινωνιακές γραμμές που διασυνδέουν τους κόμβους ς υποθέσουμε ότι ο κόμβος επιθυμεί να αποστείλει πακέτα δεδομένων στον κόμβο
Καθορισμός λάχιστου Μονοπατιού Ένα πρόβλημα που πρέπει να επιλυθεί είναι ο καθορισμός του δρομολογίου το οποίο θα ακολουθήσουν τα πακέτα κατά τη μετάβαση τους από τον στον Όπως είναι προφανές το συντομότερο δρομολόγιο από τον στον είναι και το επιθυμητό
Καθορισμός λάχιστου Μονοπατιού Ο καθορισμός του συντομότερου μονοπατιού βασίζεται σε κάποιο κριτήριο ελάχιστου κόστους το οποίο μπορεί να συσχετίζεται με παράγοντες όπως: Χωρητικότητα τηλεπικοινωνιακών γραμμών Τρέχων τηλεπικοινωνιακός φόρτος γραμμών Οικονομικό κόστος χρήσης τηλεπικοινωνιακών γραμμών
Καθορισμός λάχιστου Μονοπατιού Κάθε τηλεπικοινωνιακή ζεύξη λοιπόν ανάμεσα σε δύο πόρους ενός δικτύου συσχετίζεται με μία τιμή η οποία και περιγράφει το κόστος επικοινωνίας μέσω της ζεύξης αυτής Η τιμή αυτή αποτελεί το συντελεστή βάρους της αντίστοιχης ακμής που αναπαριστά την τηλεπικοινωνιακή ζεύξη
Καθορισμός λάχιστου Μονοπατιού Ως κόστος ενός μονοπατιού ορίζεται το άθροισμα των τιμών αυτών για όλες τις ζεύξεις από τις οποίες διέρχεται Οι περισσότεροι αλγόριθμοι εύρεσης μονοπατιού ελάχιστου κόστους βασίζονται σε δύο κυρίως αλγορίθμους: Τον αλγόριθμο του Dijkstra Τον αλγόριθμο Bellman-Ford
λγόριθμος του Dijkstra Έστω γράφος G=(V,E) με συνδεδεμένους συντελεστές βάρους ρχικά, ο αλγόριθμος εντοπίζει τον κοντινότερο απευθείας συνδεδεμένο κόμβο κ στο ριζικό κόμβο εκκίνησης s Ο κόμβος κ έχει πλέον ανακαλυφθεί ν συνεχεία, εντοπίζει τον κοντινότερο στον s κόμβο κ τέτοιον ώστε Ο κ δεν έχει ήδη ανακαλυφθεί
λγόριθμος του Dijkstra Ο κ είναι απευθείας συνδεδεμένος είτε με τον s είτε με κάποιο κόμβο που έχει ήδη ανακαλυφθεί υτό συνεχίζεται μέχρι να ανακαλυφθούν όλοι οι κόμβοι ρχικά όλοι οι κόμβοι v V οι οποίοι δεν είναι απευθείας συνδεδεμένοι με τον s θεωρούνται ότι έχουν άπειρη απόσταση από τον s
Dijkstra(G,s) <> L {s} setlabel(s,0) while (L V) dist for all v in L for all e in Edges(v) <body> setlabel(next, dist) E E^< e C > L L U{next} <body>: w leads(e,v) if (w L) d(s,w) label(v)+weight(e) if (dist d(s,w) ) dist d(s,w) e C e next w
λγόριθμος Dijkstra (Παράδειγμα) Visited Chosen αρχικό στάδιο L={} E=<> L={A} E=<> L={A} E=<> 0 0
λγόριθμος Dijkstra (Παράδειγμα) Visited Chosen L={A,} L={A,} L={A,,E} E=<(,)> E=<(,)> E=<(,), (,E)> 0 0 0
λγόριθμος Dijkstra (Παράδειγμα) Visited Chosen L={A,,E} E=<(,), (,E)> 0 L={A,,E,B} E=<(,), (,E), (A,B)> 0 L={A,,E,B} E=<(,), (,E), (A,B)> 0
λγόριθμος Dijkstra (Παράδειγμα) Visited Chosen L={A,,E,B,} E=<(,), (,E), (A,B),(,)> 0 5 L={A,,E,B,} E=<(,), (,E), (A,B),(,)> 0 5 L={A,,E,B,,} E=<(,), (,E), (A,B),(,),(,)> 0 5 7
λγόριθμος του Dijkstra Ο ιστότοπος http://www.dgp.toronto.edu/people/jamesstewa rt/70/979s/laffra/dijkstraapplet.html περιέχει ένα applet ιδανικό για εξάσκηση και εξοικείωση με τον αλγόριθμο του Dijkstra
λγόριθμος Bellman-Ford Έστω γράφος G=(V,E) με συσχετισμένους συντελεστές βάρους ρχικά, ο αλγόριθμοςεντοπίζειτοελάχιστο μονοπάτιαπότοριζικόκόμβοεκκίνησηςs αποτελούμενο από μία ζεύξη ν συνεχεία, εντοπίζει το ελάχιστο μονοπάτιαπότοριζικόκόμβοεκκίνησηςs αποτελούμενο από δύο ζεύξεις
λγόριθμος Bellman-Ford ν συνεχεία, εντοπίζει το ελάχιστο μονοπάτιαπότοριζικόκόμβοεκκίνησηςs αποτελούμενο από τρεις ζεύξεις Συνεχίζει κατά τον τρόπο αυτό για n- φορές όπου n τοπλήθοςτωνκόμβωνστο σύνολο V ρχικά όλοι οι κόμβοι v θεωρούνται ότι έχουν άπειρη απόσταση από τον s
Bellman-Ford(G,s) L i (s)=0 (for all i [, V -]) path(s)=<> for each v V if (v s) path 0 (v) <> L 0 (v) for i to V - for each v V-{s} <body> <body>: L i (v) L i- (v) path i (v) path i- (v) for each u V-{v} if (L i- (u) + w(u,v)< L i (v)) L i (v) L i- (u)+w(u,v) path i (v) path i- (u)^<(u,v)>
λγόριθμος Bellman-Ford Όπου: ια κάθε κόμβο v, η συνάρτησηpath(v) επιστρέφει ένα μονοπάτι στον v ια κάθε κόμβο v, η συνάρτησηl i (v) επιστρέφει την ετικέτα του v στο γύρο i του αλγορίθμου ια κόμβους v,u, ησυνάρτησηw(u,v) επιστρέφει τo συντελεστή βάρους της ζεύξης μεταξύ των δύο κόμβωνήτηντιμή σεπερίπτωσηπουηζεύξη δεν υφίσταται
λγόριθμος Bellman-Ford (Παράδειγμα) 5 0 i=0 i= 5 0 5 0 5 0 i= 5 0 5 3 7 i=3
λγόριθμος Bellman-Ford (Παράδειγμα) i= 3 0 5 7 5 i=5 3 0 5 7 5
λγόριθμος Bellman-Ford Σημείωση: Ο παραπάνω αλγόριθμος δεν παίρνει υπόψη αρνητικούς συντελεστές βάρους και ως εκ τούτου αποτελεί υποπερίπτωση του αλγορίθμου Bellman-Ford