Κατανεμημένα Συστήματα Ι Παναγιώτα Παναγοπούλου Χριστίνα Σπυροπούλου 8η Διάλεξη 8 Δεκεμβρίου 2016 1 Ασύγχρονη κατασκευή BFS δέντρου Στα σύγχρονα συστήματα ο αλγόριθμος της πλημμύρας είναι ένας απλός αλλά αποτελεσματικός τρόπος για να κατασκευαστεί ένα γεννητικό δέντρο αναζήτησης πρώτα κατά πλάτος (breadth first search BFS). Ωστόσο, στα ασύγχρονα συστήματα τα γεννητικά δέντρα που κατασκευάζονται από τον αλγόριθμο της πλημμύρας μπορούν να απέχουν πολύ από BFS. Σε αυτή την περίπτωση εφαρμόζουμε δύο κλασικές τεχνικές κατασκευής δέντρου BFS, τον αλγόριθμο του Dijkstra και τον αλγόριθμο των Bellman-Ford, ως ασύγχρονους αλγορίθμους. Υποθέτουμε ότι το δίκτυο είναι ένα μη κατευθυνόμενο γράφημα G = (V, E) με n = V κορυφές (κόμβους) και m = V πλευρές (ακμές). 1.1 Αλγόριθμος Dijkstra για BFS Ξεκινάμε με τον αλγόριθμο του Dijkstra. Η βασική ιδέα είναι να προσθέτουμε πάντα τον κοντινότερο κόμβο στο ήδη κατασκευασμένο τμήμα του δέντρου BFS. Μπρούμε να παραλληλοποιήσουμε αυτή την ιδέα αναπτύσσοντας το BFS δέντρο επίπεδο προς επίπεδο. Ο αλγόριθμος προχωράει σε φάσεις. Στη φάση p ανιχνεύονται οι κόμβοι σε απόσταση p από τη ρίζα. Έστω T p το δέντρο στη φάση p. 1
Αλγόριθμος BFS Dijkstra 1. Ξεκινάμε με το T 1 που αποτελείται από τη ρίζα μαζί με όλους τους άμεσους γείτονες της ρίζας. Ξεκινάμε με τη φάση p = 1 : 2. repeat 3. Η ρίζα ξεκινά τη φάση p εκπέμποντας ένα μήνυμα start p μέσα στο T p. 4. Όταν ένας κόμβος-φύλλο u του T p (δηλαδή, ένας κόμβος που μόλις ανακαλύφθηκε στην τελευταία φάση) λάβει start p, στέλνει ένα μήνυμα join p + 1 προς όλους εκείνους τους γείτονές του από τους οποίους δεν έχει λάβει έως τώρα κάποιο μήνυμα. 5. Ένας κόμβος v που λαμβάνει για πρώτη φορά το μήνυμα join p+1 απαντά με ACK και γίνεται ένα φύλλο του δέντρου T p+1. 6. Αν ο κόμβος v λάβει κάποιο οποιοδήποτε άλλο μήνυμα join απαντά με ΝΑCΚ. 7. Όταν τα φύλλα του T p συλλέξουν όλες τις απαντήσεις από τους γεείτονές τους, τότε τα φύλλα ξεκινούν έναν αλγόριθμο ηχούς προς τη ρίζα. 8. Όταν η διαδικασία της ηχούς τερματίσει στη ρίζα, η ρίζα αυξάνει τη φάση. 9. until δεν ανιχνεύθηκε κανένας νέος κόμβος. Ανάλυση πολυπλοκότητας. Έστω diam η διάμετρος του γραφήματος (η μέγιστη απόσταση ανάμεσα σε δύο οποιουσδήποτε κόμβους). Ένας αλγόριθμος flooding/echo στο T p χρειάζεται χρόνο 2diam το πολύ. Η εύρεση νέων γειτόνων στα φύλλα κοστίζει 2 μονάδες χρόνου. Δεδομένου ότι το ύψος του δέντρου BFS φράσσεται από τη διάμετρο, έχουμε diam φάσεις, που δίνουν μια συνολική χρονική πολυπλοκότητα O(diam 2 ). Κάθε κόμβος που συμμετέχει σε flooding/echo λαμβάνει μόνο το πολύ 1 μήνυμα και στέλνει το πολύ μία φορά. Δεδομένου ότι υπάρχουν diam φάσεις, το κόστος φράσσεται από O(n diam). Σε κάθε ακμή υπάρχουν το πολύ 2 μηνύματα join. Οι απαντήσεις σε ένα αίτημα join δίνονται από 1 ACK ή ΝΑCΚ, το οποίο σημαίνει ότι έχουμε το πολύ 4 επιπλέον μηνύματα ανά ακμή. Ως εκ τούτου, η πολυπλοκότητα επικοινωνίας είναι O(m + n diam). 1.2 Αλγόριθμος Bellman-Ford για BFS Η ιδέα του αλγορίθμου Bellman-Ford είναι απλά να κρατάμε σε κάθε κόμβο τη σωστή απόσταση από τη ρίζα. Εάν ένας γείτονας κάποιου κόμβου έχει βρει μια καλύτερη διαδρομή για τη ρίζα, τότε ενδέχεται ο κόμβος να χρειαστεί να ενημερώσει και τη δική του απόσταση από τη ρίζα. 2
Αλγόριθμος BFS Bellman-Ford 1. Κάθε κόμβος u αποθηκεύει έναν ακέραιο d u που αντιστοιχεί στην απόσταση του u από τη ρίζα. Αρχικά d root = 0, και d u = για κάθε άλλο κόμβο u. 2. Η ρίζα ξεκινά τον αλγόριθμο στέλνοντας 1 σε όλους τους γείτονες. 3. if ένας κόμβος u λάβει ένα μήνυμα y με y < d u από έναν γείτονα v then 4. ο κόμβος u θέτει d u := y 5. ο κόμβος u στέλνει y + 1 σε όλους τους γείτονες (εκτός του v) 6. endif Ανάλυση πολυπλοκότητας. Θα αποδείξουμε ότι η χρονική πολυπλοκότητα του αλγορίθμου Bellman- Ford είναι O(diam). Θα χρησιμοποιήσουμε τη μέθοδο της επαγωγής. Συγκεκριμένα, θα αποδείξουμε ότι ένας κόμβος σε απόσταση d από τη ρίζα έχει λάβει το μήνυμα d σε χρόνο d, δηλαδή γνωρίζει σε χρόνο d ότι απέχει d από τη ρίζα. Επαγωγική βάση. Η ρίζα ξέρει από το χρόνο 0 οτι είναι η ρίζα. Επαγωγική υπόθεση. Έστω ότι κάθε κόμβος σε απόσταση d 1, για κάποιο d 1, έχει λάβει σε χρόνο d 1 ένα μήνυμα d 1. Επαγωγικό βήμα. Ένας κόμβος v σε απόσταση d έχει ένα γείτονα u σε απόσταση d 1. Ο κόμβος u, από την επαγωγική υπόθεση, στέλνει ένα μήνυμα d στον u σε χρόνο d 1 ή νωρίτερα, το οποίο στη συνέχεια λαμβάνεται από τον v σε χρόνο d ή νωρίτερα. Η πολυπλοκότητα επικοινωνίας είναι ευκολότερη: Ένας κόμβος μπορεί να μειώσει την απόστασή του το πολύ n 1 φορές, όπου κάθε φορά στέλνει ένα μήνυμα προς όλους τους γείτονές του. Αν όλοι οι κόμβοι το κάνουν αυτό, τότε έχουμε O(nm) μηνύματα. 2 Ασύγχρονη κατασκευή MST Υπάρχουν διάφοροι τύποι γεννητικών δέντρων, με το καθένα να εξυπηρετεί ένα διαφορετικό σκοπό. Ένα ιδιαίτερα ενδιαφέρον γεννητικό δένδρο είναι το ελάχιστο γεννητικό δένδρο (minimum spanning tree, MST). Το πρόβλημα κατασκευής ενός MST έχει νόημα μόνο σε γραφήματα με βάρη. Στο εξής λοιπόν υποθέτουμε ότι κάθε ακμή e του γραφήματος έχει ένα (μη αρνητικό) βάρος w e. Ορισμός 1 Δοθέντος ενός γραφήματος με βάρη G = (V, E, w), το MST του G είναι ένα γεννητικό δένδρο T που ελαχιστοποιεί το w(t ), όπου w(g ) = e G w e για οποιαδήποτε υπογράφημα G G. 3
Στη συνέχεια θα κάνουμε την υπόθεση ότι δεν υπάρχουν δύο ακμές του γραφήματος που να έχουν το ίδιο βάρος. Αυτό απλοποιεί το πρόβλημα, καθώς κάνει το MST μοναδικό, ωστόσο η απλούστευση αυτή δεν είναι απαραίτητη γιατί πάντα μπορούμε να σπάσουμε την ομοιομορφία λαμβάνοντας υπόψη και τα IDs των κορυφών μιας πλευράς μαζί με το βάρος της. Προφανώς μας ενδιαφέρει ο υπολογισμός του MST με έναν κατανεμημένο τρόπο. Για το σκοπό αυτό χρησιμοποιούμε ένα γνωστό λήμμα: Ορισμός 2 (Μπλε πλευρές, blue edges) Έστω T ένα γεννητικό δένδρο του γραφήματος με βάρη G και T T ένα υπογράφημα του T. Η πλευρά e = (u, v) είναι μια εξερχόμενη πλευρά του T αν u T και v / T (ή και αντιστρόφως). Η εξερχόμενη πλευρά με το ελάχιστο βάρος b(t ) ονομάζεται μπλε πλευρά του T. Λήμμα 1 Για ένα δεδομένο γράφημα με βάρη G (τέτοιο ώστε να μην υπάρχουν δύο πλευρές με ίδια βάρη), έστω T το MST του G και T ένα τμήμα (υπογράφημα) του T. Τότε η μπλε πλευρά του T είναι επίσης μέρος του T, δηλαδή T b(t ) T. Απόδειξη. Με απαγωγή σε άτοπο. Έστω ότι στο MST T υπάρχει ακμή e b(t ) που συνδέει το T με το υπόλοιπο T. Προσθέτοντας την μπλε πλευρά b(t ) στο MST T έχουμε έναν κύκλο, που περιλαμβάνει και την e και την b(t ). Αν αφαιρέσουμε την e από αυτόν τον κύκλο, τότε έχουμε ένα άλλο γεννητικό δένδρο, και επειδή από τον ορισμό της μπλε ακμής w e > w b(t ), το βάρος του νέου αυτού γεννητικού δένδρου είναι μικρότερο από το βάρος του T, που είναι άτοπο. Με άλλα λόγια, οι μπλε πλευρές φαίνεται να είναι το κλειδί για την ανάπτυξη ενός κατανεμημένου αλγορίθμου για το πρόβλημα MST. Δεδομένου ότι κάθε κόμβος είναι ένα τμήμα (υπογράφημα) του MST, τότε κάθε κόμβος έχει αυτομάτως μια μπλε πλευρά! Το μόνο που χρειάζεται να κάνουμε είναι να μεγαλώσουμε αυτά τα τμήματα. Ουσιαστικά αυτή είναι μια κατανεμημένη έκδοση του ακολουθιακού αλγορίθμου του Kruskal. Σε κάθε δεδομένη στιγμή οι κόμβοι του γραφήματος διαμερίζονται σε τμήματα (υποδένδρα του MST). Κάθε τμήμα έχει μια ρίζα, και το ID του τμήματος ορίζεται ως το ID της ρίζας του. Κάθε κόμβος γνωρίζει τον πατέρα του και τα παιδιά του στο τμήμα. Ο αλγόριθμος λειτουργεί σε φάσεις. Κατά την έναρξη μιας φάσης, οι κόμβοι γνωρίζουν τα IDs των τμημάτων των γειτονικών τους κόμβων. 4
Αλγόριθμος GHS (Gallager Humblet Spira) 1. Αρχικά κάθε κόμβος είναι η ρίζα του δικού του τμήματος. Προχωρούμε σε φάσεις: 2. repeat 3. Όλοι οι κόμβοι μαθαίνουν τα IDs των τμημάτων των γειτόνων τους. 4. Η ρίζα του κάθε τμήματος χρησιμοποιεί flooding/echo στο τμήμα της για να προσδιορίσει τη μπλε πλευρά b = (u, v) του τμήματος. 5. Η ρίζα στέλνει ένα μήνυμα στον κόμβο u. Καθώς προωθεί το μήνυμα στο μονοπάτι από τη ρίζα στον κόμβο u, όλες οι σχέσεις γονέα-παιδιού αντιστρέφονται (έτσι ώστε το u είναι η νέα προσωρινή ρίζα του τμήματος). 6. Ο κόμβος u στέλνει ένα αίτημα συγχώνευσης στη μπλε πλευρά b = (u, v). 7. if ο κόμβος v έστειλε επίσης ένα αίτημα συγχώνευσης στην ίδια μπλε πλευρά b = (v, u) then 8. είτε η u ή η v (όποια από τις δύο έχει το μικρότερο ID) είναι η νέα ρίζα του τμήματος 9. η μπλε πλευρά b κατευθύνεται ανάλογα 10. else 11. ο κόμβος v είναι ο νέος γονέας του κόμβου u 12. endif 13. ο νέος κόμβος-ρίζα ενημερώνει όλους τους κόμβους στο τμήμα του (και πάλι χρησιμοποιώντας flooding/echo) σχετικά με την ταυτότητά του 14. until όλοι οι κόμβοι είναι στο ίδιο τμήμα (δηλαδή, δεν υπάρχει καμμία εξερχόμενη πλευρά). Ανάλυση πολυπλοκότητας. Κάθε φάση αποτελείται κυρίως από δύο διαδικασίες flooding/echo. Γενικά, το flooding/echo κόστος σε ένα δέντρο είναι O(diam) χρόνος και O(n) μηνύματα. Ωστόσο, η διάμετρος diam των τμημάτων μπορεί να αποδειχθεί οτι δεν σχετίζεται με τη διάμετρο του γραφήματος, επειδή το MST μπορεί να είναι εκφυλλισμένο (μια γραμμή). Επομένως η χρονική πολυπλοκότητα είναι στην πραγματικότητα O(n). Επιπλέον, κατά το πρώτο βήμα της κάθε φάσης, οι κόμβοι πρέπει να μάθουν το ID του τμήματος κάθε γείτονά τους. Αυτό μπορεί να γίνει σε 2 βήματα, αλλά κοστίζει O(m) μηνύματα. Συνολικά μια φάση κοστίζει O(n) χρόνο και O(m) μηνύματα. Έτσι, μένει μόνο να υπολογίσουμε τον αριθμό των φάσεων: Αρχικά όλα τα τμήματα είναι μονοί κόμβοι και ως εκ τούτου έχουν μέγεθος 1. Σε κάθε επόμενη φάση, κάθε τμήμα συγχωνεύεται με τουλάχιστον ένα άλλο τμήμα, δηλαδή, το μέγεθος του μικρότερου τμήματος τουλάχιστον διπλασιάζεται. Με άλλα λόγια, έχουμε το πολύ log n φάσεις. Άρα η πολυπλοκότητα χρόνου είναι O(n log n) και η πολυπλοκότητα επικοινωνίας είναι O(m log n). 5