WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska.

Slides:



Advertisements
Podobne prezentacje
ALGORYTMY I STRUKTURY DANYCH
Advertisements

Tablice 1. Deklaracja tablicy
Sortowanie przez scalanie
Instrukcje - wprowadzenie
Egzamin.
Macierze, wyznaczniki, odwracanie macierzy i wzory Cramera
Grażyna Mirkowska PJWSTK, 10 stycznia 2001
METODY ANALIZY PROGRAMÓW
Grażyna Mirkowska PJWSTK 15 listopad 2000
Wykład 10 Metody Analizy Programów Specyfikacja Struktur Danych
Wykład 06 Metody Analizy Programów System Hoare
Materiały pochodzą z Platformy Edukacyjnej Portalu
Wzory Cramera a Macierze
Techniki konstrukcji algorytmów
Badania operacyjne. Wykład 2
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Współprogramy III Ten wykład ma na celu pokazanie kolejnej ciekawej możliwości, którą oferują współprogramy. Wspólprogramy reprezentujące wyrażenia regularne.
ZŁOŻONOŚĆ OBLICZENIOWA
ALGORYTMY GEOMETRYCZNE.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Macierze Maria Guzik.
ALGORYTMY I STRUKTURY DANYCH
Model danych oparty na listach
Materiały pomocnicze do wykładu
Zapis informacji Dr Anna Kwiatkowska.
Podprogramy.
Metody numeryczne Wykład no 2.
Schemat Hornera Mgr inż. Michał Szucki.
Matematyka.
„Są plusy dodatnie i plusy ujemne.”
Algorytm Naiwny Ciąg znaków: A B D C E Wzorzec: A B.
Przegląd podstawowych algorytmów
TABLICE C++.
Algorytmy i struktury danych
A. Sumionka. Starodawna gra marynarska; Gra dwu i wieloosobowa; Gracze wykonują ruchy naprzemian; Złożona ze stosów, w których znajduje się pewna ilość
Zadanie programowania liniowego PL dla ograniczeń mniejszościowych
Projekt AS KOMPETENCJI jest współfinansowany przez Unię Europejską w ramach środków Europejskiego Funduszu Społecznego Program Operacyjny Kapitał Ludzki.
Łódź, 3 października 2013 r. Katedra Analizy Nieliniowej, WMiI UŁ Podstawy Programowania Programy różne w C++
II. Matematyczne podstawy MK
Liczby całkowite dodatnie BCN
ALGORYTMY I STRUKTURY DANYCH
Matematyka i system dwójkowy
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 03 cd. Wyszukiwanie Grażyna Mirkowska PJWSTK, 2003/2004.
Laboratorium nr.3 Algorytm przyrównania globalnego
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 04 k-ty co do wielkości. Stosy Grażyna Mirkowska PJWSTK, ITN semestr letni 2002.
Zagadnienie i algorytm transportowy
Tablice Zajęcia 8. Definicja Tablica (z ang. array) jest zmienną złożoną, która składa się z ciągu elementów tego samego typu. W pamięci komputera tablica.
Matematyka Ekonomia, sem I i II.
Metody rozwiązywania układów równań liniowych
METODY REPREZENTOWANIA IFORMACJI
SciLab.
Wstęp do programowania wykład 3 Typy wyliczeniowe, tablice.
„Między duchem a materią pośredniczy matematyka. ”
ALGORYTMY I STRUKTURY DANYCH
Treść dzisiejszego wykładu l Metoda kar. l Podsumowanie przekształcania zadań programowania liniowego do postaci tabelarycznej. l Specjalne przypadki –sprzeczność,
 Formuła to wyrażenie algebraiczne (wzór) określające jakie operacje ma wykonać program na danych. Może ona zawierać liczby, łańcuchy znaków, funkcje,
Liczby 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, …(i tak dalej) nazywamy liczbami naturalnymi. Tak jak z liter tworzy się słowa, tak z cyfr tworzymy liczby. Dowolną.
Liczbami naturalnymi nazywamy liczby 0,1,2,3,..., 127,... Liczby naturalne poznaliśmy już wcześniej; służą one do liczenia przedmiotów. Zbiór liczb.
Rozpatrzmy następujące zadanie programowania liniowego:
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Algorytmy i struktury danych
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Zapis prezentacji:

WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska

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

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

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

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..

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

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) B D C A B A A B C B D A B

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) = mnożeń skalarnych Koszt lewej strony = (10 *100*5 ) + (10*5*50)= 7500 mnożeń skalarnych

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!

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.

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]!

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

Przykład (n=6)‏ A 1 A 2 A 3 A 4 A 5 A 6 Tablica m Tablica s 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)‏

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 )‏

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

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

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.

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 B D C A B A 1 A B C Koszt 0 11

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

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) B D C A B A A B C B D A B

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.

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

Przykład AAAAAAAAAAAAAAA ABBABBABBABBABB ABBACBACCACCACC ABBACDACCACCDCC 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