ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΧΕΔΙΑΣΜΟΣ ΚΑΙ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 00 Ιστοσελίδα μαθήματος: http://eclass.teilam.gr/di88 6ο ΕΡΓΑΣΤΗΡΙΟ Το πρόβλημα της συντομότερης διαδρομής Πολλά προβλήματα βελτιστοποίησης ανάγονται στην εύρεση της συντομότερης διαδρομής ανάμεσα σε κάποιες κορυφές ενός γραφήματος. Προφανώς, η συντομότερη διαδρομή που συνδέει δύο κορυφές δεν περιέχει κύκλους επομένως της όλες οι κορυφές είναι διαφορετικές, δηλαδή είναι ένα μονοπάτι του γραφήματος. Υπενθύμιση:Μονοπάτιμεαρχήτηνκορυφή vκαιπέραςτηνκορυφή uσεέναγράφημαονομάζεταιμια ακολουθίακορυφών v,v,...,v k,γιατηνοποίαισχύουνότι v = v, v k = u,γιακάθεζεύγοςδιαδοχικών κορυφών υπάρχει δεσμός μεταξύ τους(ή τόξο από την πρώτη προς την δεύτερη) και κάθε κορυφή εμφανίζεται ακριβώς μια φορά. Το μονοπάτι αυτό ονομάζεται (v, u)-μονοπάτι. Ο αριθμός των δεσμών(ή τόξων) που συνδέουν τις κορυφές του μονοπατιού ονομάζεται μήκος του μονοπατιού. Ενα μονοπάτι θεωρείται ελάχιστο μονοπάτι όταν έχει το ελάχιστο δυνατό μήκος. Παράδειγμα Στα επόμενα δύο γραφήματα v u u v v u u v u 0 u τοελάχιστομονοπάτιμεταξύτωνκορυφών v και v είναιτομονοπάτι v,, v μεμήκος. Τοελάχιστομονοπάτιμεαρχήτηνκορυφή u καιπέραςτηνκορυφή u είναιτομονοπάτι u, u, u, u μεμήκος,ενώτοελάχιστομονοπάτιμεαρχήτηνκορυφή u καιπέραςτηνκορυφή u είναιτομονοπάτι u, u, u μεμήκοςαπόστασητωνκορυφών u και u είναι.. Ελάχιστα μονοπάτια σε κατευθυνόμενα γραφήματα Το κλειδί για την εύρεση του ελάχιστου (v, u)-μονοπατιού σε ένα γράφημα είναι η παρατήρηση ότι για κάθεκορυφή v i πουπεριέχεταισ αυτότομονοπάτιπρέπειεπίσηςναισχύειότιτο (v,v i )-μονοπάτιείναικαι αυτό ελάχιστο. Σε αντίθετη περίπτωση, θα υπήρχε ένα ακόμη συντομότερο μονοπάτι και άρα δεν θα ήταν ελάχιστο. Με βάση αυτή την παρατήρηση προκύπτει ότι για την εύρεση του ελάχιστου (v, u)-μονοπατιού που συνδέει τις κορυφές ενός γραφήματος αρκεί να χρησιμοποιηθεί αναζήτηση κατά πλάτος με αρχή την κορυφή v, διότι στην αναζήτηση κατά πλάτος όταν επισκεπτόμαστε μια κορυφή αυτή είναι γειτονική με μια κορυφή την οποία ήδη έχουμε επισκεφθεί και βρίσκεται πιο κοντά στην κορυφή v. Γιατηνεύρεσηόλωντωνμονοπατιώνμεαρχήμιακορυφή v j αρκείναχρησιμοποιηθείηεπόμενηυλοποίησητηςαναζήτησηςκατάπλάτος,στηνοποίααποθηκεύονταιοιαποστάσειςμεταξύτηςκορυφής v j και κάθε άλλης κορυφής.
Ταβήματατουαλγορίθμουαναζήτησηςκατάπλάτος,ξεκινώνταςαπότηνκορυφή v j,είναιταακόλουθα:.αρχικά,όλεςοικορυφέςτου Gείναιανεξερεύνητες,επομένωςσεόλεςτιςθέσειςτουπίνακα A θέτουμε...επισκεπτόμαστετηνκορυφή v j,θέτουμε A[j] = 0καιεισάγουμετην v j στηνουρά L.. Οσοηουρά Lείναιμηκενήεκτελούμεταακόλουθαβήματα: (αʹ) Βρίσκουμε όλες τις κορυφές στις οποίες καταλήγουν τόξα που αρχίζουν από πρώτο στοιχείο τηςουράς L,έστωτην v i. (βʹ)γιακάθεμιααπότιςγειτονικέςκορυφές,έστωτη v k,ελέγχουμεανείναιεξερευνημένη. Αν A[k], δηλαδή είναι εξερευνημένη, δεν εκτελούμε καμια ενέργεια. Αν A[k] =, δηλαδή δεν είναι εξερευνημένη, τότε επισκεπτόμαστε την κορυφή, θέτουμε A[k] = A[i]+,καιεισάγουμετην v k στοτέλοςτηςουράς L. (γʹ) Αφαιρούμε το πρώτο στοιχείο της ουράς. Στην περίπτωση που μας ενδιαφέρει μόνο το ελάχιστο (v, u)-μονοπάτι στην συνθήκη επανάληψης της παραπάνω υλοποίησης πρέπει να προστεθεί ο έλεγχος αν έχουμε βρει το μονοπάτι που μας ενδιαφέρει, δηλαδή ανστηναντίστοιχηθέσητουπίνακαγιατην uέχουμετιμήδιάφορητου. Στην συνέχεια η ανάκτηση του ελάχιστου (v, u)-μονοπατιού γίνεται εύκολα με τον εξής τρόπο:. Εστωiηαντίστοιχηθέσητηςκορυφήςuστονπίνακα.Αν A[i] = δενυπάρχει(v,u)-μονοπάτι..αν A[i],Θέτουμεωςτρέχουσακορυφήτην u.. Οσοδενέχουμεφτάσειστην vεκτελούμετοεξήςβήμα (αʹ)αν v k είναιητρέχουσακορυφή,βρίσκουμεμιακορυφή v j απότηνοποίααρχίζειτόξοπου καταλήγειστην v k,με A[j] = A[k] καιθέτουμεωςτρέχουσακορυφήτην v j. Η μέθοδος αυτή λειτουργεί διότι στον πίνακα A αποθηκεύονται τα μήκη των ελάχιστων μονοπατιών με αρχή την v και κάθε κορυφή που ανήκει σε ένα ελάχιστο μονοπάτι συνδέεται με τουλάχιστον μια κορυφή που είναι τέλος κάποιου άλλου ελάχιστου μονοπατιού με μήκος ένα λιγότερο. Στην περίπτωση που μας ενδιαφέρουν όλα τα ελάχιστα (v, u)-μονοπάτια κατασκευάζουμε το αντίστοιχο δένδρο BFS ως εξής:. Αρχικά θέτουμε ως ρίζα του δένδρου την κορυφή αφετηρίας v..στησυνέχεια,διασχίζονταςτοδένδροκατάπλάτος,σεκάθεκορυφή v i θέτουμεωςπαιδιάτης, με τη σειρά που τα επισκεφτήκαμε, τις γειτονικές κορυφές οι οποίες είναι ανεξερεύνητες. Στην περίπτωση αυτή η εύρεση ενός ελάχιστου(v, u)-μονοπατιού αντιστοιχεί στη μοναδική διάσχιση του μονοπατιούπουσυνδέειτηςκορυφή uμετηνρίζα vτουδένδρου.
. Ελάχιστα μονοπάτια σε γραφήματα με κόστος ή βάρη Η αναζήτηση κατά πλάτος λειτουργεί σε γραφήματα στα οποία όλα τα τόξα(ή οι δεσμοί) θεωρούνται πως έχουν το ίδιο βάρος. Στις εφαρμογές, η πιο συνηθισμένη περίπτωση είναι ότι σε κάθε τόξο αντιστοιχεί ένα βάρος, μπορεί να σχετίζεται με κάποιο χρόνο, ή κόστος, ή απόσταση κ.ο.κ. Στην περίπτωση αυτή ελάχιστο θεωρείται το μονοπάτι στο οποίο άθροισμα των βαρών των τόξων του είναι ελάχιστο και όχι το μονοπάτι με το ελάχιστο πλήθος κορυφών. Παράδειγμα Στα επόμενα δύο γραφήματα v v v v u u 0 u u u u τοελάχιστομονοπάτιμεταξύτωνκορυφών v και v είναιτομονοπάτι v,, v, v μεσυνολικόβάρος 7. Ταελάχισταμονοπάτιαμεαρχήτηνκορυφή u καιπέραςτηνκορυφή u είναιτομονοπάτι u, u, u, u καιτομονοπάτι u, u, u μεσυνολικόβάρος 8. Θασυμβολίζουμεμε w(i,j)τοβάροςτουτόξου(ήδεσμού)απότηνκορυφή v i στηνκορυφή v j. Ανόλαταβάρηείναιθετικά,τότεκαισ αυτέςτιςπεριπτώσειςτοκλειδίγιατηνεύρεσητουελάχιστου (v,u)-μονοπατιούσεέναγράφημαείναιηπαρατήρησηότιγιακάθεκορυφή v i πουπεριέχεταισ αυτότο μονοπάτιπρέπειεπίσηςναισχύειότιτο (v,v i )-μονοπάτιείναικαιαυτόελάχιστο. Σεαντίθετηπερίπτωση, θα υπήρχε ένα μονοπάτι με μικρότερο συνολικό βάρος και άρα δεν θα ήταν ελάχιστο. Η παρατήρηση αυτή είναι η βάση για τον επόμενο αλγόριθμο εύρεσης των ελάχιστων μονοπατιών σε γραφήματα με βάρη, ο οποίος ονομάζεται αλγόριθμος του Dijkstra, ο οποίος είναι μια προσαρμογή της αναζήτησης κατά πλάτος ώστε να λαμβάνονται υπόψη τα βάρη των τόξων(ή δεσμών). Για την υλοποίηση του αλγόριθμου του Dijkstra θα χρησιμοποιηθεί μια ουρά προτεραιότητας Q και δύο βοηθητικοί πίνακες A και B. Οιπίνακες A, Bέχουνμέγεθοςίσομετοπλήθοςτωνκορυφώντουγραφήματος. Στονπίνακα Aαποθηκεύουμεταβάρητωνελάχιστωνμονοπατιώνμεαρχήτηνκορυφή v j,ενώστον πίνακα B αποθηκεύουμε για κάθε κορυφή τον δείκτη της προηγούμενης κορυφής στο ελάχιστου μονοπάτι που ανήκει. Υπενθύμιση: Η βασική ιδέα της ουράς προτεραιότητας είναι ότι τα στοιχεία της έχουν ορισμένα βάρη ως κλειδιά, και κάθε φορά προτεραιότητα έχει το στοιχείο με το ελάχιστο βάρος. Τα βήματα του αλγορίθμου του Dijkstra, για την εύρεση των συντομότερων μονοπατιών που ξεκινουν απότηνκορυφή v j σεγραφήματαμε(θετικά)βάρη,είναιταακόλουθα:.αρχικά,θέτουμεσεόλεςτιςθέσειςτουπίνακα Aτηντιμή καισεόλεςτιςθέσειςτουπίνακα Bτηντιμή..Θέτουμε A[j] = 0.. Τοποθετούμε όλες τις κορυφές του γραφήματος στην ουρά προτεραιότητας Q με κλειδιά τις τιμές του πίνακα A.. Οσο η ουρά προτεραιότητας Q είναι μη κενή εκτελούμε τα ακόλουθα βήματα: (αʹ)αφαιρούμεαπότην Qτηνκορυφήμετομικρότεροκλειδί,έστωτην v k. (βʹ)γιακάθεκορυφή v i στηνοποίακαταλήγουντόξαμεαρχήτην v k εκτελούμεταεξήςβήματα: i.αν A[k]+w(k,i) < A[i]τότε θέτουμε A[i] = A[k]+w(k,i), θέτουμε B[i] = k ενημερώνουμετοκλειδίτης v i στηνουρά.
Παρατήρηση Η ουρά προτεραιότητας υλοποιείται συνήθως με τη βοήθεια ενός σωρού αλλά μπορεί να υλοποιηθεί και με τη βοήθεια ενός πίνακα. Παράδειγμα Για το επόμενο κατευθυνόμενο γράφημα με τόξα v v v ηεκτέλεσητουαλγορίθμουτου Dijkstraμεαρχήτηνκορυφή είναιηεξής:. Αρχικάθέτουμεσεόλεςτιςθέσειςτουπίνακα Aτηντιμή καισεόλεςτιςθέσειςπουπίνακα Bτην τιμή,ενώηουρά Qείναιάδεια.Στησυνέχεια,θέτουμε A[0] = 0. v v v 0 A=[ 0,,,,, ] B=[,,, ] Q=[ ]. Στη συνέχεια τοποθετούμε όλες τις κορυφές του γραφήματος στην ουρά προτεραιότητας Q με κλειδί τις αντίστοιχες τιμές του πίνακα A. v v v 0 A=[ 0,,,,, ] B=[,,, ] Q=[, v, v,, v ]
. Επειδήηουράπροτεραιότητας Qείναιμηκενή,αφαιρούμεαπότην Qτηνκορυφήμετομικρότερο κλειδί,την.απότην καταλήγουντόξαστιςκορυφές v και v. Επειδή A[0] + w(0,) = 0 + = < = A[]θέτουμε A[] =, B[] = 0καιενημερώνουμετο κλειδίτηςκορυφής v στηνουρά Q. Επειδή A[0] + w(0,) = 0 + = < = A[]θέτουμε A[] =, B[] = 0καιενημερώνουμετο κλειδίτης v στηνουρά Q. v v v 0 A=[ 0,,,,, ] B=[, 0, 0, ] Q=[ v, v,, v ]. Επειδήηουράπροτεραιότητας Qείναιμηκενή,αφαιρούμεαπότην Qτηνκορυφήμετομικρότερο κλειδί,την v.απότην v καταλήγουντόξαστιςκορυφές v, και v. Επειδή A[]+w(,) = + = < = A[]θέτουμε A[] =, B[] = καιενημερώνουμετοκλειδί τηςκορυφής v στηνουρά Q. Επειδή A[] + w(,) = + = 7 < = A[]θέτουμε A[] = 7, B[] = καιενημερώνουμετο κλειδίτης στηνουρά Q. Επειδή A[] + w(,) = + = 6 < = A[]θέτουμε A[] = 6, B[] = καιενημερώνουμετο κλειδίτης v στηνουρά Q. v v v 0 A=[ 0,,, 7, 6, ] B=[, 0,, ] Q=[ v,, v ]
. Επειδήηουράπροτεραιότητας Qείναιμηκενή,αφαιρούμεαπότην Qτηνκορυφήμετομικρότερο κλειδί,την v.απότην v καταλήγουντόξαστιςκορυφές v, και v. Επειδή A[]+w(,) = + = 6 > = A[]δενεκτελούμεκαμιάενέργεια. Επειδή A[]+w(,) = + = 6 < 7 = A[]θέτουμε A[] = 6, B[] = καιενημερώνουμετοκλειδί της στηνουρά Q. Επειδή A[]+w(,) = + = < 6 = A[]θέτουμε A[] =, B[] = καιενημερώνουμετοκλειδί της v στηνουρά Q. v v v 0 A=[ 0,,, 6,, ] B=[, 0,, ] Q=[, v ] 6. Επειδήηουράπροτεραιότητας Qείναιμηκενή,αφαιρούμεαπότην Qτηνκορυφήμετομικρότερο κλειδί,την v.δενυπάρχουντόξαμεαρχήτην v επομένωςδενεκτελούμεκαμιάενέργεια. v v v 0 A=[ 0,,, 6,, ] B=[, 0,, ] Q=[ ] Αυτότοβήμαμπορείναπαραλειφθείδιότιεπειδήηv δενπεριέχεταιστηνουράτοκόστοςτηςείναιήδημικροτεροαπό όλες τις κορυφές που περιέχονται στην ουρά. 6
7. Επειδήηουράπροτεραιότητας Qείναιμηκενή,αφαιρούμεαπότην Qτηνκορυφήμετομικρότερο κλειδί,την.απότην καταλήγειτόξοστηνκορυφή v. Επειδή A[]+w(,) = 6+ = 7 > 6 = A[]δενεκτελούμεκαμιάενέργεια. v v v 0 A=[ 0,,, 6,, ] B=[, 0,, ] Q=[ ] 8. Επειδή η ουρά προτεραιότητας Q είναι κενή, η εύρεση των ελάχιστων μονοπατιών ολοκληρώθηκε. Τα μήκη των αντίστοιχων ελάχιστων μονοπατιών βρίσκονται στον πίνακα A. Για την εύρεση των αντίστοιχων ελάχιστων μονοπατιών ξεκινάμε από την τελευταία κορυφή και χρησιμοποιώνταςτονπίνακα Bκινούμαστεανάποδαμέχριναφτάσουμεστηνκορυφή. Γιατηνεύρεσητουελάχιστουμονοπατιούμετέλοςτηνκορυφή v έχουμεότι: Ητελευταίακορυφήείναιηv. Επειδή B[] = 0,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιη. Άρα,τομονοπάτιείναιτο, v μεβάρος A[] =. Γιατηνεύρεσητουελάχιστουμονοπατιούμετέλοςτηνκορυφή v έχουμεότι: Ητελευταίακορυφήείναιηv. Επειδή B[] =,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιηv. Επειδή B[] = 0,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιη. Άρα,τομονοπάτιείναιτο, v, v μεβάρος A[] =. Γιατηνεύρεσητουελάχιστουμονοπατιούμετέλοςτηνκορυφή έχουμεότι: Ητελευταίακορυφήείναιη. Επειδή B[] =,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιηv. Επειδή B[] =,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιηv. Επειδή B[] = 0,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιη. Άρα,τομονοπάτιείναιτο, v, v, μεβάρος A[] = 6. Γιατηνεύρεσητουελάχιστουμονοπατιούμετέλοςτηνκορυφή v έχουμεότι: Ητελευταίακορυφήείναιηv. Επειδή B[] =,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιηv. Επειδή B[] =,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιηv. Επειδή B[] = 0,ηπροηγούμενηκορυφήστοελάχιστομονοπάτιείναιη. Άρα,τομονοπάτιείναιτο, v, v, v μεβάρος A[] =. Σε κάθε εκτέλεση του αλγορίθμου του Dijkstra αντιστοιχεί ένα δένδρο με κορυφές τις κορυφές του γραφήματος και τόξα(ή δεσμούς) τα τόξα(ή τους δεσμούς) που συμμετέχουν στα ελάχιστα μονοπάτια, το οποίο ονομάζεται δένδρο ελάχιστων μονοπατιών. Για παράδειγμα, στην εκτέλεση του αλγορίθμου του Dijkstra αντιστοιχεί το επόμενο δένδρο ελάχιστων μονοπατιών. 7
v v v v v v 0 A=[ 0,,, 6,, ] B=[, 0,, ] Ηκατασκευήτουαντίστοιχουδένδρουπροκύπτειαπότονπίνακα B θέτονταςκάθεκορυφή v j, με πεπερασμένηθετικήτιμή B[j] = iωςπαιδίτηςκορυφής v j. Άσκηση. Να βρεθούν τα ελάχιστα μονοπάτια του επόμενου κατευθυνόμενου γραφήματος με αρχή την κορυφή v v 8 6 6 v 7 v 6 v v και στη συνέχεια να κατασκευασθεί το αντίστοιχο δένδρο ελάχιστων μονοπατιών.. Να βρεθούν τα ελάχιστα μονοπάτια του επόμενου κατευθυνόμενου γραφήματος με αρχή την κορυφή,τοοποίοπροκύπτειαπότοπροηγούμενομεαύξησηόλωντωνβαρώντουκατά v v 9 7 7 v 7 6 v 6 v v και στη συνέχεια να κατασκευασθεί το αντίστοιχο δένδρο ελάχιστων μονοπατιών. Τί παρατηρείται; Είναι τα ελάχιστα μονοπάτια ίδια με πρίν; Γιατί; 8