ΚΕΦΑΛΑΙΟ 9: Θεωρία Δικτύων 9.1 Εισαγωγή Όπου και αν κοιτάξουμε γύρω μας, η παρουσία των δικτύων είναι εμφανής. Η μεταφορά ενέργειας για οικιακή και βιομηχανική χρήση γίνεται μέσω κατάλληλων δικτύων. Δίκτυα επικοινωνίας καθιστούν εφικτή την επικοινωνία μεταξύ απομακρυσμένων περιοχών του πλανήτη. Οδικά και σιδηροδρομικά δίκτυα παρέχουν τη δυνατότητα κάλυψης μεγάλων αποστάσεων σε μικρό χρονικό διάστημα. Το διαδίκτυο είναι ίσως ένα από τα πιο χαρακτηριστικά παραδείγματα όπου κάποιο δίκτυο έχει αλλάξει ριζικά τον τρόπο ζωής μας. Σε όλες τις παραπάνω περιπτώσεις, ο αντικειμενικός σκοπός είναι η μεταφορά κάποιας οντότητας (ενέργεια, ήχος, οχήματα, δεδομένα, κτλ.) μεταξύ δύο σημείων με το πιο αποτελεσματικό τρόπο. Σε αυτό το κεφάλαιο, ασχολούμαστε με τρόπους μαθηματικής μοντελοποίησης εφαρμογών που εμπεριέχουν κάποιου είδους δίκτυο και μελετάμε αλγόριθμους επίλυσης των μοντέλων που προκύπτουν. Η θεωρία των δικτύων είναι μία επιστημονική περιοχή που βρίσκεται στο μεταίχμιο μεταξύ διαφόρων ερευνητικών αντικειμένων όπως τα εφαρμοσμένα μαθηματικά, η επιστήμη των υπολογιστών, οι επιστήμες του μηχανικού, της διοίκησης και της επιχειρησιακής έρευνας. Η καταγωγή της θεωρίας αυτής μπορεί να αναζητηθεί στην δουλειά του Kirchhof καθώς και άλλων ερευνητών, οι οποίοι πρώτοι μελέτησαν συστηματικά ηλεκτρικά κυκλώματα. Αυτή η δουλειά έθεσε τις βάσεις για τη μετέπειτα πορεία και εξέλιξη της θεωρίας των δικτύων και κατέστησε τα δίκτυα ως χρήσιμα μαθηματικά αντικείμενα για την απεικόνιση πολλών φυσικών συστημάτων. 9.2 Ορολογία Ένα δίκτυο (ή γράφημα) είναι ένα (πεπερασμένο) σύνολο κόμβων (σημείων ή κορυφών) και κλάδων (πλευρών ή ακμών) G = {V,A}, όπου V είναι το σύνολο των κόμβων και Α το σύνολο των κλάδων. Ο κλάδος που συνδέει τους κόμβους i και j συμβολίζεται απλά (i, j). Αν κάθε κλάδος έχει μία συγκεκριμένη διεύθυνση, τότε το δίκτυο ονομάζεται προσανατολισμένο (directed ή oriented), σε αντίθετη περίπτωση ονομάζεται μη προσανατολισμένο (undirected). Αν κάποιοι κλάδοι έχουν διεύθυνση και κάποιοι όχι, τότε το δίκτυο ονομάζεται μεικτό (mixed). Ένας κλάδος με διεύθυνση (i,j) οδηγεί από τον κόμβο i στον κόμβο j. Δύο κόμβοι που συνδέονται με ένα κλάδο καθώς και δύο κλάδοι που συνδέονται με έναν κόμβο ονομάζονται γειτονικοί. Ο βαθμός ενός κόμβου σε ένα μη προσανατολισμένο δίκτυο είναι ο αριθμός των κλάδων των οποίων μία κορυφή είναι αυτός ο κόμβος. Σε ένα προσανατολισμένο δίκτυο, ορίζεται αντίστοιχα ο βαθμός για τον αριθμό των κλάδων που καταλήγουν σε αυτό τον κόμβο (indegree) και ο βαθμός για τον αριθμό των κλάδων που απομακρύνονται από αυτό τον κόμβο (outdegree). 102
Ένα μονοπάτι (ή αλυσίδα) σε ένα μη προσανατολισμένο δίκτυο είναι μία αλληλουχία γειτονικών κλάδων και κόμβων. Σε ένα προσανατολισμένο δίκτυο, τα μονοπάτια έχουν και αυτά διεύθυνση. Ένα μονοπάτι μπορεί να παρασταθεί σαν μία αλληλουχία γειτονικών κόμβων (π.χ. S = {a, b, c,.., i, j, k}) ή γειτονικών κλάδων (π.χ. S = {(a, b), (b, c),..., (i, a), (j, k)}]. Ένα μονοπάτι είναι απλό αν κάθε κλάδος εμφανίζεται το πολύ μία φορά στην αλληλουχία και βασικό αν κάθε κόμβος εμφανίζεται το πολύ μία φορά στην αλληλουχία. Κύκλος (ή κύκλωμα) είναι ένα μονοπάτι του οποίου ο αρχικός και ο τελικός κόμβος συμπίπτουν. Μία πολύ σημαντική έννοια είναι η συνεκτικότητα του δικτύου. Ένας κόμβος i συνδέεται με τον κόμβο j αν υπάρχει μονοπάτι που να οδηγεί από το σημείο i στο σημείο j. Ένα μη προσανατολισμένο δίκτυο είναι συνεκτικό αν υπάρχει μονοπάτι για κάθε ζεύγος κόμβων του δικτύου. Ένα προσανατολισμένο δίκτυο είναι συνεκτικό αν το αντίστοιχο μη προσανατολισμένο δίκτυο είναι συνεκτικό. Προσέξτε ότι αυτό σημαίνει ότι σε ένα συνεκτικό προσανατολισμένο δίκτυο μπορεί να μην υπάρχει μονοπάτι που να οδηγεί από κάποιο κόμβο i σε κάποιο κόμβο j. Όταν υπάρχει μονοπάτι που να οδηγεί από κάθε κόμβο i σε κάθε άλλο κόμβο j σε ένα προσανατολισμένο δίκτυο, τότε αυτό ονομάζεται ισχυρά συνεκτικό. Ένα υποδίκτυο G = (V,A ) ενός δικτύου G = (V,A) είναι ένα δίκτυο τέτοιο ώστε V CV και Α CΑ. Το σύνολο Α μπορεί να περιέχει μόνο κλάδους μεταξύ σημείων του V. Ένα δέντρο είναι ένα συνεκτικό γράφημα χωρίς κύκλους. Έτσι, ένα δέντρο σε ένα δίκτυο με n κόμβους περιέχει ακριβώς n-1 κλάδους. Επίσης, κάθε ζεύγος κόμβων ενός δέντρου συνδέονται μέσω ενός μοναδικού μονοπατιού. Ένα δέντρο κάλυψης (spanning tree) ενός δικτύου G είναι ένα δέντρο που περιέχει όλους τους κόμβους του G. Σε ένα πρόβλημα δικτύου ορίζονται κάποια χαρακτηριστικά για κάθε κόμβο και κλάδο. Συνήθως υπάρχει κάποιο μέγεθος για κάθε κλάδο του δικτύου το οποίο μπορεί να παριστάνει απόσταση, χρόνο, χωρητικότητα, ροή κτλ. Το μήκος ενός μονοπατιού μεταξύ δύο σημείων του G ισούται προφανώς με το άθροισμα των αποστάσεων όλων των κλάδων στο συγκεκριμένο μονοπάτι. Ο συμβολισμός d(i, j) χρησιμοποιείται συνήθως για να υποδηλώσει την ελάχιστη απόσταση μεταξύ των κόμβων i και j. 9.3 Το πρόβλημα της συντομότερης διαδρομής Σε αυτή την ενότητα ασχολούμαστε με ένα από τα πιο βασικά προβλήματα στη θεωρία των δικτύων, το πρόβλημα της συντομότερης διαδρομής. Το πρόβλημα αφορά την εύρεση της συντομότερης διαδρομής μεταξύ μιας προέλευσης (αρχικός κόμβος) και ενός προορισμού (τελικός κόμβος) διαμέσου ενός συνεκτικού δικτύου, όταν είναι γνωστές οι αποστάσεις των αντίστοιχων κλάδων του δικτύου. Αν και έχουν προταθεί διάφορες μέθοδοι επίλυσης (αλγόριθμοι), ο αλγόριθμος του Dijkstra που παρουσιάζεται παρακάτω είναι από τις πιο γρήγορες και εύχρηστες μεθόδους. Η διαδικασία αυτή εξελίσσεται από την αρχή του δικτύου, προσδιορίζοντας μία αλληλουχία των κόμβων του δικτύου σε ανερχόμενη σειρά της συντομότερης τους απόστασης από την αρχή, λύνοντας έτσι το πρόβλημα όταν φτάσει στον τελικό κόμβο. Παρουσιάζουμε πρώτα τη μέθοδο και μετά την επεξηγούμε, λύνοντας το πρόβλημα της συντομότερης διαδρομής σε ένα παράδειγμα. 103
Αλγόριθμος για το Πρόβλημα της Συντομότερης Διαδρομής: Ο αλγόριθμος χωρίζει τους κόμβους του δικτύου σε λυμένους και άλυτους. Λυμένοι είναι οι κόμβοι των οποίων η ελάχιστη απόσταση από τον κόμβο προέλευσης έχει υπολογιστεί και άλυτοι αυτοί των οποίων δεν έχει. Στην αρχή, όλοι οι κόμβοι εκτός από τον κόμβο προέλευσης (του οποίου η ελάχιστη απόσταση είναι 0) είναι άλυτοι. Στη συνέχεια ο αλγόριθμος λειτουργεί επαναληπτικά, υπολογίζοντας σε κάθε επανάληψη τον επόμενο πλησιέστερο κόμβο στον αρχικό. Σκοπός της n-οστής επανάληψης: Βρες τον n-οστό πλησιέστερο κόμβο στον αρχικό. (Επανάλαβε για n = 1,2,... μέχρι o n-οστός πλησιέστερος κόμβος να είναι ο κόμβος προορισμού. Δεδομένο για τη n-οστή επανάληψη: Είναι οι (n-1) πλησιέστεροι κόμβοι στον αρχικό (που λύθηκαν σε προηγούμενες επαναλήψεις), μαζί με τις συντομότερες διαδρομές τους και αποστάσεις από τον κόμβο προέλευσης. (Οι κόμβοι αυτοί καθώς και ο αρχικός είναι οι λυμένοι όπως είπαμε ενώ οι υπόλοιποι είναι οι άλυτοι). Υποψήφιοι για n-οστοί πλησιέστεροι στον αρχικό: Κάθε άλυτος κόμβος που είναι απευθείας συνδεδεμένος με έναν λυμένο κόμβο είναι υποψήφιος να είναι ο n-οστός πλησιέστερος κόμβος στην n-οστή επανάληψη. Η λυμένη κορυφή που είναι άμεσα συνδεμένη με ακμή με μια ή περισσότερες μη λυμένες κορυφές δίνει μια υποψήφια -τη μη λυμένη κορυφή με τη συντομότερη συνδεμένη ακμή. (Οι ισοβαθμίσεις δίνουν επιπρόσθετους υποψήφιους.) Υπολογισμός του n-οστού πλησιέστερου κόμβου: Για κάθε λυμένο κόμβο που συνδέεται απευθείας με έναν ή περισσότερους άλυτους κόμβους υπολόγισε για κάθε ένα από αυτούς τους άλυτους κόμβους το άθροισμα της ελάχιστης απόστασης του λυμένου κόμβου και της απόστασης μεταξύ των δύο αυτών κόμβων (λυμένου και άλυτου). Ο υποψήφιος κόμβος με τη μικρότερη συνολική απόσταση είναι ο n-οστός πλησιέστερος κόμβος (ισοβαθμίσεις δίνουν επιπρόσθετους λυμένους κόμβους), και η συντομότερη διαδρομή της είναι εκείνη που δίνει την απόσταση αυτή. Παράδειγμα 9.1 Η διοίκηση του πάρκου το οποίο απεικονίζεται στο παρακάτω δίκτυο θέλει να βρει τη συντομότερη διαδρομή από την είσοδο του πάρκου (κόμβος Ο) μέχρι την κορυφή Τ διαμέσου του οδικού συστήματος. Οι αριθμοί σε κάθε κλάδο δίνουν το μήκος του κλάδου αυτού. 104
Εφαρμόζοντας τον παραπάνω αλγόριθμο στο πρόβλημα παίρνουμε τα αποτελέσματα του επόμενου πίνακα. n Λυμένοι κόμβοι άμεσα συνδεμένοι με άλυτους κόμβους Πίνακας 9.1: Εφαρμογή αλγόριθμου Dijkstra Πλησιέστερος συνδεδεμένος άλυτος κόμβος Συνολική απόσταση n-οστός πλησιέστερος κόμβος Ελάχιστη απόσταση Τελευταία σύνδεση 1 O Α 2 Α 2 ΟΑ 2 Ο C 4 C 4 OC Α Β 2+2 = 4 Β 4 ΑΒ Α D 2+7 = 9 4 Β E 4+3 = 7 Ε 7 ΒΕ C Ε 4+4 = 8 Α D 2+7 = 9 5 Β D 4+4= 8 D 8 ΒD Ε D 7+1=8 D 8 ED 6 D E Τ Τ 8+5 = 13 7+7 = 14 Τ 13 DΤ Προσέξτε ότι η ισοβάθμιση στη δεύτερη επανάληψη μας δίνει τη δυνατότητα να προσθέσουμε δύο νέους λυμένους κόμβους, οπότε στην επόμενη επανάληψη υπολογίζουμε τον τέταρτο πλησιέστερο κόμβο. Η συντομότερη διαδρομή από τον προορισμό προς την αρχή μπορεί να βρεθεί από την τελευταία στήλη του πίνακα και είναι ή η Τ D Ε Β A O ή η Τ D Β A O. Έτσι οι δύο εναλλακτικές λύσεις της συντομότερης διαδρομής από την αρχή μέχρι τον προορισμό είναι η Ο A B E D T και η O A Β D T, με συνολική απόσταση 13 η καθεμιά. Πριν τελειώσουμε με την παρουσίαση του προβλήματος της συντομότερης διαδρομής θα πρέπει να υπογραμμίσουμε ένα ακόμα σημείο. Το πρόβλημα μέχρι τώρα έχει αντιμετωπιστεί ως το πρόβλημα ελαχιστοποίησης της απόστασης μεταξύ ενός κόμβου προέλευσης και ενός κόμβου προορισμού ενός δικτύου. Όμως αυτό δε σημαίνει ότι οι τιμές των κλάδων πρέπει οπωσδήποτε να είναι αποστάσεις. Για παράδειγμα, οι κλάδοι μπορεί να αντιστοιχούν σε δραστηριότητες κάποιου είδους, όπου η τιμή για κάθε κλάδο είναι το κόστος της δραστηριότητας. Σε αυτή την περίπτωση, το πρόβλημα είναι να βρεθεί η ακολουθία των δραστηριοτήτων που ελαχιστοποιεί το συνολικό κόστος. Ακόμη, η τιμή ενός κλάδου μπορεί να είναι ο χρόνος που χρειάζεται για την εκτέλεση της δραστηριότητας. Στην περίπτωση αυτή, το πρόβλημα είναι να βρεθεί η ακολουθία των δραστηριοτήτων που ελαχιστοποιεί το συνολικό χρόνο. Έτσι, στο κεφάλαιο αυτό η λέξη «απόσταση» μπορεί να θεωρηθεί και ως κόστος ή χρόνος ή κάποια άλλη ποσότητα. Η ανάλυση της πολυπλοκότητας του αλγόριθμου του Dijkstra μπορεί να σκιαγραφηθεί ως εξής. Σε κάθε επανάληψη, ο αλγόριθμος εκτελεί μία σειρά ενεργειών που είναι ανάλογη του αριθμού των άλυτων κόμβων, ο οποίος σε ένα δίκτυο με n 105
κόμβους είναι αρχικά το πολύ n και μειώνεται σε κάθε επανάληψη. Επομένως, η πολυπλοκότητα του αλγόριθμου είναι Ο(n + n-1 + + 1) = Ο(n 2 ). 9.4 Το πρόβλημα του δέντρου ελάχιστης κάλυψης Τώρα, ας εξετάσουμε μια παραλλαγή του προβλήματος της συντομότερης διαδρομής γνωστής ως το πρόβλημα του δέντρου ελάχιστης κάλυψης. Εδώ δεν ψάχνουμε τη συντομότερη διαδρομή μεταξύ δύο κόμβων ενός δικτύου, αλλά ένα σύνολο κλάδων του δικτύου στο οποίο υπάρχει ένα μονοπάτι για κάθε ζεύγος κόμβων του δικτύου, ενώ το συνολικό μήκος των κλάδων αυτών είναι το ελάχιστο δυνατό. Για να γίνει αυτό, οι κλάδοι θα πρέπει να επιλεγούν με τέτοιο τρόπο που να σχηματίζεται ένα δένδρο (θυμηθείτε ότι δέντρο είναι ένα συνεκτικό δίκτυο χωρίς κύκλους) που συνδέει όλες τις κορυφές. Με άλλα λόγια, το πρόβλημα είναι να βρεθεί το συνεκτικό δένδρο με το ελάχιστο συνολικό μήκος. Το πρόβλημα αυτό έχει ορισμένες πολύ σπουδαίες πρακτικές εφαρμογές. Για παράδειγμα, είναι πολύ χρήσιμο στον προγραμματισμό δικτύων επικοινωνίας, όπου πρέπει να βρεθεί κάποιο δέντρο, που να συνδέει όλους τους κόμβους μεταξύ τους με κάποιο μονοπάτι με τον πιο οικονομικό τρόπο. Οι κόμβοι μπορεί να είναι τηλεπικοινωνιακοί σταθμοί, οι κλάδοι καλώδια μεταφοράς του σήματος και οι αποστάσεις το κόστος κατασκευής του αντίστοιχου κλάδου. Στα πλαίσια αυτά, το πρόβλημα του δέντρου ελάχιστης κάλυψης είναι ο προσδιορισμός εκείνων των κλάδων, που εξυπηρετούν όλους τους σταθμούς με το ελάχιστο συνολικό κόστος. Άλλα παραδείγματα είναι ο προγραμματισμός μεγάλων δικτύων μεταφοράς. Το πρόβλημα του δέντρου ελάχιστης κάλυψης μπορεί να λυθεί απ' ευθείας, επειδή συμβαίνει να είναι ένα από τα λίγα προβλήματα της επιχειρησιακής έρευνας, όπου αρχίζοντας από οποιοδήποτε κόμβο θα οδηγηθούμε στο τέλος στη βέλτιστη λύση. Ο πρώτος από τους δύο αλγόριθμους (Αλγόριθμος Prim) που θα παρουσιάσουμε χωρίζει τους κόμβους του δικτύου σε αυτούς που έχουν συνδεθεί στο δέντρο (συνδεδεμένους) και σε αυτούς που δεν έχουν συνδεθεί ακόμα (μη συνδεδεμένοι). Στο πρώτο στάδιο, αρχίζοντας από έναν οποιοδήποτε κόμβο, επιλέγουμε από όλους τους κλάδους που συνδέουν αυτό τον κόμβο με κάποιο άλλο, εκείνον με τη μικρότερη απόσταση (κόστος), χωρίς ν' ανησυχούμε για την επίδραση που μπορεί να έχει αυτή μας η απόφαση σε επόμενες αποφάσεις. Σε κάθε επόμενο στάδιο προσδιορίζουμε το μη συνδεμένο κόμβο, που είναι πλησιέστερα σε οποιοδήποτε από τους συνδεμένους κόμβους και μετά προσθέτουμε τον αντίστοιχο κλάδο στο δέντρο. Η διαδικασία αυτή επαναλαμβάνεται, όπως παρουσιάζεται και παρακάτω, μέχρι να συνδεθούν όλοι οι κόμβοι. Το δίκτυο που προκύπτει εξασφαλίζεται ότι είναι ένα δέντρο ελάχιστης κάλυψης. Αλγόριθμος Prim για την εύρεση του δέντρου ελάχιστης κάλυψης 1. Επίλεξε έναν κόμβο αυθαίρετα και σύνδεσε τον με τον πλησιέστερο κόμβο. 2. Βρες το μη συνδεδεμένο κόμβο που είναι πλησιέστερος σε έναν συνδεμένο κόμβο και σύνδεσε τους δύο αυτούς κόμβους. Επανάλαβε το βήμα 2 μέχρι να συνδεθούν όλοι οι κόμβοι. Ισοβαθμίσεις για τον πλησιέστερο κόμβο του βήματος 1 ή τον πλησιέστερο μη συνδεμένο κόμβο του βήματος 2 μπορούν να λυθούν αυθαίρετα και είναι εξασφαλισμένο 106
ότι ο αλγόριθμος θα δώσει μια βέλτιστη λύση. Όμως, τέτοιες ισοβαθμίσεις είναι ένα σήμα ότι μπορεί να υπάρχουν (αλλά όχι απαραίτητα) πολλαπλές βέλτιστες λύσεις. Παράδειγμα 9.2 Η διοίκηση του πάρκου από το παραπάνω παράδειγμα θέλει να προσδιορίσει τους δρόμους κάτω από τους οποίους θα πρέπει να εγκατασταθούν οι τηλεφωνικές γραμμές, που θα συνδέουν όλους τους σταθμούς με το ελάχιστο συνολικό μήκος των γραμμών. Με τα δεδομένα του παραπάνω προβλήματος, η λύση περιγράφεται ως εξής: Βήμα 1: Επιλέγουμε έναν κόμβο τυχαία, έστω τον C. Ο πλησιέστερος κόμβος είναι ο Β, άρα προσθέτουμε τον κλάδο BC στο δέντρο, του οποίου το μήκος γίνεται 1. Βήμα 2: Ο μη συνδεδεμένος κόμβος που είναι πλησιέστερα σε κάποιο συνδεδεμένο κόμβο είναι ο Α, άρα προσθέτουμε τον αντίστοιχο κλάδο ΑB στο δέντρο και το μήκος του γίνεται 1+2 = 3. Βήμα 3: Ο μη συνδεδεμένος κόμβος που είναι πλησιέστερα σε κάποιο συνδεδεμένο κόμβο είναι ο Ο, άρα προσθέτουμε τον αντίστοιχο κλάδο ΟΑ στο δέντρο και το μήκος του γίνεται 3+2 = 5. Βήμα 4: Ο μη συνδεδεμένος κόμβος που είναι πλησιέστερα σε κάποιο συνδεδεμένο κόμβο είναι ο Ε, άρα προσθέτουμε τον αντίστοιχο κλάδο BΕ στο δέντρο και το μήκος του γίνεται 5+3 = 8. Βήμα 5: Ο μη συνδεδεμένος κόμβος που είναι πλησιέστερα σε κάποιο συνδεδεμένο κόμβο είναι ο D, άρα προσθέτουμε τον αντίστοιχο κλάδο DE στο δέντρο και το μήκος του γίνεται 8+1 = 9. Βήμα 6: Ο μη συνδεδεμένος κόμβος που είναι πλησιέστερα σε κάποιο συνδεδεμένο κόμβο είναι ο T, άρα προσθέτουμε τον αντίστοιχο κλάδο TD στο δέντρο και το μήκος του γίνεται 9+5 = 14. Η διαδικασία ολοκληρώνεται καθώς δεν υπάρχουν άλλοι μη συνδεδεμένοι κόμβοι. Μπορείτε να επαληθεύσετε μόνοι σας ότι με οποιοδήποτε αρχικό κόμβο κι αν είχατε ξεκινήσει θα είχατε καταλήξει σε ένα δέντρο με συνολικό μήκος 14. Το συγκεκριμένο δέντρο ελάχιστης κάλυψης φαίνεται στο ακόλουθο σχήμα. T Ο 2 Α 2 1 C Β 3 D E 1 5 107
Για να αναλύσουμε την πολυπλοκότητα του αλγόριθμου Prim παρατηρούμε ότι εκτελούνται συνολικά n επαναλήψεις, αφού n είναι ο αριθμός των κόμβων που πρέπει να συνδεθούν συνολικά. Σε κάθε επανάληψη, πρέπει να βρούμε έναν κλάδο ελάχιστου κόστους του οποίου ο ένας κόμβος ανήκει στο υπάρχον δέντρο (είναι συνδεδεμένος) και ο άλλος δεν ανήκει. Αν για να το βρούμε αυτό εξετάζουμε όλους τους κλάδους που είναι συνολικά m, τότε η πολυπλοκότητα μιας επανάληψης είναι Ο(m), οπότε η πολυπλοκότητα του αλγόριθμου είναι Ο(mn). Με κάποιες κατάλληλες βελτιώσεις, η πολυπλοκότητα του αλγόριθμου μπορεί να βελτιωθεί ακόμα περισσότερο. Ένας άλλος αλγόριθμος για την εύρεση του δέντρου ελάχιστης κάλυψης είναι ο εξής: Αλγόριθμος Kruskal για την εύρεση του δέντρου ελάχιστης κάλυψης 1. Επίλεξε τον κλάδο με το μικρότερο κόστος και πρόσθεσέ τον στο δέντρο. 2. Βρες τον επόμενο κλάδο με το μικρότερο κόστος. Πρόσθεσε τον κλάδο αυτόν στο δέντρο αν από αυτή την προσθήκη δεν προκύπτει κάποιος κύκλος. Επανάλαβε το βήμα 2 μέχρι να συνδεθούν όλοι οι κόμβοι. Όπως και στον προηγούμενο αλγόριθμο, ισοβαθμίσεις μπορούν να αποφασιστούν αυθαίρετα και είναι εξασφαλισμένο ότι ο αλγόριθμος θα δώσει μια βέλτιστη λύση. Όμως, τέτοιες ισοβαθμίσεις είναι ένα σήμα ότι μπορεί να υπάρχουν (αλλά όχι απαραίτητα) πολλαπλές βέλτιστες λύσεις. Στο παραπάνω πρόβλημα, η εφαρμογή του Αλγόριθμου Kruskal θα μας έδινε τα εξής βήματα: Βήμα 1: Επειδή υπάρχουν δύο κλάδοι με ελάχιστο κόστος (ο BC και ο DE) επιλέγουμε αυθαίρετα έναν από τους δύο, έστω τον DE, και τον προσθέτουμε σχηματίζοντας ένα αρχικό δέντρο. Βήμα 2: Ο επόμενος κλάδος είναι ο BC. Επειδή δε σχηματίζεται κύκλος, προσθέτουμε και αυτόν τον κλάδο. Βήμα 3: Και σε αυτό το βήμα υπάρχουν δύο εναλλακτικοί κλάδοι, ο ΟΑ και ο ΑΒ με κόστος 2. Επιλέγουμε αυθαίρετα έναν από τους δύο, έστω τον ΑΒ και τον προσθέτουμε αφού αυτή η προσθήκη δε σχηματίζει κύκλο. Βήμα 4: Ο επόμενος κλάδος είναι ο ΟΑ. Επειδή δε σχηματίζεται κύκλος, προσθέτουμε και αυτόν τον κλάδο. Βήμα 5: Ο επόμενος κλάδος είναι ο ΒΕ. Επειδή δε σχηματίζεται κύκλος, προσθέτουμε και αυτόν τον κλάδο. Βήμα 6: Σε αυτό το βήμα υπάρχουν τρεις κλάδοι με ελάχιστο κόστος (ο ΟC, ο CE και ο BD). Eπιλέγουμε αυθαίρετα έναν από τους τρεις, έστω τον OC. Επειδή σχηματίζεται κύκλος, ο κλάδος αυτός δεν προστίθεται. Βήμα 7: Από τους δύο κλάδους που απομένουν (τον CE και τον BD) επιλέγουμε αυθαίρετα έναν από τους δύο, έστω τον CΕ. Επειδή σχηματίζεται κύκλος, ο κλάδος αυτός δεν προστίθεται. Βήμα 8: Ο επόμενος κλάδος είναι ο ΒD. Επειδή σχηματίζεται κύκλος, ο κλάδος αυτός δεν προστίθεται. Βήμα 9: Σε αυτό το βήμα υπάρχουν δύο εναλλακτικοί κλάδοι, ο ΟΒ και ο DT με κόστος 5. Επιλέγουμε αυθαίρετα έναν από τους δύο, έστω τον OΒ αλλά επειδή σχηματίζεται κύκλος δεν τον προσθέτουμε. 108
Βήμα 10: Ο επόμενος κλάδος είναι ο DT. Επειδή δε σχηματίζεται κύκλος, προσθέτουμε και αυτόν τον κλάδο. Η διαδικασία σταματά καθώς όλοι οι κόμβοι είναι τώρα συνδεδεμένοι. Η βέλτιστη λύση που πήραμε είναι η ίδια με αυτή που πήραμε από τον προηγούμενο αλγόριθμο και έχει φυσικά το ίδιο κόστος. Σε μεγάλα προβλήματα τα διάφορα βήματα του αλγόριθμου (π.χ. ο έλεγχος για κύκλους) δεν μπορούν να γίνουν οπτικά και θα πρέπει να συστηματοποιηθούν έτσι ώστε ο αλγόριθμος να μπορεί να κωδικοποιηθεί πιο εύκολα. Η συστηματοποίηση αυτή μπορεί να γίνει ως εξής: Ο αλγόριθμος δημιουργεί σταδιακά ένα σύνολο υποδέντρων του αρχικού δικτύου. Κάθε φορά που εξετάζεται η προσθήκη ενός κλάδου, υπάρχουν τρεις εναλλακτικές. Η πρώτη είναι όταν από την προσθήκη αυτή σχηματίζεται κύκλος οπότε ο κλάδος αυτός δεν προστίθεται. Η δεύτερη είναι όταν ο κλάδος προστίθεται σε ένα υπάρχον υποδέντρο του δικτύου επεκτείνοντάς το. Η τρίτη είναι όταν ο κλάδος σχηματίζει ένα νέο υποδέντρο. Μπορούμε να καταγράφουμε κάθε υποδέντρο που σχηματίζει ο αλγόριθμος, καταγράφοντας όλους τους κλάδους που ανήκουν σε αυτό. Παραδείγματος χάριν, S = {(a,b),(b,d),(e,a)} είναι ένα υποδέντρο που αποτελείται από τους κλάδους (a,b), (b,d) και (e,a). Τότε, όταν εξετάζουμε την προσθήκη ενός νέου κλάδου ο έλεγχος μπορεί να γίνει ως εξής: 1. Αν και οι δύο κόμβοι του κλάδου αυτού συνυπάρχουν στο ίδιο υποδέντρο, αυτό σημαίνει ότι από την προσθήκη του κλάδου αυτού θα σχηματιστεί κύκλος, οπότε ο κλάδος αυτός δεν προστίθεται. 2. Αν οι δύο κόμβοι του κλάδου αυτού υπάρχουν σε δύο διαφορετικά υποδέντρα, τότε αυτός ο κλάδος προστίθεται και τα δύο υποδέντρα ενώνονται σε ένα μοναδικό, χωρίς να σχηματιστεί κύκλος. 3. Αν μόνο ένας από τους δύο κόμβους του κλάδου υπάρχει σε κάποιο υποδέντρο, τότε ο κλάδος προστίθεται σε αυτό το υποδέντρο χωρίς να σχηματιστεί κύκλος. 4. Αν κανένας από τους κόμβους του κλάδου δεν υπάρχει στα υπάρχοντα υποδέντρα, τότε ο κλάδος αυτός προστίθεται σχηματίζοντας ένα καινούργιο υποδέντρο. Φυσικά από αυτή την προσθήκη δεν σχηματίζεται κανένας κύκλος. Μπορούμε να θεωρήσουμε ότι ο Aλγόριθμος Kruskal αποτελείται από δύο φάσεις. Η πρώτη είναι η φάση ταξινόμησης των κλάδων κατά αύξον κόστος και η δεύτερη η φάση ελέγχου για κύκλους και προσθήκης των κλάδων. Η ταξινόμηση m κλάδων απαιτεί χρόνο Ο(mlgm). Ο έλεγχος και η προσθήκη (ή η απόρριψη ενός κλάδου) μπορεί να γίνει σε χρόνο Ο(n) με τη διαδικασία που περιγράφεται παραπάνω. Τέλος, στη χειρότερη περίπτωση εκτελούνται m επαναλήψεις, αφού αυτός είναι ο συνολικός αριθμός των κλάδων. Επομένως, η πολυπλοκότητα του αλγόριθμου είναι Ο(mlgm) + Ο(mn) = O(mn). Όπως και στην περίπτωση του Αλγόριθμου Prim, με κατάλληλες βελτιώσεις, αυτή η πολυπλοκότητα μπορεί να βελτιωθεί. 9.5 Το πρόβλημα της μέγιστης ροής Το τρίτο πρόβλημα που αντιμετωπίζει η διοίκηση του πάρκου κατά τις περιόδους αιχμής είναι ο προσδιορισμός των διαδρομών των λεωφορείων, έτσι ώστε να 109
μεγιστοποιείται ο αριθμός των ταξιδιών κάθε ημέρα. (Κάθε λεωφορείο επιστρέφει από την ίδια διαδρομή, οπότε η ανάλυση εστιάζει μόνο σε δρομολόγια αναχώρησης). Η διοίκηση έχει επιβάλει ένα μέγιστο όριο στον αριθμό ταξιδιών που μπορούν να γίνονται σε κάθε κατεύθυνση ενός δρόμου. Τα όρια αυτά εμφανίζονται στο επόμενο διάγραμμα, όπου ο αριθμός δίπλα σε κάθε σταθμό και δρόμο δίνει το όριο για το δρόμο και για την κατεύθυνση που απομακρύνεται από τον σταθμό. Για παράδειγμα, μόνο ένα ταξίδι επιτρέπεται από τον Α στο Β καθώς και ένα ταξίδι από το Β στον Α. Με τα όρια αυτά, μια εφικτή λύση είναι να αναχωρούν επτά λεωφορεία την ημέρα, με πέντε από αυτά να κάνουν τη διαδρομή Ο Β Ε Τ, ένα τη διαδρομή Ο Β C Ε Τ και ένα τη διαδρομή Ο Β C Ε D Τ. Όμως, επειδή αυτές οι διαδρομές εμποδίζουν άλλες που αρχίζουν με Ο C (μια και οι Ε T και Ε D δυναμικότητες χρησιμοποιούνται εξ ολοκλήρου), είναι εύκολο να βρούμε άλλες καλύτερες εφικτές λύσεις. Πολλοί συνδυασμοί διαδρομών θα πρέπει να εξεταστούν, για να βρεθεί εκείνος (ή εκείνοι) που δίνουν το μέγιστο αριθμό ταξιδιών. Το πρόβλημα αυτό είναι ένα πρόβλημα μέγιστης ροής. Χρησιμοποιώντας την ορολογία που εισήχθη στην αρχή του κεφαλαίου, το πρόβλημα της μέγιστης ροής μπορεί να περιγραφεί ως εξής. 1. Δίνεται ένα συνεκτικό προσανατολισμένο δίκτυο που έχει μια πηγή και ένα δέκτη. Η ροή σε αυτό το δίκτυο ξεκινά από την πηγή και καταλήγει στο δέκτη. (Στο συγκεκριμένο παράδειγμα, η πηγή είναι ο κόμβος Ο και ο δέκτης ο κόμβος Τ). 2. Όλοι οι υπόλοιποι κόμβοι είναι κόμβοι ενδιάμεσης μεταφοράς (στο συγκεκριμένο παράδειγμα οι κόμβοι Α, Β, C, D και Ε). 3. Ροή σε έναν κλάδο επιτρέπεται μόνο προς την κατεύθυνση που δείχνουν τα βέλη. Υποθέτουμε ότι η ροή κατά μήκος του κλάδου (i, j) από τον κόμβο i στον κόμβο j μπορεί να είναι οποιαδήποτε μη αρνητική ποσότητα, που δεν είναι μεγαλύτερη από την προκαθορισμένη δυναμικότητα ροής u ij. Στην πηγή όλοι οι κλάδοι απομακρύνονται από τον κόμβο αυτό. Στο δέκτη όλοι οι κλάδοι καταλήγουν προς αυτό τον κόμβο. 4. Υποθέτουμε διατήρηση της ροής σε κάθε κόμβο (δηλαδή η ροή προς κάθε κόμβο είναι ίση με τη ροή από κάθε κόμβο), εκτός από την πηγή και το δέκτη. 5. Αντικειμενικός σκοπός είναι να προσδιοριστεί το εφικτό σχέδιο ροής διαμέσου του δικτύου, που μεγιστοποιεί τη συνολική ροή από την πηγή στο δέκτη. Μερικές πρακτικές εφαρμογές του προβλήματος μέγιστης ροής είναι οι εξής: 110
1. Μεγιστοποίηση της ροής διαμέσου ενός δικτύου διανομής μιας εταιρείας από τα εργοστάσιά της προς τους πελάτες της. 2. Μεγιστοποίηση της ροής διαμέσου ενός δικτύου διανομής μιας εταιρείας από τους προμηθευτές προς τα εργοστάσιά της. 3. Μεγιστοποίηση της ροής πετρελαίου διαμέσου ενός δικτύου σωληνώσεων. 4. Μεγιστοποίηση της ροής νερού διαμέσου ενός συστήματος ύδρευσης. 5. Μεγιστοποίηση της ροής οχημάτων διαμέσου ενός δικτύου μεταφορών. Για κάποιες από αυτές τις εφαρμογές, η ροή μέσω του δικτύου μπορεί να προέρχεται από περισσότερους του ενός κόμβους και να καταλήγει σε περισσότερους του ενός κόμβους, αν και ο ορισμός του προβλήματος μέγιστης ροής υποθέτει μία μοναδική πηγή και ένα μοναδικό δέκτη. Για παράδειγμα, το δίκτυο διανομής μιας εταιρείας περιλαμβάνει πολλά εργοστάσια και πολλούς πελάτες. Σε αυτή την περίπτωση, χρησιμοποιείται ένα έξυπνο τέχνασμα για να μετατραπεί το πρόβλημα σε πρόβλημα μέγιστης ροής. Αυτό το τέχνασμα επεκτείνει το υπάρχον δίκτυο προσθέτοντας μια εικονική πηγή και έναν εικονικό δέκτη και μερικούς νέους κλάδους. Η εικονική πηγή αντιμετωπίζεται σαν ο κόμβος προέλευσης όλης της ροής του δικτύου, αν και αυτή η ροή στην πραγματικότητα προέρχεται από κάποιους άλλους κόμβους του δικτύου. Προς κάθε έναν από αυτούς τους κόμβους προστίθεται ένας κλάδος από την εικονική πηγή. Η δυναμικότητα του κλάδου αυτού ισούται με την μέγιστη ροή που μπορεί να προέρχεται από τον συγκεκριμένο κόμβο. Όμοια, ο εικονικός δέκτης αντιμετωπίζεται σαν ο κόμβος κατάληξης όλης της ροής του δικτύου, αν και αυτή η ροή στην πραγματικότητα καταλήγει σε κάποιους άλλους κόμβους του δικτύου. Από κάθε έναν από αυτούς τους κόμβους προστίθεται ένας κλάδος προς την εικονική πηγή. Η δυναμικότητα του κλάδου αυτού ισούται με την μέγιστη ροή που μπορεί να καταλήξει στον συγκεκριμένο κόμβο. Με αυτές τις μετατροπές, όλοι οι κόμβοι εκτός από την εικονική πηγή και τον εικονικό δέκτη είναι κόμβοι ενδιάμεσης μεταφοράς, οπότε το πρόβλημα που προκύπτει έχει τη μορφή ενός προβλήματος μέγιστης ροής, αφού έχει έναν μοναδικό δέκτη και μία μοναδική πηγή. Το πρόβλημα της μέγιστης ροής μπορεί να διαμορφωθεί ως πρόβλημα γραμμικού προγραμματισμού και επομένως μπορεί να λυθεί με τη μέθοδο simplex. Όμως, υπάρχει ένας ακόμα πιο αποτελεσματικός αλγόριθμος για την επίλυση του προβλήματος. Αυτός ο αλγόριθμος βασίζεται σε δύο σημαντικές έννοιες, το υπολειπόμενο δίκτυο (residual network) και το επαυξάνον μονοπάτι (augmenting path). Αφού έχουν εκχωρηθεί κάποιες ροές στους κλάδους, το υπολειπόμενο δίκτυο δείχνει τις απομένουσες χωρητικότητες των κλάδων για την ανάθεση επιπλέον ροών. Για παράδειγμα, έστω ο κλάδος ΟΒ που φαίνεται στην επόμενη εικόνα με χωρητικότητα 7. Ο 7 Β Ας υποθέσουμε ότι κάποια στιγμή εκχωρούμε μια ροή από τον κόμβο Ο στον κόμβο Β, οπότε η υπολειπόμενη ροή που μπορεί να εκχωρηθεί στην κατεύθυνση Ο Β είναι 7-5 = 2. Χρησιμοποιούμε το επόμενο σχήμα για να το υποδηλώσουμε αυτό. 111
Ο 2 5 Β Ο αριθμός σε έναν κλάδο δίπλα σε έναν κόμβο δείχνει την απομένουσα χωρητικότητα για ροή από αυτό τον κόμβο προς τον άλλο κόμβο. Επομένως, εκτός από την απομένουσα χωρητικότητα ίση με 2 για ροή από τον κόμβο Ο προς τον κόμβο Β, το 5 δεξιά δείχνει μία απομένουσα χωρητικότητα ίση με 5 για ροή από τον κόμβο Β προς τον κόμβο Ο (η ροή αυτή θα ακύρωνε μέρος της ροής που μόλις εκχωρήθηκε από τον κόμβο Ο προς τον κόμβο Β). Αρχικά, πριν την εκχώρηση οποιασδήποτε ροής, το υπολειπόμενο δίκτυο του παραπάνω παραδείγματος έχει τη μορφή που φαίνεται παραπάνω, όπου κάθε κλάδος του δικτύου έχει μια ορισμένη διεύθυνση. Τώρα, αυτές οι διευθύνσεις έχουν αφαιρεθεί, και επομένως το δίκτυο είναι μη προσανατολισμένο. Όμως, οι χωρητικότητες στις αρχικές διευθύνσεις παραμένουν οι ίδιες, ενώ οι χωρητικότητες στις αντίθετες διευθύνσεις είναι ίσες με 0, οπότε οι περιορισμοί του προβλήματος δεν έχουν αλλάξει. Κάθε φορά που κάποια ροή εκχωρείται σε κάποια διεύθυνση, αυτή η ροή αφαιρείται από την απομένουσα χωρητικότητα σε αυτή τη διεύθυνση και προστίθεται στην απομένουσα χωρητικότητα της αντίθετης διεύθυνσης. Ένα επαυξάνον μονοπάτι είναι ένα προσανατολισμένο μονοπάτι από την πηγή προς το δέκτη στο υπολειπόμενο δίκτυο τέτοιο ώστε κάθε κλάδος σε αυτό το μονοπάτι να έχει αυστηρά θετική απομένουσα χωρητικότητα. Η ελάχιστη από αυτές τις απομένουσες χωρητικότητες είναι η λεγόμενη απομένουσα χωρητικότητα του επαυξάνοντος μονοπατιού, επειδή αντιπροσωπεύει την ποσότητα ροής που μπορεί με εφικτό τρόπο να εκχωρηθεί σε ολόκληρο το μονοπάτι. Επομένως, κάθε επαυξάνον μονοπάτι δίνει μία επιλογή για να αυξήσουμε περαιτέρω τη ροή σε ολόκληρο το αρχικό δίκτυο. Ο αλγόριθμος επιλέγει διαδοχικά κάποιο επαυξάνον μονοπάτι και προσθέτει μια ροή ίση με την απομένουσα χωρητικότητά του στο αρχικό δίκτυο. Αυτή η διαδικασία συνεχίζεται μέχρι να μην υπάρχουν καθόλου επαυξάνοντα μονοπάτια, οπότε δεν μπορεί να αυξηθεί περαιτέρω η ροή από την πηγή προς το δέκτη. Η βελτιστότητα της τελικής λύσης βεβαιώνεται από το ότι επαυξάνοντα μονοπάτια μπορούν να ακυρώσουν κάποια ροή που έχει εκχωρηθεί προηγουμένως στο αρχικό δίκτυο, επομένως μία οποιαδήποτε επιλογή μονοπατιών για εκχώρηση ροής δεν μπορεί να εμποδίσει τη χρήση ενός καλύτερου συνδυασμού μονοπατιών για εκχώρηση ροών. Έχοντας αυτά στο μυαλό μας, κάθε επανάληψη του αλγορίθμου αποτελείται από τα εξής τρία βήματα: Αλγόριθμος του Προβλήματος της Μέγιστης Ροής 1. Βρες ένα επαυξάνον μονοπάτι (δηλαδή ένα προσανατολισμένο μονοπάτι από την πηγή προς το δέκτη, τέτοιο ώστε κάθε κλάδος αυτού του μονοπατιού να έχει αυστηρά θετική απομένουσα χωρητικότητα). (Αν δεν υπάρχει κανένα, οι καθαρές ροές που έχουν ήδη εκχωρηθεί αποτελούν ένα βέλτιστο σχέδιο ροής.) 2. Βρες στο μονοπάτι αυτό τoν κλάδο με τη μικρότερη απομένουσα χωρητικότητα ροής (αυτή η χωρητικότητα συμβολίζεται με c*) και αύξησε τη ροή στο μονοπάτι κατά c*. 112
3. Μείωσε κατά c* την απομένουσα χωρητικότητα ροής σε κάθε κλάδο του μονοπατιού. Αύξησε κατά c* την απομένουσα χωρητικότητα ροής στην αντίθετη κατεύθυνση κάθε κλάδου του μονοπατιού. Πήγαινε στο βήμα 1. Στο Βήμα 1, υπάρχει συχνά ένας μεγάλος αριθμός εναλλακτικών επαυξάνοντων μονοπατιών. Αν και ο τρόπος επιλογής κάποιου από αυτά τα μονοπάτια είναι πολύ σημαντικός για την αποτελεσματικότητα του αλγόριθμου σε προβλήματα μεγάλης κλίμακας, για τα μικρά προβλήματα που εξετάζουμε στα πλαίσια του μαθήματος θα θεωρήσουμε ότι αυτή η επιλογή γίνεται αυθαίρετα. Παράδειγμα 9.3 Εφαρμόζοντας τον αλγόριθμο στο πρόβλημά μας (με αυθαίρετη επιλογή μονοπατιού σε κάθε επανάληψη) έχουμε τα παρακάτω αποτελέσματα, όπου οι αριθμοί στους κλάδους αντιπροσωπεύουν τις απομένουσες χωρητικότητες ροής. Επανάληψη 1. Ένα από τα επαυξάνοντα μονοπάτια είναι Ο Β Ε Τ, που έχει απομένουσα χωρητικότητα ροής ίση με min{7,5,6} = 5. Εκχωρώντας ροή ίση με 5 στο μονοπάτι αυτό, παίρνουμε το ακόλουθο δίκτυο: Επανάληψη 2. Εκχώρησε ροή ίση με 3 στο επαυξάνον μονοπάτι Ο Α D Τ. Το δίκτυο που προκύπτει είναι: Επανάληψη 3. Εκχώρησε ροή ίση με 1 στο επαυξάνον μονοπάτι Ο Α Β D Τ. 113
Επανάληψη 4. Εκχώρησε ροή ίση με 2 στο επαυξάνον μονοπάτι Ο Β D Τ. Το δίκτυο που προκύπτει είναι: Επανάληψη 5. Εκχώρησε ροή ίση με 1 στο επαυξάνον μονοπάτι Ο C E D Τ. Επανάληψη 6. Εκχώρησε ροή ίση με 1 στο επαυξάνον μονοπάτι Ο C E Τ. Το δίκτυο που προκύπτει είναι: Επανάληψη 7. Εκχώρησε ροή ίση με 1 στο επαυξάνον μονοπάτι Ο C E B D Τ. Το δίκτυο που προκύπτει είναι: Δεν υπάρχουν άλλα επαυξάνοντα μονοπάτια, επομένως η παρούσα εκχώρηση ροής είναι βέλτιστη και ίση με 14. Το σχέδιο ροής μπορεί να προσδιοριστεί ή με άθροιση των εκχωρήσεων ροής ή με σύγκριση των υπολειπόμενων χωρητικοτήτων ροής με τις αρχικές. Χρησιμοποιώντας τη δεύτερη μέθοδο, υπάρχει ροή σε έναν κλάδο, αν η τελική υπολειπόμενη χωρητικότητα είναι μικρότερη από την αρχική χωρητικότητα. Το μέγεθος αυτής της ροής θα είναι ίσο με την ποσότητα κατά την οποία η αρχική χωρητικότητα ροής έχει μειωθεί. 114
Το παράδειγμα αυτό επεξηγεί γιατί αντικαθιστούμε κάθε προσανατολισμένο κλάδο i j στο αρχικό δίκτυο με έναν μη προσανατολισμένο κλάδο, και μετά αυξάνουμε την απομένουσα χωρητικότητα για τη ροή j i με c*, όταν μια ροή ίση με c* εκχωρείται στην κατεύθυνση i j. Χωρίς αυτή την τεχνική, οι πρώτες έξι επαναλήψεις θα ήταν ακριβώς οι ίδιες. Όμως, σε αυτό το σημείο, θα φαινόταν ότι δεν υπάρχει κάποιο επαυξάνον μονοπάτι (επειδή η πραγματική αχρησιμοποίητη χωρητικότητα του Ε Β είναι 0). Επομένως, αυτή η τεχνική μας επιτρέπει να προσθέσουμε ροή ίση με 1 στο μονοπάτι Ο C E B D Τ στην επανάληψη 7. Ουσιαστικά, αυτή η επιπρόσθετη εκχώρηση ροής, ακυρώνει μία μονάδα ροής που εκχωρήθηκε στην επανάληψη 1 (Ο Β Ε Τ) και την αντικαθιστά με εκχωρήσεις μιας μονάδας ροής και στο Ο Β D Τ και στο Ο C Ε Τ. 9.5.1 Εύρεση ενός επαυξάνοντος μονοπατιού Το πιο δύσκολο μέρος αυτού του αλγόριθμου, όταν εφαρμόζεται σε μεγάλα δίκτυα, είναι η εύρεση ενός επαυξάνοντος μονοπατιού από την πηγή στο δέκτη. Αυτό μπορεί να διευκολυνθεί με την παρακάτω συστηματική διαδικασία: Αρχίζουμε με προσδιορισμό όλων των κόμβων, που μπορούμε να φτάσουμε από την πηγή με έναν κλάδο, με αυστηρά θετική υπολειπόμενη χωρητικότητα. Στη συνέχεια, για κάθε έναν από αυτούς τους κόμβους προσδιορίζουμε όλους τους νέους κόμβους (που δεν έχουμε φτάσει), στους οποίους μπορούμε να φτάσουμε με έναν κλάδο με θετική υπολειπόμενη χωρητικότητα ροής. Επαναλαμβάνουμε διαδοχικά αυτή τη διαδικασία με τους νέους κόμβους. Αποτέλεσμα θα είναι ο προσδιορισμός ενός δένδρου όλων των κόμβων που μπορούμε να φτάσουμε από την πηγή μέσω ενός μονοπατιού με αυστηρά θετική χωρητικότητα ροής. Έτσι, η διαδικασία αυτή θα δίνει πάντα ένα επαυξάνον μονοπάτι (εφόσον φυσικά υπάρχει) από την πηγή στο δέκτη. Η διαδικασία παρουσιάζεται στο επόμενο διάγραμμα για το δίκτυο που προκύπτει από την επανάληψη 6 του παραπάνω παραδείγματος. Αν και η μέθοδος αυτή είναι αρκετά εύκολη, θα ήταν χρήσιμο να μπορούμε ν' αναγνωρίζουμε πότε φτάνουμε σε βέλτιστη λύση, χωρίς διεξοδική έρευνα για ένα μονοπάτι που δεν υπάρχει. Αυτό είναι πολλές φορές εφικτό λόγω ενός σημαντικού θεωρήματος της θεωρίας δικτύων, που είναι γνωστό ως «θεώρημα της μέγιστης-ροής ελάχιστης-τομής» (max-flow min-cut theorem). Ως τομή (cut) ορίζεται ένα σύνολο προσανατολισμένων κλάδων, που περιέχει τουλάχιστον έναν κλάδο από κάθε μονοπάτι από την πηγή στο δέκτη. Φυσικά, υπάρχουν πολλοί τρόποι να σχηματίσουμε μία τομή που «κόβει» στα δύο το δίκτυο. Η τιμή ενός κλάδου (cut value) είναι το άθροισμα των 115
χωρητικοτήτων ροής των κλάδων της τομής (προς τη συγκεκριμένη κατεύθυνση). Σύμφωνα με το θεώρημα της μέγιστης-ροής ελάχιστης-τομής, σε κάθε δίκτυο με μια πηγή και ένα δέκτη, η μέγιστη εφικτή ροή από την πηγή στο δέκτη είναι ίση με την ελάχιστη τιμή οποιασδήποτε τομής του δικτύου. Έτσι, αν F είναι η ποσότητα ροής από την πηγή στο δέκτη για κάθε εφικτό σχέδιο ροής, η τιμή κάθε τομής είναι ένα άνω φράγμα στο F και η μικρότερη τιμή μιας τομής είναι ίση με τη μέγιστη τιμή του F. Έτσι, αν μπορεί να βρεθεί μια τομή στο αρχικό δίκτυο, της οποίας η τιμή είναι ίση με την τιμή της ροής που βρέθηκε με τη διαδικασία επίλυσης, αυτό το σχέδιο ροής πρέπει να είναι το βέλτιστο. Ισοδύναμα, η βέλτιστη λύση έχει βρεθεί, όταν υπάρχει μια τομή στο υπολειπόμενο δίκτυο, της οποίας η τιμή είναι μηδέν. Για να επεξηγηθούν τα προηγούμενα, έστω το αρχικό δίκτυο του προηγούμενου παραδείγματος, το οποίο φαίνεται και στο παρακάτω διάγραμμα. Σημειώνεται ότι η τιμή της τομής που φαίνεται στο διάγραμμα αυτό είναι 3+4+1+6 = 14, που βρέθηκε να είναι η μέγιστη τιμή του F και έτσι η τομή αυτή είναι μια ελάχιστη τομή. Σημειώνεται ακόμα ότι στο δίκτυο που προέκυψε από την επανάληψη 7, όπου F = 14, η αντίστοιχη τομή έχει τιμή μηδέν σε σχέση με τις υπολειπόμενες χωρητικότητες ροής. Αν αυτό είχε παρατηρηθεί, δε θα ήταν ανάγκη να αναζητούμε επιπρόσθετα επαυξάνοντα μονοπάτια αφού θα ξέραμε ότι η παρούσα λύση είναι βέλτιστη. 9.6 Το πρόβλημα της ροής ελάχιστου κόστους Το πρόβλημα της ροής ελάχιστου κόστους κατέχει μία πολύ σημαντική θέση μεταξύ των μοντέλων βελτιστοποίησης δικτύων, τόσο επειδή περιλαμβάνει μία πολύ ευρεία ομάδα εφαρμογών αλλά και επειδή μπορεί να επιλυθεί πολύ αποτελεσματικά. Όπως και το πρόβλημα της μέγιστης ροής, εξετάζει ροή μέσω ενός δικτύου με περιορισμένες χωρητικότητες κλάδων. Όπως το πρόβλημα της συντομότερης διαδρομής, θεωρεί ένα κόστος (ή απόσταση) για ροή μέσω ενός κλάδου. Όπως το πρόβλημα μεταφοράς ή το πρόβλημα ανάθεσης, μπορούν να συμπεριληφθούν στο πρόβλημα πολλές πηγές και πολλοί δέκτες για την ροή, με αντίστοιχα κόστη. Μάλιστα, όλα τα παραπάνω προβλήματα είναι ειδικές περιπτώσεις του προβλήματος ροής ελάχιστου κόστους όπως θα επεξηγήσουμε στη συνέχεια. Το πρόβλημα ροής ελάχιστου κόστους έχει τα εξής χαρακτηριστικά: 1. Το δίκτυο είναι προσανατολισμένο και συνεκτικό. 2. Τουλάχιστον ένας κόμβος είναι πηγή. 3. Τουλάχιστον ένας κόμβος είναι δέκτης. 116
4. Όλοι οι υπόλοιποι κόμβοι είναι κόμβοι ενδιάμεσης μεταφοράς. 5. Ροή σε έναν κλάδο επιτρέπεται μόνο στην κατεύθυνση που δηλώνεται από το αντίστοιχο βέλος και η μέγιστη τιμή της ροής αυτής δίνεται από τη χωρητικότητα του κλάδου αυτού. Αν επιτρέπεται ροή και στις δύο κατευθύνσεις, αυτό υποδηλώνεται από ένα ζεύγος τόξων με αντίθετες κατευθύνσεις. 6. Το δίκτυο έχει αρκετούς κλάδους με αρκετή χωρητικότητα για να είναι ικανή η ροή που παράγεται στους κόμβους-πηγές να φτάσει στους κόμβους-δέκτες. 7. Το κόστος της ροής μέσω ενός κλάδου είναι ανάλογο με την ποσότητα ροής και το μοναδιαίο τέτοιο κόστος είναι γνωστό. 8. Ο σκοπός είναι να ελαχιστοποιηθεί το συνολικό κόστος μεταφοράς της ποσότητας ροής ώστε να ικανοποιηθεί η συνολική ζήτηση. (Εναλλακτικά κάποιος μπορεί να μεγιστοποιήσει το συνολικό κέρδος.) 9.6.1 Μορφοποίηση του προβλήματος Έστω ένα προσανατολισμένο και συνεκτικό δίκτυο όπου οι n κόμβοι περιλαμβάνουν τουλάχιστον έναν κόμβο πηγή και τουλάχιστον έναν δέκτη. Οι μεταβλητές απόφασης είναι: x ij = ροή μέσω του κλάδου i j και οι παράμετροι του προβλήματος είναι: c ij = μοναδιαίο κόστος ροής μέσω του κλάδου i j u ij = χωρητικότητα ροής κλάδου i j b i = καθαρή ροή που δημιουργείται στον κόμβο i. Η τιμή του εξετάζει από τη φύση του κόμβου i, όπου b i > 0 αν ο κόμβος i είναι πηγή b i < 0 αν ο κόμβος i είναι δέκτης b i = 0 αν ο κόμβος i είναι ενδιάμεσης μεταφοράς. Ο σκοπός είναι να ελαχιστοποιηθεί το συνολικό κόστος μεταφοράς της διαθέσιμης ποσότητας ροής μέσω του δικτύου ώστε να ικανοποιηθεί η συνολική ζήτηση. Χρησιμοποιώντας τη συνθήκη ότι τα παρακάτω αθροίσματα λαμβάνονται μόνο επί υπαρχόντων κλάδων, η μορφοποίηση γραμμικού προγραμματισμού του προβλήματος είναι Min Z = n n n ij ij i= 1 j= 1 n s.t. x x = b, κομβο i, ij ji i j= 1 j= 1 0 x u, κλαδο i j. ij c x ij Το πρώτο άθροισμα στους περιορισμούς των κόμβων παριστάνει τη συνολική ροή από τον κόμβο i, ενώ το δεύτερο παριστάνει τη συνολική ροή προς τον κόμβο i. Έτσι, η διαφορά είναι η καθαρή ροή που δημιουργείται στον κόμβο αυτόν. Σε μερικές εφαρμογές, είναι απαραίτητο να υπάρχει ένα κάτω όριο L ij > 0 για τη ροή μέσω κάθε κλάδου i j. Όταν συμβαίνει αυτό, χρησιμοποιούμε έναν μετασχηματισμό 117
των μεταβλητών x ij = x ij - L ij, και αντικαθιστούμε παντού στο μοντέλο x ij = x ij + L ij, οπότε παίρνουμε πάλι την παραπάνω μορφοποίηση με περιορισμούς μη αρνητικότητας. Δεν υπάρχει εγγύηση ότι το πρόβλημα θα έχει εφικτές λύσεις, το οποίο εξαρτάται κυρίως από το ποιοι κόμβοι είναι υπάρχοντες στο δίκτυο και ποιες είναι οι χωρητικότητές τους. Παρόλα αυτά, για ένα συνηθισμένο δίκτυο, η κύρια συνθήκη που είναι απαραίτητη είναι η ακόλουθη. Ιδιότητα για ύπαρξη εφικτών λύσεων: Μία απαραίτητη συνθήκη για να έχει ένα πρόβλημα ροής ελάχιστου κόστους εφικτές λύσεις είναι n bi = 0. i= 1 Δηλαδή θα πρέπει η συνολική ροή που δημιουργείται στους κόμβους-πηγές να είναι ίση με τη συνολική ροή που καταναλώνεται στους κόμβους-δέκτες. Αν οι τιμές των b i κάποιας εφαρμογής παραβιάζουν αυτή τη συνθήκη, η συνήθης εξήγηση είναι ότι είτε οι παροχές είτε οι ζητήσεις (όποιες είναι μεγαλύτερες) παριστάνουν άνω όρια και όχι ακριβείς ποσότητες. Εάν αυτό συμβεί, προσθέτουμε είτε έναν εικονικό κόμβο δέκτη για να απορροφήσει την επιπλέον ροή (με κλάδους με κόστος c ij = 0 από κάθε κόμβο πηγή προς αυτό τον κόμβο), είτε έναν εικονικό κόμβο πηγή για να παρέχει την επιπλέον ροή (με κλάδους με κόστος c ij = 0 από αυτό τον κόμβο προς κάθε κόμβο πηγή). Σε πολλές περιπτώσεις, οι παράμετροι b i και u ij έχουν ακέραιες τιμές, και η εφαρμογή απαιτεί ότι και οι ποσότητες ροής x ij παίρνουν ακέραιες τιμές. Ευτυχώς, όπως ακριβώς και στο πρόβλημα μεταφοράς, αυτός ο περιορισμός εξασφαλίζεται χωρίς να χρειάζεται να επιβάλλουμε περιορισμούς ακεραιότητας στις μεταβλητές λόγω της ακόλουθης ιδιότητας. Ιδιότητα ακέραιων λύσεων: Για προβλήματα ροής ελάχιστου κόστους όπου όλες οι παράμετροι b i και u ij έχουν ακέραιες τιμές, όλες οι βασικές μεταβλητές σε κάθε βασική εφικτή λύση έχουν επίσης ακέραιες τιμές. Παράδειγμα 9.4 Έστω το δίκτυο του ακόλουθου σχήματος. b A = 50 c AD = 9 b D = -30 Α D u AB = 10 c AB = 2 c AC = 4 c BC = 3 b C = 0 c ED = 2 C u CE = 80 c CE = 1 c DE = 3 Β E b B = 40 b A = -60 118
Σε αυτό το σχήμα φαίνονται οι τιμές των b i για κάθε κόμβο, και τα κόστη c ij για κάθε κλάδο. Όταν b i > 0, σημαίνει ότι ο αντίστοιχος κόμβος είναι κόμβος πηγή, ενώ όταν b i < 0 σημαίνει ότι είναι κόμβος δέκτης. Φυσικά, όταν b i = 0, ο αντίστοιχος κόμβος είναι ενδιάμεσης μεταφοράς. Όλοι εκτός από δύο κλάδους έχουν χωρητικότητες που είναι μεγαλύτερες από τη συνολική ροή που παράγεται (50 + 40 = 90), οπότε για όλους αυτούς τους κλάδους, η χωρητικότητα μπορεί να θεωρηθεί άπειρη. Η μορφοποίηση γραμμικού προγραμματισμού αυτού του προβλήματος είναι Min Ζ = 2x AB + 4x AC + 9x AD + 3x BC + x CE + 3x DE + 2x ED s.t. x AB + x AC + x AD = 50 -x AB + x BC = 40 -x AC x BC + x CE = 0 -x AD + x DE + x ED = -30 -x CE x DE + x ED = -60 x AB < 10, x CE < 80, όλα τα x ij > 0 Παρατηρήστε στην παραπάνω μορφοποίηση την ειδική δομή του προβλήματος ροής ελάχιστου κόστους. Κάθε μεταβλητή εμφανίζεται στους λειτουργικούς περιορισμούς εμφανίζεται ακριβώς δύο φορές, μία με συντελεστή +1 και μία με συντελεστή -1. Αυτή η δομή εμφανίζεται σε κάθε πρόβλημα ροής ελάχιστου κόστους και είναι η αιτία που το πρόβλημα έχει την ιδιότητα ακέραιων λύσεων. Ένα άλλο αποτέλεσμα που προκύπτει από αυτή τη δομή είναι ότι ένας οποιοσδήποτε από τους περιορισμούς κάποιου κόμβου είναι περιττός. Αυτό συμβαίνει επειδή αν αθροίσουμε όλους τους περιορισμούς αυτούς κατά μέλη, και υποθέτοντας ότι εφικτές λύσεις υπάρχουν (δηλαδή το άθροισμα των b i είναι 0), παίρνουμε 0 και στα δύο μέλη. Με άλλα λόγια, το αρνητικό οποιασδήποτε ισότητας είναι ίσο με το άθροισμα όλων των άλλων ισοτήτων. 9.6.2 Ειδικές περιπτώσεις Το πρόβλημα μεταφοράς. Για να μορφοποιήσουμε το πρόβλημα μεταφοράς σαν πρόβλημα ροής ελάχιστου κόστους, παρατηρούμε ότι έχουμε έναν κόμβο πηγή για κάθε σημείο παραγωγής και έναν κόμβο δέκτη για κάθε σημείο ζήτησης και καθόλου κόμβους ενδιάμεσης μεταφοράς. Κάθε κλάδος έχει κατεύθυνση από έναν κόμβο πηγή σε έναν κόμβο δέκτη, όπου η μεταφορά x ij τεμαχίων από το σημείο παραγωγής i στο σημείο κατανάλωσης j αντιστοιχεί σε μια ροή ίση με x ij μέσω του κλάδου i j. Το κόστος μεταφοράς c ij αντιστοιχεί στο κόστος ροής του κλάδου i j. Εφόσον στο πρόβλημα μεταφοράς δεν υπάρχουν άνω όρια στις ποσότητες που μπορούν να μεταφερθούν, όλα τα u ij είναι ίσα με. Το πρόβλημα ανάθεσης. Το πρόβλημα ανάθεσης είναι μία ειδική περίπτωση του προβλήματος μεταφοράς, όπου ο αριθμός των κόμβων παραγωγής είναι ίσος με τον αριθμό των κόμβων κατανάλωσης, b i = 1 για κάθε κόμβο παραγωγής και b i = -1 για κάθε κόμβο κατανάλωσης. Επομένως, είναι και αυτό μια ειδική περίπτωση του προβλήματος ροής ελάχιστου κόστους. Το πρόβλημα της συντομότερης διαδρομής. Για να μορφοποιήσουμε το πρόβλημα αυτό ως πρόβλημα ροής ελάχιστου κόστους, θέτουμε μία μοναδική παροχή b i = 1 για τον 119
αρχικό κόμβο, μία μοναδική κατανάλωση b i = -1 για τον κόμβο προορισμού, ενώ όλοι οι άλλοι κόμβοι είναι ενδιάμεσης μεταφοράς. Επειδή το δίκτυο του προβλήματος της συντομότερης διαδρομής δεν είναι προσανατολισμένο, ενώ το δίκτυο του προβλήματος ροής ελάχιστου κόστους είναι προσανατολισμένο, αντικαθιστούμε κάθε σύνδεση με ένα ζεύγος προσανατολισμένων κλάδων με αντίθετες κατευθύνσεις. Η απόσταση μεταξύ των κλάδων i και j είναι το μοναδιαίο κόστος ροής c ij. Και σε αυτή την περίπτωση, δεν υπάρχουν περιορισμοί χωρητικότητας, οπότε u ij = για κάθε κλάδο. Το πρόβλημα της μέγιστης ροής. Σε αυτή την περίπτωση, μόνο τρεις τροποποιήσεις χρειάζονται για να έχουμε ένα πρόβλημα ροής ελάχιστου κόστους. Πρώτα, θέτουμε c ij = 0 για κάθε κλάδο, ώστε να απεικονίσουμε την απουσία στοιχείων κόστους στο πρόβλημα μέγιστης ροής. Δεύτερον, επιλέγουμε μια ποσότητα F που είναι ένα ασφαλές άνω όριο στη μέγιστη ροή μέσω του δικτύου, και μετά αναθέτουμε μία παροχή και μία ζήτηση ίση με F στον κόμβο προέλευσης και στον κόμβο προορισμού (επειδή όλοι οι άλλοι είναι κόμβοι ενδιάμεσης μεταφοράς, αυτόματα έχουν b i = 0. Τρίτον, προσθέτουμε έναν κλάδο από τον κόμβο προέλευσης απευθείας στον κόμβο προορισμού με ένα αυθαίρετα μεγάλο κόστος c ij = Μ και άπειρη χωρητικότητα (u ij = ). Λόγω αυτού του θετικού κόστους του κλάδου αυτού και το μηδενικό κόστος όλων των άλλων κλάδων, το πρόβλημα ροής ελάχιστου κόστους θα στείλει τη μέγιστη εφικτή ροή μέσω των άλλων κλάδων, το οποίο εξυπηρετεί το σκοπό του προβλήματος μέγιστης ροής. Το γεγονός ότι αυτά τα προβλήματα είναι ειδικές περιπτώσεις του προβλήματος ροής ελάχιστου κόστους έχει ιδιαίτερη σημασία και για άλλους λόγους. Ο πρώτος είναι ότι η θεωρία του προβλήματος ροής ελάχιστου κόστους παρέχει ένα υπόβαθρο για κάθε ένα από αυτά τα προβλήματα. Ένας άλλος λόγος είναι ότι κάποιες από τις πολλές εφαρμογές του προβλήματος ροής ελάχιστου κόστους έχει στοιχεία μιας ή περισσοτέρων των ειδικών περιπτώσεων, οπότε είναι σημαντικό να γνωρίζουμε πώς να μορφοποιήσουμε αυτά τα στοιχεία στο ευρύτερο πλαίσιο του γενικού προβλήματος. 9.7 Προβλήματα Πρόβλημα 9.1 Χρησιμοποιώντας τον αλγόριθμο του Dijkstra, να βρεθεί η συντομότερη διαδρομή από τον κόμβο Α στον κόμβο Ε στο παρακάτω δίκτυο. Δείξτε καθαρά τη σειρά εξέτασης των κόμβων και τις αντίστοιχες αποστάσεις τους. Β 1 Δ 7 Α 5 2 2 3 1 9 Γ Ε 120
9.8 Σημειώσεις κεφαλαίου Κλασσικό βιβλίο για ροές σε δίκτυα θεωρείται των Ahuja et al. (1993). Ο αλγόριθμος εύρεσης της συντομότερης διαδρομής που παρουσιάστηκε οφείλεται στον Dijkstra (1959). Οι αλγόριθμοι εύρεσης του δέντρου ελάχιστης κάλυψης οφείλονται στους Prim (1957) και Kruskal (1956). Το θεώρημα της μέγιστης ροής ελάχιστης τομής αποδείχτηκε στο άρθρο των Ford and Fulkerson (1956). Στο ίδιο άρθρο, οι συγγραφείς έλυσαν το πρόβλημα της μέγιστης ροής χρησιμοποιώντας επαυξάνοντα μονοπάτια. Κλασσικό θεωρείται και το βιβλίο τους (1962) που περιέχει μία εκτενή αναφορά στο αντικείμενο. 121
ΒΙΒΛΙΟΓΡΑΦΙΑ Ahuja RK, Magnanti TL and Orlin JB, (1993). Network Flows: Theory, Algorithms and Applications, Prentice Hall. Bazaraa MS, Jarvis JJ and Sherali HD, (2004). Linear Programming and Network Flows, Wiley-Interscience. Bazaraa MS, Sherali HD and Shetty CM, (2006). Nonlinear Programming: Theory and Algorithms, Wiley. Bellman R, (2003). Dynamic Programming, Dover Publications. Bertsekas DP, (1999). Nonlinear Programming, Athena Scientific. Bertsekas DP, (1999). Dynamic Programming and Optimal Control, Athena Scientific. Bertsimas D and Tsitsiklis JN, (1997). Introduction to Linear Optimization, Athena Scientific. Bixby RE, Fenelon M, Gu Z, Rothberg E and Wunderling R, (1999). MIP: Theory and Practice Closing the Gap, Proceedings of IFIP TC7 Conference, Cambridge. Cook SA, (1971). The Complexity of Theorem Proving Procedures, Proc. 3 rd ACM Symp. on the Theory of Computing, ACM, 151-158. Cook WJ, Schrijver A, Cunningham WH and Pulleyblank WR, (1997). Combinatorial Optimization, John Wiley & Sons. Cormen TH, Leiserson CE, Rivest RL, Stein C, (2001). Introduction to Algorithms, The MIT Press. Crowder H, Johnson EL, and Padberg M, (1983). Solving Large-Scale Zero-One Linear Programming Problems, Operations Research, 31: 803-834. Dantzig G, (1998). Linear Programming and Extensions, Princeton University Press. Dijkstra EW, (1959). A Note on Two Problems in Connection with Graphs, Numerische Mathematik, 1: 269-271. Edmonds J, (1965). Paths trees and Flowers, Canadian Journal of Mathematics, 17: 449-467. Edmonds J, (1971). Matroids and the Greedy Algorithm, Mathematical Programming, 1: 127-136. 137
Ford LR and Fulkerson DR, (1956). Maximal Flow through a Network, Canadian Journal of Mathematics, 8: 399-404. Ford LR and Fulkerson DR, (1962). Flows in Networks, Princeton University Press. Garey MR and Johnson DS, (1979). Computers and Intractability: A Guide to the Theory of NP-Completeness, Freeman & Company. Hillier FS and Lieberman GJ, (2001). Introduction to Operations Research, McGraw-Hill Companies. Hoffman KL and Padberg, (1991). Improving LP-Representations of Zero-One Linear Programs for Branch and Cut, ORSA Journal on Computing, 3: 121-134. Johnson EL, Kostreva MM and Suhl UH, (1985). Solving 0-1 Integer Programming Problems Arising from Large Scale Planning Models, Operations Research, 33: 803-819. Karmarkar N, (1984). A New Polynomial Time Algorithm for Linear Programming, Combinatorica, 4: 375-395. Khachian LG, (1979). A Polynomial Algorithm for Linear Programming, Doklady Akad. Nauk USSR, 244: 1093-1096, Translated in Soviet Math. Doklady, 20: 191-194. Kruskal JB, (1956). On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem, Proc. Amer. Math. Soc., 7: 48-50. Lawler EL, Lenstra JK, Rinnooy Kan AHG and Shmoys DB, (1985). The Traveling Salesman Problem : A Guided Tour of Combinatorial Optimization, John Wiley & Sons. Luenberger DG, (2003). Linear and Nonlinear Programming, Springer. Martello S and Toth P, (1990). Knapsack Problems: Algorithms and Computer Implementations, John Wiley & Sons. Nemhauser GL and Wolsey LA, (1988). Integer and Combinatorial Optimization, John Wiley & Sons. Papadimitriou CH and Steiglitz K, (1998). Combinatorial Optimization: Algorithms and Complexity, Dover Publications. Prim RC, (1957). Shortest Connection Networks and Some Generalizations, BSTJ, 36: 1389-1401. Schrijver A, (1998). Theory of Linear and Integer Programming, John Wiley & Sons. 138
Standish TA, (1995). Data Structures, Algorithms & Software Principles in C, Addison-Wesley. Van Roy TJ and Wolsey LA, (1987). Solving Mixed 0-1 Programs by Automatic Reformulation, Operations Research, 35: 45-57. Whitney H, (1935). On the Abstract Properties of Linear Dependence, Amer. J. Math., 57: 509-533. Williams HP, (1999). Model Building in Mathematical Programming, John Wiley & Sons. Wolsey LA, (1998). Integer Programming, John Wiley & Sons. 139