Wykład 6

Transkrypt

Wykład 6
Rekurencja, programowanie dynamiczne, algorytmy
zachªanne
Andrzej Jastrz¦bski
Akademia ETI
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Ci¡g Fibonacciego
an =
1
gdy n < 2
an−1 + an−2 gdy n ≥ 2
mo»na rozwi¡za¢ przy pomocy rekurencji:
int fibon(int n) {
if(n<2) return 1;
return fibon(n-1)+fibon(n-2);
}
ale w takim wypadku wi¦kszo±¢ warto±ci jest wyliczana
wielokrotnie. Wywoªanie fibon(7) spowoduje wywoªanie
1 raz fibon(6) 2 razy fibon(5)
3 razy fibon(4) 5 razy fibon(3)
8 razy fibon(2) 13 razy fibon(1)
8 razy fibon(0)
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Wida¢, »e wi¦kszo±¢ funkcji jest wyliczanych nadmiarowo. Mo»na
zapami¦ta¢ ostatnie dwa elementy, przez co ka»dy wcze±niejszy
element b¦dzie obliczany raz.
int fibon(int n) {
if(n<2) return 1;
int x1=1, x2=1;
for(int i=1; i<n; i++) {
int tmp = x1+x2;
x1=x2;
x2=tmp;
}
return x2;
}
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Programowanie dynamiczne
Programowania dynamicznego u»ywa si¦, gdy problem mo»na
opisa¢ równaniami rekurencyjnymi. Rozwi¡zanie problemu polega
na zapami¦taniu rozwi¡za« po±rednich, a nast¦pnie wyszukaniu
rozwi¡za« kolejnych.
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Problem plecakowy
W problemie plecakowym chcemy wybra¢ przedmioty tak, aby
zmie±ciªy si¦ w plecaku, a ich koszt byª maksymalny. W problemie
tym podany jest rozmiar plecaka (jego no±no±¢) oraz koszt i waga
przedmiotów.
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Problem plecakowy - równanie rekurencyjne
Mo»na stworzy¢ równanie rekurencyjne zale»ne od wielko±ci plecaka
oraz od liczby elementów.
A(0, j) = 0
A(i, 0) = 0
A(i, j) = A(i − 1, j) je±li wi > j
A(i, j) = max(A(i − 1, j), ci + A(i − 1, j − wi )) je±li wi ≤ j
Chc¡c zawrze¢ wszystkie liczby A(·,·) potrzemujemy n ∗ w pami¦ci.
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Problem plecakowy - równanie rekurencyjne
Mo»na stworzy¢ równanie rekurencyjne zale»ne od wielko±ci plecaka
oraz od liczby elementów.
A(0, j) = 0
A(i, 0) = 0
A(i, j) = A(i − 1, j) je±li wi > j
A(i, j) = max(A(i − 1, j), ci + A(i − 1, j − wi )) je±li wi ≤ j
Chc¡c zawrze¢ wszystkie liczby A(·,·) potrzemujemy n ∗ w pami¦ci.
Mo»na zredukowa¢ potrzebn¡ pami¦¢ do w , poniewa» A(i, j) jest
zale»na jednynie od A(i − 1, k) dla k < j .
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
int plecak(vector<Przedmiot> predm, int waga) {
vector<int> tabWaga;
tabWaga.resize(waga+1, 0);
for(int i=0; i<przedm.size(); i++) {
for(int j=waga; j>=przedm[i].w; j) {
if(tabWaga[j]<tabWaga[j-przedm[i].w]
+przedm[i].c)
tabWaga[j] = tabWaga[j-przedm[i].w]
+przedm[i].c;
}
}
return tabWaga[waga];
}
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Algorytmy zachªanne
Klasa algorytmów, które podejmuj¡ lokalnie optymaln¡ decyzj¦.
Podj¦cie lokalnie optymalnej decyzji nie zawsze gwarantuje
otrzymania globalnie optymalnego rozwi¡zania.
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Optymalne algorytmy zachªanne
algorytm Kruskala
algorytm Prima
algorytm Humana (kompresja danych)
algorytm Dijkstry
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Nieoptymalne algorytmy zachªanne
Istniej¡ problemy, w których nie istniej¡ optymalne algorytmy
zachªanne. Problemami tymi s¡:
problem plecakowy
kolorowanie grafów
...
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Algorytm zachªanny dla problemu plecakowego
Sortujemy ilorazy ceny i wagi. Do plecaka wstawiamy elementy
najwi¦ksze z posortowanej tablicy.
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne
Algorytm zachªanny dla problemu plecakowego
Sortujemy ilorazy ceny i wagi. Do plecaka wstawiamy elementy
najwi¦ksze z posortowanej tablicy.
Algorytm ten jest 2-przybli»ony co oznacza, »e myli si¦
maksymalnie 2 razy w stosunku do optymalnej warto±ci.
Politechnika Gda«ska
Rekurencja, prog. dynamiczne, alg. zachªanne

Podobne dokumenty