ΑΛΓΟΡΙΘΜΟΙ http://eclass.aueb.gr/courses/inf161/ Άνοιξη 2016 - I. ΜΗΛΗΣ ΔΥΝΑΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 1
Dynamic Programming Richard Bellman (1953) Etymology (at that time; Bellman was studying multi-stage decision processes) Dynamic: relating to time Programming : what to do and when to do it Dynamic Programming: planning over time Bellman gave an impressive name to be accepted by the Secretary of Defense (Wilson) who didn t like math research ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 2
Dynamic Programming ΓΕΝΙΚΗ ΙΔΕΑ Ορισμός υπο-προβλημάτων ίδιας δομής με το αρχικό πρόβλημα επικαλυπτόμενα υπο-προβλήματα Optimal substructure Μία βέλτιστη λύση περιέχει/μπορεί να βρεθεί από τις βέλτιστες λύσεις των υπο-προβλημάτων της Λύσε τα υπο-προβλήματα αναδρομικά αρχίζοντας από μικρά/αρχικά υποπροβλήματα μέχρι το αρχικό πρόβλημα Γράψιμο μιας αναδρομικής σχέσης για τη βέλτιστη λύση Η αναδρομική σχέση δίνει μία σειρά (order) των υποπροβλημάτων τέτοια ώστε καθένα μπορεί να λυθεί δεδομένης των λύσεων μικρότερων υπο-προβλημάτων (που εμφανίζονται νωρίτερα στη σειρά). ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 3
Dynamic Programming ΑΛΓΟΡΙΘΜΟΣ Μετάφραση της αναδρομικής σχέσης σε έναν επαναληπτικό αλγόριθμο (ΠΟΤΕ αναδρομικό) Χρήση ενός πίνακα για την αποθήκευση ενδιάμεσων αποτελεσμάτων και επαναχρησιμοποίησης τους (memoization) Εύρεση πρώτα της τιμής της βέλτιστης λύσης π.χ. η μέγιστη αξία ενός σακιδίου Εύρεση της ίδιας της βέλτιστης λύσης π.χ. τα αντικείμενα που δίνουν τη μέγιστη αξία ενός σακιδίου ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 4
Algorithm design methods DIVIDE AND CONQUER Non overlapping sub-problems Recursion can be used GREEDY A sub-problem defines the next one A single (greedy) choice DYNAMIC PROGRAMMING Overlapping sub-problems Recursion is forbidden Many choices for a sub-problem OPTIMAL SUB-STRUCTURE ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 5
Algorithm design methods DIVIDE AND CONQUER Non overlapping sub-problems Recursion can be used Tree GREEDY A sub-problem defines the next one A single (greedy) choice Chain DYNAMIC PROGRAMMING Overlapping sub-problems Recursion is forbidden Many choices for a sub-problem OPTIMAL SUB-STRUCTURE DAG ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 6
Fibonacci numbers Fibonacci numbers: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 5 th F N 2 4 th F 1 0 3 rd N 1 F 2 nd N 2 4 3 3 2 2 1 1 0 5 1 0 if if if 1 st call 12 th N N N 1 6 16 th 1 2 0 1 18 th 9 th 13 th 19 th 22 nd 2 3 0 RecursiveFib(N) if N<2: return N return fib1(n-1)+ fib1(n-2) 1 4 17 th 1 2 23 rd 0 24 th 25 th call Recursion? No, thanks! Τ(n) > 2 N/2 1 0 6 th 7 th 8 th 10 th 11 th 14 th 15 th 20 th 21 st ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 7
Fibonacci numbers F N F 1 0 N 1 F N 2 if if if N N N 1 2 0 IterativeFib(N) f[0]=0, f[1]:=1 for i=2 to N: f[i]=f[i-1]+f[i-2] return f[n] Γεμίζουμε ένα πίνακα με τις λύσεις των υπο-προβλημάτων 0 1 1 2 3 5 8 13 21 ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Ο(Ν) Μνήμη= μέγεθος πίνακα = Ο(Ν) Εδώ 3 θέσεις μνήμης αρκούν = Ο(1) Ο(Ν) : εκθετική στο Ι =log N Υπάρχει αλγόριθμος Ο(log N) (1 ο μάθημα) ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 8
Maximum Sub-array ΕΙΣΟΔΟΣ: Πίνακας αριθμών Α[1..n] ΕΞΟΔΟΣ: Υπο-πίνακας Α[p..q] με το μέγιστο άθροισμα στοιχείων Θέλουμε να βρούμε δείκτες τέτοιους ώστε το V ( p, q) δηλαδή, V ( p, q) V ( p', q'), Παράδειγμα: Ιστορία κερδών q i p p, q 0 p q n A( i) να είναι μέγιστο 1 p' q' n Year 1 2 3 4 5 6 7 8 9 Profit -3 2 1-4 5 2-1 3-1 Να βρεθεί η περίοδος ετών με το μεγαλύτερο κέρδος: V(5,8)=9 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 9
Maximum Sub-array Brute-force: O(n 3 ) Reuse of data: O(n 2 ) Divide & Conquer: O(n log n) A[1] m n 2 1 A[n] S 1 = MSA in A(1 m) A[ m] A[ m 1] S 2 = MSA in A(m+1 n) S 3 = MSA containing both A(m) and A(m+1) Dynamic Programming: O(n), Optimal Decompose the problem into smaller sub-problems of the same structure and solve them recursively starting from the trivial case(s) ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 10
Maximum Sub-array: DP Έστω E[i] η τιμή του MSA που τελειώνει στη θέση i To MSA του πίνακα Α είναι ένα από τα E[i] Vmax = max i { E[i] } To πρόβλημα ανάγεται στην εύρεση των E[i] DP: Εύρεση του E[i] με χρήση του E[i-1] Το E[i] περιέχει οπωσδήποτε το στοιχείο A[i] Δύο περιπτώσεις για το E[i]: Είτε περιέχει ΜΟΝΟ ΤΟ ΣΤΟΙΧΕΙΟ A[i]: E[i] = A[i] Ή περιέχει ΚΑΙ ΑΛΛΑ ΣΤΟΙΧΕΙΑ A[j, j+1,i-1,i]: E[i]=E[i-1] + A[i] Άρα E[i] = max { E[i-1]+A[i], A[i] }, με E[1]=A[1] Εάν έχετε την αναδρομική σχέση, έχετε και τον αλγόριθμο! ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 11
Maximum Sub-array: DP Example: E[i] = max { E[i-1]+A[i], A[i] }, E[1]=A[1] A[1..n] 31-41 59 26-53 58 97-93 -23 84 Maximum Sum for any sub Array ending at i th location: E[1..n] Vmax 31-10 59 85 32 90 187 94 71 155 Maximum so far: 31 31 59 85 85 90 187 187 187 187 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 12
Maximum Sub-array: DP E(i) = max { E(i-1)+A[i], A[i] }, E(1)=A[1] MSA(A[1..n]) E[1]=A[1], Vmax=A[1] For i = 2 to n do E[i] = E[i-1]+A[i] if E[i] < A[i]: E[i] = A[i] if E[i] > Vmax: Vmax = E[i] ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(n) ΕΠΙΠΛΕΟΝ ΜΝΗΜΗ: O(n), για τον πίνακα E O(1), μία θέση/μεταβλητή Ε αρκεί ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 13
Maximum Sub-array: DP E(i) = max { E(i-1)+A[i], A[i] }, E(1)=A[1] MSA(A[1..n]) E[1]=A[1], Vmax=A[1], P[1]=1 For i = 2 to n do E[i] = E[i-1]+A[i], P[i]=P[i-1] if E[i] < A[i]: E[i] = A[i] P[i] = i if E[i] > Vmax: Vmax = E[i] p=p[i] q=i ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(n) ΕΠΙΠΛΕΟΝ ΜΝΗΜΗ: O(n), για τους πίνακες E, P Ποιοί είναι οι δείκτες του MSA A[p..q] Έστω P(i) ο δείκτης αρχής του E(i) O(1), δύο θέσεις/μεταβλητές Ε, P αρκούν ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 14
Coin Changing ΕΙΣΟΔΟΣ: Ποσό Ε και σύνολο n νομισμάτων με αξίες V={d 1, d 2, d 3,,d n } EΡΩΤΗΣΗ: Ο ελάχιστος αριθμός νομισμάτων με συνολική αξία E ΥΠΕΝΘΥΜΙΣΕΙΣ: 1. ΜΕΛΕΤΑΜΕ εισόδους με μικρότερη αξία το 1 ΤΟΤΕ υπάρχει πάντα λύση στο πρόβλημα E = 13, V= {10, 5, 2 }, ΑΔΥΝΑΤΟ OPT = βέλτιστο 2. Optimal Substructure : Η βέλτιστη λύση για ποσό Ε που χρησιμοποιεί νόμισμα αξίας d i περιέχει τη βέλτιστη λύση για το ποσό Ε-d i 3. Greedy algorithm: Διάλεξε πάντα το μεγαλύτερο νόμισμα που μπορείς Δεν δίνει πάντα την βέλτιστη λύση E = 40, V= {25, 20, 10, 5,1 }: E = 25 +10 +5, c=3, E = 220, OPT =2 ΠΟΤΕ? Canonical values system ΑΛΛΟΙΩΣ? ΔΥΝΑΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 15
Coin Changing - DP Sub-problem? c[j]: o ελάχιστος αριθμός νομισμάτων για ποσό j c(e): το αρχικό πρόβλημα Εάν η βέλτιστη λύση για ποσό j χρησιμοποιεί ένα νόμισμα αξίας d i, τότε c[j] = 1 + c[j d i ] προφανώς c[0]= 0 Ποιας αξίας νόμισμα? Ελέγχουμε όλες τις αξίες/επιλογές n ΜΕΛΕΤΑΜΕ εισόδους με μικρότερη αξία το 1 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 16
Coin Changing - DP Change(E,d[1..n]) c[0]=0 for j = 1 to E: c[j] = for i = 1 to n: if j d i and 1+c[j d i ] < c[j]: c[j] = 1+c[j d i ] return c Αποφεύγουμε τιμές c[j]<0, ελέγχοντας αν j d i ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Ο(nE), ΟΧΙ πολυωνυμική! ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 17
Coin Changing Example: E=10, {1,3,4} c[0] =0 c[1] =1+ min { c[1-1], c[1-3], c[1-4] } =1, c[2] =1+ min { c[2-1], c[2-3], c[2-4] } =2, c[3] =1+ min { c[3-1], c[3-3], c[3-4] } =1, denom[1]=1 denom[2]=1 denom[3]=3 c[4] =1+ min { c[4-1], c[4-3], c[4-4] } =1, denom[4]=4 4 c[5] =1+ min { c[5-1], c[5-3], c[5-4] } =2, c[6] =1+ min { c[6-1], c[6-3], c[6-4] } =2, n denom[5]=1 denom[6]=3 c[7] =1+ min { c[7-1], c[7-3], c[7-4] } =2, denom[7]=3 3 c[8] =1+ min { c[8-1], c[8-3], c[8-4] } =2, c[9] =1+ min { c[9-1], c[9-3], c[9-4] } =3, denom[8]=4 denom[9]=1 c[10]=1+ min { c[10-1], c[10-3], c[10-4] } =3, denom[10]=3 3 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 18
Coin Changing - DP Ποια είναι τα νομίσματα? denom[1..n]: η αξία του νομίσματος που έδωσε τη βέλτιστη λύση για το ποσό j Change(E,d[1..n]) c[0]=0 for j = 1 to E: c[j] = for i = 1 to n: if j d i j=e while j>0: output denom[j] j= j-denom[j] and 1+c[j d i ] < c[j]: c[j] = 1+c[j d i ] denom[j]=d i ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Ο(nE), ΟΧΙ πολυωνυμική! ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ 08 DP I 19