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