Κεφάλαιο 4 Δυναµικός Προγραµµατισµός (Dynamic Programming) Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne. 1
Τεχνικές Σχεδίασης Αλγορίθµων Απληστία. Χτίζουµε µια λύση σταδιακά, βελτιστοποιώντας σε κάθε βήµα µυωπικά κάποιο τοπικό κριτήριο. Διαίρει-και-βασίλευε. Διαιρούµε το πρόβληµα σε δύο υπο-προβλήµατα, επιλύουµε ανεξάρτητα κάθε υπο-πρόβληµα και συνδυάζουµε τις λύσεις των υπο-προβληµάτων για να σχηµατίσουµε τη λύση του συνολικού προβλήµατος Δυναµικός προγραµµατισµός. Διαιρούµε το πρόβληµα σε µια ακολουθία επικαλυπτόµενων υπο-προβληµάτων, και χτίζουµε λύσεις σε όλο και µεγαλύτερα υπο-προβλήµατα. 2
Δυναµικός προγραµµατισµός: Ιστορικά στοιχεία Bellman. Πρωταγωνίστησε στη συστηµατική µελέτη του δυναµικού προγραµµατισµού τη δεκαετία του 1950. Ετυµολογία. Δυναµικός Προγραµµατισµός: Ο όρος προγραµµατισµός εδώ δεν αφορά τις γλώσσες προγραµµατισµού Δυναµικός Προγραµµατισµός = planning over time. Ιστορικά παραλειπόµενα: Το Secretary of Defense των ΗΠΑ ήταν εχθρικό προς τη µαθηµατική έρευνα. Ο Bellman αναζήτησε ένα εντυπωσιακό όνοµα για να αποφύγει την αρνητική στάση. "it's impossible to use dynamic in a pejorative sense" "something not even a Congressman could object to" Reference: Bellman, R. E. Eye of the Hurricane, An Autobiography. 3
Εφαρµογές Δυναµικού Προγραµµατισµού Areas. Βιοπληροφορική (Bioinformatics). Control theory. Θεωρία Πληροφοριών (Information theory). Επιχειρησιακή Έρευνα (Operations research). Επιστήµη Υπολογιστών (Computer science): θεωρία, γραφικά, Τεχνητή Νοηµοσύνη, συστήµατα,. Ορισµένοι διάσηµοι αλγόριθµοι δυναµικού προγραµµατισµού. Viterbi for hidden Markov models. Unix diff για τη σύγκριση δύο αρχείων. Smith-Waterman for sequence alignment. Bellman-Ford for shortest path routing in networks. Cocke-Kasami-Younger for parsing context free grammars. 4
6.1 Weighted Interval Scheduling (Σταθµισµένος Χρονοπρογραµµατισµός Διαστηµάτων)
Weighted Interval Scheduling Το πρόβληµα του Weighted interval scheduling. Εργασία j ξεκινά τη χρονική στιγµή s j, τερµατίζει τη χρονική στιµγή f j, και έχει βάρος ή αξία v j. Δύο εργασίες είναι συµβατές εάν δεν υπάρχει επικάλυψη µεταξύ τους. Στόχος: εύρεση συνόλου συµβατών εργασιών µεγίστου βάρους. a b c d e f g 0 1 2 3 4 5 6 7 8 9 10 11 h Time 6
Χρονοπρογραµµατισµός Διαστηµάτων χωρίς βάρη (Unweighted Interval Scheduling) Υπενθυµίζουµε. Ένας άπληστος (greedy) αλγόριθµος λύνει το πρόβληµα εάν όλα τα βάρη είναι 1 (ή αλλιώς, δεν υπάρχουν βάρη). Εξετάζουµε τις εργασίες σε αύξουσα σειρά χρόνου τερµατισµού. Προσθέτω κάθε εργασία που είναι συµβατή µε όσες έχουν επιλεγεί πριν από αυτή. Παρατήρηση. Ο παραπάνω άπληστος αλγόριθµος µπορεί να αποτυχέι πανηγυρικά εάν επιτρέψουµε βάρη στις εργασίες (σταθµισµένος χρονοπρογραµµατισµός διαστηµάτων) βάρος = 999 b βάρος = 1 a 0 1 2 3 4 5 6 7 8 9 10 11 Χρόνος 7
Weighted Interval Scheduling Συµβολισµός. Ονοµάζουµε τις εργασίες µε βάση το χρόνο τερµατισµού τους: f 1 f 2... f n. Ορισµός. p(j) = ο µέγιστος δείκτης i < j τέτοιος ώστε η εργασία i είναι συµβατή µε την j. Παράδειγµα: p(8) = 5, p(7) = 3, p(2) = 0. 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 10 11 8 Time 8
Δυναµικός Προγραµµατισµός: Δυαδική επιλογή Συµβολισµός. OPT(j) = τιµή της βέλτιστης λύσης του υποπροβλήµατος που αποτελείται από τις εργασίες 1, 2,..., j. Περίπτωση 1: OPT επιλέγει την εργασία j. δεν γίνεται να χρησιµοποιηθούν µη συµβατές εργασίες { p(j) + 1, p(j) + 2,..., j - 1 } πρέπει να περιλαµβάνεται η βέλτιστη λύση για το υποπρόβληµα που αποτελείται από τις (υπόλοιπες) συµβατές εργασίες 1, 2,..., p(j) Περίπτωση 2: OPT δεν επιλέγει την εργασία j. βέλτιστα υποπροβλήµατα πρέπει να περιλαµβάνεται η βέλτιστη λύση του υποπροβλήµατος που αποτελείται από τις εργασίες 1, 2,..., j-1 OPT ( j) = 0 max { v + OPT ( p( j)), OPT ( j 1) } j εάν j= 0 διαφορετικά 9
Weighted Interval Scheduling: Brute Force Αλγόριθµος brute force. Input: n, s 1,,s n, f 1,,f n, v 1,,v n Sort jobs by finish times so that f 1 f 2... f n. Compute p(1), p(2),, p(n) Compute-Opt(j) { if (j = 0) return 0 else return max(v j + Compute-Opt(p(j)), Compute-Opt(j-1)) } 10
Weighted Interval Scheduling: Brute Force Παρατήρηση. Ο αναδροµικός αλγόριθµος αποτυγχάνει πανηγυρικά εξαιτίας των περιττών υποπροβληµάτων εκθετικός αλγόριθµος. Παράδειγµα. Ο αριθµός των αναδροµικών προς τα διάφορα επίπεδα των υποπροβληµάτων αυξάνει στη λογική της ακολουθίας Fibonacci. 5 1 4 3 2 3 3 2 2 1 4 5 2 1 1 0 1 0 p(1) = 0, p(j) = j-2 1 0 11
Weighted Interval Scheduling: Memoization (Αποµνηµόνευση) Memoization. Αποθήκευση των αποτελεσµάτων για κάθε υποπρόβληµα σε µια προσωρινή µνήµη; χρήση της αποθηκευµένης λύσης κάθε φορά που απαιτείται. Input: n, s 1,,s n, f 1,,f n, v 1,,v n Sort jobs by finish times so that f 1 f 2... f n. Compute p(1), p(2),, p(n) for j = 1 to n M[j] = empty M[j] = 0 global array M-Compute-Opt(j) { if (M[j] is empty) M[j] = max(w j + M-Compute-Opt(p(j)), M-Compute-Opt(j-1)) return M[j] } 12
Weighted Interval Scheduling: Πολυπλοκότητα Χρόνου Ισχυρισµός. Η έκδοση του αλγόριθµου µε χρήση memoization απαιτεί O(n log n) πολυπλοκότητα χρόνου. Ταξινόµηση εργασιών κατά χρόνο τερµατισµού: O(n log n). Υπολογισµός p( ) : O(n) µετά την ταξινόµηση κατά χρόνο έναρξης. M-Compute-Opt(j): κάθε κλήση απαιτεί χρόνο O(1) time και είτε (i) επιστρέφει την αποθηκευµένη τιµή M[j] (ii) συµπληρώνει την ελεύθερη θέση M[j] και εκτελεί δύο αναδροµικές κλήσεις Μέτρο προόδου (Progress measure)φ= # συµπληρωµένων θέσεων του M[]. αρχικάφ= 0, ισχύει πάντοτεφ n. (ii) αυξάνει το Φ κατά 1 το πολύ 2n αναδροµικές κλήσεις. Ο συνολικός χρόνος εκτέλεσης της M-Compute-Opt(n είναι O(n). Παρατήρηση. O(n) εάν οι εργασίες δοθούν ταξινοµηµένες κατά χρόνου τερµατισµού και χρόνου έναρξης (δύο ξεχωριστές λίστες). 13
Automated Memoization Automated memoization. Πολλές συναρτησικές γλώσσες προγραµµατισµού (π.χ., Lisp) παρέχουν εγγενή υποστήριξη για memoization. Ερώτηµα. Γιατί όχι και οι imperative γλώσσες (π.χ., Java)? (defun F (n) (if (<= n 1) n (+ (F (- n 1)) (F (- n 2))))) Lisp (efficient) static int F(int n) { if (n <= 1) return n; else return F(n-1) + F(n-2); } Java (exponential) F(40) F(39) F(38) F(38) F(37) F(37) F(36) F(37) F(36) F(36) F(35) F(36) F(35) F(35) F(34) 14
Weighted Interval Scheduling: Εύρεση µιας λύσης Ερώτηµα. Ο αλγόριθµος δυναµικού προγραµµατισµού που είδαµε υπολογίζει την τιµή µιας βέλτιστης λύσης. Μπορούµε να υπολογίσουµε την ίδια τη λύση; Απάντηση. Ναι, επεξεργαζόµενοι τα αποτελέσµατα του αλγορίθµου. Run M-Compute-Opt(n) Run Find-Solution(n) Find-Solution(j) { if (j = 0) output nothing else if (v j + M[p(j)] > M[j-1]) print j Find-Solution(p(j)) else Find-Solution(j-1) } # of αναδροµικών κλήσεων n O(n). 15
Weighted Interval Scheduling: Bottom-Up Bottom-up dynamic programming. Unwind recursion (ξετύλιγµα αναδροµής). Input: n, s 1,,s n, f 1,,f n, v 1,,v n Sort jobs by finish times so that f 1 f 2... f n. Compute p(1), p(2),, p(n) Iterative-Compute-Opt { M[0] = 0 for j = 1 to n M[j] = max(v j + M[p(j)], M[j-1]) } 16
πηγές/αναφορές Κεφάλαιο 6, Σχεδίαση Αλγορίθµων, J. Kleinberg and E. Tardos, Ελληνική έκδοση από τις Εκδ. Κλειδάριθµος Χρησιµοποιήθηκε υλικό από τις αντίστοιχες αγγλικές διαφάνειες του Kevin Wayne για το βιβλίο του µαθήµατος 17