Δυναμικός Προγραμματισμός
description
Transcript of Δυναμικός Προγραμματισμός
![Page 1: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/1.jpg)
Δυναμικός Προγραμματισμός
πρόβλημα μεγέθους Ν
διάσπαση
πρόβλημα μεγέθους Ν-k
πρόβλημα μεγέθους k
«Διαίρει και βασίλευε» :
ανεξάρτητα υποπροβλήματα
![Page 2: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/2.jpg)
Δυναμικός Προγραμματισμός
πρόβλημα μεγέθους Ν
διάσπαση
πρόβλημα μεγέθους Ν2
πρόβλημα μεγέθους Ν1
Σε κάποιες περιπτώσεις όμως τα
υποπροβλήματα δεν είναι ανεξάρτητα
Υπάρχουν επικαλυπτόμενα υποπροβλήματα,γεγονός που μπορεί να οδηγήσει σε πολύμεγάλους χρόνους εκτέλεσης
![Page 3: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/3.jpg)
Δυναμικός Προγραμματισμός
Παράδειγμα: Υπολογισμός της ακολουθίας Fibonacci
Η επίλυση της αναδρομικής εξίσωσης δίνει
![Page 4: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/4.jpg)
Δυναμικός Προγραμματισμός
Παράδειγμα: Υπολογισμός της ακολουθίας Fibonacci
int fibonacci(int n){ if (n<1) return 0; if (n==1) return 1; return fibonacci(n-1) + fibonacci(n-2);}
Μπορεί να υπολογιστεί με το ακόλουθο αναδρομικό πρόγραμμα :
![Page 5: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/5.jpg)
Δυναμικός Προγραμματισμός
Παράδειγμα: Υπολογισμός της ακολουθίας Fibonacci
Μπορεί να υπολογιστεί με το ακόλουθο αναδρομικό πρόγραμμα :
Χρόνος εκτέλεσης :
int fibonacci(int n){ if (n<1) return 0; if (n==1) return 1; return fibonacci(n-1) + fibonacci(n-2);}
![Page 6: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/6.jpg)
Δυναμικός Προγραμματισμόςint fibonacci(int n){ if (n<1) return 0; if (n==1) return 1; return fibonacci(n-1) + fibonacci(n-2);}
5
4 3
2 1
1 0
3
2 1
1 0
2
1 0
6
4
3
2 1
1 0
2
1 0
Δένδρο αναδρομής
![Page 7: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/7.jpg)
Δυναμικός Προγραμματισμός
5
4 3
2 1
1 0
3
2 1
1 0
2
1 0
6
4
3
2 1
1 0
2
1 0
Δένδρο αναδρομής
Ιδέα: Αντί να υπολογίσουμε το f4 δύο φορές, το υπολογίζουμε μία φορά και αποθηκεύουμε την τιμή του …
![Page 8: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/8.jpg)
Δυναμικός Προγραμματισμός
5
4 3
2 1
1 0
3
2 1
1 0
2
1 0
6
4
3
2 1
1 0
2
1 0
Δένδρο αναδρομής
Ιδέα: Αντί να υπολογίσουμε το f4 δύο φορές, το υπολογίζουμε μία φορά και αποθηκεύουμε την τιμή του …
ομοίως και για τις άλλες τιμές που χρειαζόμαστε
![Page 9: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/9.jpg)
Δυναμικός Προγραμματισμός
Παράδειγμα: Υπολογισμός της ακολουθίας Fibonacci
int fibonacci(int n){ int i; int F[n+1]; F[0]=; F[1]=1; for (int i=2; i<=n; i++)
F[i] = F[i-1] + F[i-2]; return F[n];}
Μπορεί να υπολογιστεί σε γραμμικό χρόνο με το ακόλουθο πρόγραμμα :
![Page 10: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/10.jpg)
Δυναμικός Προγραμματισμός
Συνθετικός δυναμικός προγραμματισμός (bottom-up dynamic programming)
Υπολογίζει και αποθηκεύει όλες τις τιμές της συνάρτησης με τη σειρά ξεκινώντας τον υπολογισμό από τη μικρότερη τιμή του ορίσματος.
int fibonacci(int n){ int i; int F[n+1]; F[0]=; F[1]=1; for (int i=2; i<=n; i++)
F[i] = F[i-1] + F[i-2]; return F[n];}
![Page 11: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/11.jpg)
Δυναμικός Προγραμματισμός
Αναλυτικός δυναμικός προγραμματισμός (top-down dynamic programming)
int fibonacci(int n){ int t; if (knownF[n] != unknown) return knownF[n]; if (n==0) t = 0; if (n==1) t = 1; if (n > 1) t = fibonacci(n-1) + fibonacci(n-2); return knownF[n] = t;}
Το αναδρομικό πρόγραμμα αποθηκεύει τις τιμές που υπολογίζει και αποφεύγειτον υπολογισμό ήδη αποθηκευμένων τιμών.
![Page 12: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/12.jpg)
Δυναμικός Προγραμματισμόςint fibonacci(int n){ int t; if (knownF[n] != unknown) return knownF[n]; if (n==0) t = 0; if (n==1) t = 1; if (n > 1) t = fibonacci(n-1) + fibonacci(n-2); return knownF[n] = t;}
5
4 3
3
2 1
1 0
2
6
4Δένδρο αναδρομής
![Page 13: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/13.jpg)
Δυναμικός Προγραμματισμός
Αναλυτικός δυναμικός προγραμματισμός (top-down dynamic programming)
Το αναδρομικό πρόγραμμα αποθηκεύει τις τιμές που υπολογίζει και αποφεύγειτον υπολογισμό ήδη αποθηκευμένων τιμών.
Συνθετικός δυναμικός προγραμματισμός (bottom-up dynamic programming)Υπολογίζει και αποθηκεύει όλες τις τιμές της συνάρτησης με τη σειρά ξεκινώντας τον υπολογισμό από τη μικρότερη τιμή του ορίσματος.
Γενικά ο αναλυτικός δυναμικός προγραμματισμός είναι προτιμητέος επειδή:
• Παρέχει μηχανικό τρόπο μετασχηματισμού της λύση ενός προβλήματος• Ρυθμίζει αυτόματα τη σειρά υπολογισμού των υποπροβλημάτων• Αποφεύγει την επίλυση υποπροβλημάτων που δε χρειάζονται
![Page 14: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/14.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
![Page 15: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/15.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
1
2size = 20value = 34
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 16: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/16.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
1
size = 18value = 31
3
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 17: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/17.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
size = 16value = 28
2
2
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 18: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/18.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
size = 20value = 36
2
3
3
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 19: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/19.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
size = 18value = 333
3
3
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 20: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/20.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
1 2 3
Μ=20
size(1) = 12value(1)= 20
size(2) = 8value(2)= 14
size(3) = 6value(3)= 11
size = 20value = 36
2
3
3βέλτιστη
λύση
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 21: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/21.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
static class Item { int size; int val; }Item item[N];
...
int knap(int M) {
int i, space, t, max = 0;for (i = 0; i < N; i++)
if ( (space = M – items[i].size) >= 0 )if ( (t = knap(space) + items[i].val > max )
max = t;return max;
}
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 22: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/22.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
static class Item { int size; int val; }Item item[N];
...
int knap(int M) {
int i, space, t, max = 0;for (i = 0; i < N; i++)
if ( (space = M – items[i].size) >= 0 )if ( (t = knap(space) + items[i].val > max )
max = t;return max;
}
δοκιμάζει όλους τους εφικτούς συνδυασμούς
εκθετικός χρόνος εκτέλεσης!
![Page 23: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/23.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
int knap(int M) {
int i, space, t, maxi, max = 0;if ( maxKnown[M] != unknown ) return maxKnown[M];for (i = 0; i < N; i++)
if ( (space = M – items[i].size) >= 0 )if ( (t = knap(space) + items[i].val > max ){ max = t; maxi = i; }
maxKnown[M] = max; itemKnown[M] = items[maxi];return max;
}
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.
![Page 24: Δυναμικός Προγραμματισμός](https://reader035.fdocument.org/reader035/viewer/2022062501/568165a1550346895dd87f4f/html5/thumbnails/24.jpg)
Δυναμικός Προγραμματισμός
Το πρόβλημα του σακιδίου (knapsack problem)
int knap(int M) {
int i, space, t, maxi, max = 0;if ( maxKnown[M] != unknown ) return maxKnown[M];for (i = 0; i < N; i++)
if ( (space = M – items[i].size) >= 0 )if ( (t = knap(space) + items[i].val > max ){ max = t; maxi = i; }
maxKnown[M] = max; itemKnown[M] = items[maxi];return max;
}
Χρόνος εκτέλεσης :
Εφαρμόσαμε αναλυτικό δυναμικό προγραμματισμό!
Έχουμε Ν τύπους αντικειμένων {1,2,…,Ν}. Το αντικείμενο k έχει μέγεθος size(k) και αξία value(k).
Ο σκοπός μας είναι να γεμίσουμε με τα αντικείμενα αυτά ένα σακίδιο μεγέθους Mέτσι ώστε η συνολική αξία των αντικειμένων να είναι η μέγιστη δυνατή.