Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska.

Podobne prezentacje


Prezentacja na temat: "WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska."— Zapis prezentacji:

1 WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska

2 Treść  Paradygmat programowania dynamicznego  Przykłady – Odległość edytorska – Mnożenie łańcucha macierzy – Najdłuższy wspólny podciąg – Problem plecakowy

3 Definicja Dane są dwa teksty T i T'. Odległością edytorską(oznaczenie ed(T,T') nazywa się minimalną liczbę zmian, jakie należy wprowadzić by oba teksty stały się identyczne. Dozwolone zmiany to usunięcie jednej linii tekstu lub wstawienie jednej linii tekstu. W tym konkretnym przypadku, teksty potraktujemy jako ciągi znaków, a zmiany będą polegały jedynie na wstawieniu znaku lub usunięciu jednego znaku. Przykłady. Jeżeli T= abba, T'= abxab, to ed(T,T”) = 1. Jeżeli T= abcabba T'=cbabac, to ed(T,T') = 5

4 Rozwiązanie - metoda Zauważ, że jeżeli ostatnie litery tekstów są identyczne, tzn. teksty są postaci Tx oraz T'x, to ostatnia litera nie wpływa na odległość edytorską tych tekstów. Zatem ed(Tx,T'x) = ed(T, T')‏ Jeżeli ostatnie litery tekstów nie są takie same, tzn. teksty są postaci Tx oraz T'x', to albo x albo x' trzeba będzie usunąć albo dopisać w drugim tekscie, więc ed(Tx,T'x') = min (ed(Tx,T'),ed(T, T'x')) +1

5 Struktura danych Odległość edytorska tekstów X i Y Teksty T i T' są umieszczone w i znakowej na pozycjach 1 do n, i od 1 do m, odpowiednio. Będę używała tablicy pomocniczej Tab o wymiarach (n+1)x(m+1) numerowanej od zera. Założenia Wartością pozycji Tab[i,j] będzie odległość edytorska tekstu złożonego z i pierwszych liter tekstu T oraz j pierwszych liter tekstu T'. Wiersz zerowy tablicy Tab odpowiada odległości edytorskiej słowa pustego od słowa złożonego z j pierwszych liter tekstu T'. Analogicznie, kolumna zerowa odpowiada odległości edytorskiej pierwszych i liter słowa T i słowa pustego..

6 Algorytm function ed(T, T'); For j :=1 to m do Tab[0,j]:=j] od; For i :=1 to n do Tab[i,0]:=i] od; For i:=1 to n do for j := 1 to m do if T[j]=T'[i] then Tab[i,j]:= Tab[i-1, j-1] else // wynikiem będzie minimum+1 if Tab[i-1,j]>Tab[i,j-1] then Tab[i,j] := Tab[i,j-1]+1 else Tab[i,j] := Tab[i-1,j]+1 fi fi od } Ostatnie litery rozważanych fragmentów są takie same „ostatnie litery rozważanych fragmentów są różne, trzeba wybrać lepsze rozwiązanie

7 Obliczanie - przykład Zasada : Tablicę wypełniam wierszami. Jesli litery w wierszu i w kolumnie (odpowiadające obliczanej właśnie pozycji)są takie same to wstawiam liczbę po przekątnej. Jeśli nie są takie same to wybieram mniejszą z liczb stojących obok(po lewej i nad rozważana pozycją)i dodaje jedynkę Przykład Tab(i,j) 1 2 3 4 5 6 B D C A B A 0 1 2 3 4 5 6 1 A 1 2 3 4 3 4 5 2 B 2 1 2 3 4 3 4 3 C 3 2 3 3 4 4 5 4 B 4 3 4 4 5 4 5 5 D 5 4 3 4 5 5 6 6 A 6 5 4 5 4 5 5 7 B 7 6 5 6 5 4 5

8 Mnożenie macierzy Dany jest ciąg macierzy A 1, A 2,...,A n. Obliczyć iloczyn A 1  A 2 ...  A n tak by koszt mnożenia był najmniejszy. Uwaga: Możemy pomnożyć macierz A przez B wttw, gdy A ma tyle kolumn ile B wierszy. Koszt(A  B) = A.w *A.k* B.w Przykład Obliczyć A  B  C. A(10  100) B(100  5) C(5  50)‏ (A  B)  C = A  ( B  C)‏ Koszt prawej strony = (100 *5*50) + (10*100*50) = 75000 mnożeń skalarnych Koszt lewej strony = (10 *100*5 ) + (10*5*50)= 7500 mnożeń skalarnych

9 Prosty Algorytm? Rozważyć wszystkie możliwe ustawienia nawiasów w ciągu, a potem wykonać mnożenia zgodnie z ustawieniem nawiasów. Za każdym razem wyliczyć koszt mnożenia przy danym ustawieniu nawiasów i wybrać to ustawienie, które ma koszt najmniejszy. A ile jest możliwych ustawień nawiasów? Niech P(n) będzie liczbą ustawień nawiasów w ciągu n elementowym. (A 1,..., A k ) ( A k+1,...,A n )‏ n-1  sza liczba Catalana  (4 n /n 3/2 )‏ Za duży koszt!

10 Paradygmat programowania dynamicznego 1. Scharakteryzować strukturę rozwiązania optymalnego. Rozwiązanie optymalne zawiera w sobie optymalne rozwiązania dla podproblemów. 2. Zdefiniować rekurencyjnie wartość rozwiązania optymalnego, jako funkcję rozwiązań optymalnych dla podproblemów. W naszym przykładzie: dla pewnego k, policzymy najpierw optymalne ustawienie nawiasów dla iloczynu (A 1,..., A k ) potem optymalne ustawienie nawiasów dla iloczynu (A k+1..,A n ), a potem dodamy do tego koszt mnożenia 2 macierzy. 3. Skonstruować rozwiązanie problemu na bazie wyliczonych wielkości.

11 Liczymy minimalne koszty Niech m[i,j] będzie minimalną liczbą mnożeń skalarnych potrzebnych do policzenia iloczynu ( A i..,A j ), oraz macierz A i ma wymiar (p i-1  p i ). Niech s[i,j] = k, gdzie k realizuje minimum dla m[i,j]. nie jest możliwy do zastosowania, Rekurencyjny algorytm obliczania m[i,j] nie jest możliwy do zastosowania, bo jego koszt jest wykładniczy, ale... Przecież można zapamiętywać policzone wcześniej wartości m[i,j]!

12 Algorytm MCM for i :=1 to n do m[i,i] :=0; od; for x := 2 to n do for i := 1 to n-x+1 do j := i+x-1 m[i,j] := +  ; for k := i to j-1do q := m[i,k]+m[k+1,j] + p i-1 *p k *p j ; if q < m[i,j] then m[i,j] := q; s[i,j] :=k fi od od od return m,s; Koszt O(n 3 )‏ Ustawienie początkowej wartości elementów tablicy m. Dwie pętle odpowiedzialne za wypełnienie wszystkich elementów m[i,j]. Wyszukiwanie minimum

13 Przykład (n=6)‏ 15125 10500 5375 3500 5000 0 11875 7125 2500 1000 0 9375 4375 750 0 7875 2625 0 15750 00 1 2 3 4 5 61 2 3 4 5 6 A 1 A 2 A 3 A 4 A 5 A 6 Tablica m Tablica s 3 3 3 5 5 3 3 3 4 3 3 3 1 2 1 1 2 3 4 5 6 2 3 4 5 6 m[2,5]= min { m[2,2] + m[3,5] + p 1 *p 2 *p 5, m[2,3] + m[4,5] + p 1 *p 3 *p 5, m[2,4] + m[5,5] + p 1 *p 4 *p 5 } A 1 (30  35) A 2 (35  15) A 3 (15  5) A 4 (5  10) A 5 (10  20) A 6 (20  25)‏

14 W jakiej kolejności mnożyć? Zasada 3 paradygmatu programowania dynamicznego: Skonstruować rozwiązanie problemu na bazie wyliczonych wielkości. mnóż(A,s,i,j) { If j>i then X := mnóż(A,s,i,s[i,j]); Y:= mnóż(A,s,s[i,j]+1, j); return wynik mnożenia macierzy (X  Y) else return A i } W naszym przykładzie : Mnóż (A,s,1,6) daje : (A 1 (A 2 A 3 ))((A 4 A 5 ) A 6 )‏ (A 1 (A 2 A 3 ))((A 4 A 5 ) A 6 )‏

15 Najdłuższy wspólny podciąg Dane są dwa ciągi znaków X i Y X = (x 1,…x m ) Y = (y 1,…,y n )‏ Znaleźć taki ciąg Z=(z 1,…z k ), że Z jest najdłuższym podciągiem zarówno ciągu X jak i Y, ozn. Z = nwp(X,Y)‏ X = aawbbsccpddólnvby Y = xxwsyyypózzlinsy nwp(X,Y) = wspólny Przykład Wygenerować wszystkie podciągi ciągu X. Dla każdego z tych ciągów sprawdzić czy występuje w Y, zapamiętując jednocześnie najdłuższy z takich ciągów. Ale to zbyt dużo kosztuje O(2 m )‏ Algorytm naiwny

16 Analiza zadania Niech X= (x 1,…x m ) Y= (y 1,…,y n ) oraz nwp(X,Y) = Z, gdzie Z= (z 1,…z k ). Jeżeli x m = y n, wtedy z k =x m =y n oraz Z k-1 = nwp(X m-1, Y n-1 ). Jeżeli x m  y n, wtedy Z = nwp(X m-1,Y) i z k  x m lub Z = nwp(X,Y n-1 ) i z k  y n. Oznaczenie: X i = (x 1,…x i ) Abrakadabra barakuda Abrakadabr barakud Abrakad barakud ad Abraka baraku itd k

17 Algorytm2 string nwp(X,Y :string) : string; begin string Z; if x(m) = y(n) then Z := nwp(X m-1, Y n-1 )  x(m) else Z1 := nwp(X m-1, Y); Z2 := nwp(X, Y n-1 ); Z := dłuższy z ciągów Z1 i Z2; fi ; return Z; end; konkatenacja Koszt tego algorytmu będzie w najgorszym razie wykładniczy.

18 Jak wyliczyć długość nwp(X,Y)? długość najdłuższego wspólnego podciągu ciągów X,Y. d(X,Y) = d( X m-1,Y n-1 ) +1, gdy x m =y n d(X,Y) = max (d(X m-1,Y),d(X,Y n-1 ), gdy x m  y n Koszt obliczenia d(X,Y) wynosi card(X) * card(Y) porównań. Przykład 1 2 3 4 5 6 B D C A B A 1 A 0 0 0 1 1 2 2 B 1 1 1 1 2 2 3 C 1 1 2 2 2 2 Koszt 0 11

19 Algorytm { for i :=1 to m do d(i,0):=0 od; for j :=0 to n do d(0,j) := 0 od; for i :=1 to m do for j :=1 to n do if x(i)=y(j) then d(i,j) := d(i-1,j-1) +1; b(i,j) := „\” else if d(i-1,j)  d(i,j-1) then d(i,j) := d(i-1,j); b(i,j) := „  ” else d(i,j) := d(i,j-1); b(i,j) := „  ” fi fi od od} Po przekątnej zadanie, które trzeba rozwiązać, żeby otrzymać optymalny wynik. „w górę” zadanie, które trzeba rozwiązać, żeby otrzymać optymalny wynik „w lewo” zadanie, które trzeba rozwiązać, żeby otrzymać optymalny wynik

20 Wypisanie nwp Procedure Drukuj(b,i,j); begin if i=0 or j=0 then return fi; if b(i,j) = „\” then call drukuj(b,i-1,j-1); write(x(i)) else if b(i,j) = „  ” then call drukuj(b,i-1,j) else call drukuj (b,i,j-1) fi fi end Przykład b(i,j) 1 2 3 4 5 6 B D C A B A 0 0 0 0 0 0 1 A 0 0 0 0 1 1 2 2 B 0 1 1 1 1 2 2 3 C 0 1 1 2 2 2 2 4 B 0 1 1 2 2 3 3 5 D 0 1 2 2 2 3 3 6 A 0 2 2 3 3 4 4 7 B 0 1 2 2 3 4 4 4 4 3 3 22 11 0

21 Problem plecakowy Dane jest n obiektów oraz liczba całkowita M (pojemność plecaka). Niech s(i) oznacza rozmiar obiektu itego, a w(i) wartość tego obiektu. Zarówno M jak rozmiary i wartości są liczbami naturalnymi. Znaleźć takie liczby naturalne x 1, x 2,...x n, by  x i s(i)  M, a suma  x i w(i) miała największą wartość. Powiedzmy, że w banku są obiekty A,B,C,D,E, których rozmiary i wartości są jak na rysunku. A,3,4B,4,5C,7,10D,8,11E,9,13 17 Złodziej może zabrać 5 obiektów A o wartości 20 lub 4 obiekty B o wartości 16 lub 2C i 1A o wartości 24.

22 Algorytm for j := 1 to n do for i := 1 to M do if i – s[j]  0 then if koszt[i]< (koszt[i-s[j]] + w[j])then koszt [i] := koszt[i-s[j]] + w[j]; b[i] :=j fi fi od od koszt[i] = największa wartość jaka może być osiągnięta jeśli pojemność plecaka wynosi i b[i] ostatni element, który został dodany do plecaka by osiągnąć wartość maksymalną. Rozwiązanie polega na wyliczeniu najlepszych kombinacji elementów dla wszystkich pojemności plecaka od 1 do M. Koszt: n* M operacji Niezmiennik: dla x <i, koszt[x] = maksymalna wartość plecaka o pojemności x, jeśli mamy do dyspozycji tylko obiekty o numerach <j

23 Przykład 23456789110111213141516170444888120 16 20 AAAAAAAAAAAAAAA 045589101201314161718202122 ABBABBABBABBABB 0455810 1201415161820 2224 ABBACBACCACCACC 0455810111201415161820212224 ABBACDACCACCDCC 0455810111301415171820212324 ABBACDECCECCDEC Największa wartość = 24 Zawartość plecaka: b[17]= C, b[17-7]= C, b[10-7]=A tablica kosztów tablica b-ostatni element


Pobierz ppt "WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska."

Podobne prezentacje


Reklamy Google