Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Algorytmy i struktury danych dziel i zwyciężaj programowanie dynamiczne algorytmy zachłanne.

Podobne prezentacje


Prezentacja na temat: "Algorytmy i struktury danych dziel i zwyciężaj programowanie dynamiczne algorytmy zachłanne."— Zapis prezentacji:

1 Algorytmy i struktury danych dziel i zwyciężaj programowanie dynamiczne algorytmy zachłanne

2 Dziel i zwyciężąj Dzielimy problem na podproblemy (najlepiej o zbliżonych rozmiarach); Znajdujemy rozwiązania podproblemów (powtarzając cały algorytm aż do uzyskania jednostkowych problemów); uzyskane wyniki częściowe scalamy. Przykłady – duża liczba alg. rekurencyjnych m.in. sortowanie szybkie; slinia (rekurencja); obliczanie wyrazów ciągu fibonacciego (rekurencja) * * Mniej efektywne niż inne podejścia.

3 Dziel i zwyciężąj Problemy: Duży koszt scalania rozwiązań podproblemów; Duża ilość jednakowych podproblemów. Fib(n) = Fib(n-1) + Fib(n-2) = Fib(n-2) + Fib(n-3) + Fib(n-3) + Fib(n-4) = Fib(n-3) + Fib(n-4) + Fib(n-3) + Fib(n-3) + Fib(n-4) ….

4 Programowanie dynamiczne Problemy: Rekurencyjna definicja rozwiązania; Konstrukcja optymalnego rozwiązania metodą począwszy od wyników cząstkowych

5 Problem plecakowy - dyskretny Sformułowanie: Dla danego zbioru przedmiotów (opisanych przez wagę i cenę) i plecaka o rozmiarze K znaleźć upakowanie plecaka o największej wartości. Dysponujemy dowolną (lub ograniczoną) ilością przedmiotów każdego rodzaju. Przedmiotów nie wolno dzielić. Tj. dla Z = {(c 1,w 1, m 1 ), (c 2,w 2,m 2 ), (c 3,w 3,m 3 ), …, (c n,w n,m n )} znaleźć podzbiór L = (l 1, l 2, …, l n ), taki że l i *w i K, l i C +, l i m i i l i *c i = max

6 Problem plecakowy - dyskretny Przykład (bez limitów): Przedmioty (waga, cena): Z = { (1, 1), (2, 1), (3, 11), (4, 16), (5, 24) } Plecak: K = 7 Optymalne upakowanie: KN(K,Z) = 27 Liczby przedmiotów: L = (0, 0, 1, 1, 0)

7 Problem plecakowy - dyskretny Rozwiązanie: Podproblem – jeżeli podzielimy plecak na dwa mniejsze, to każdy z nich musi być optymalnie upakowany. Wypełnij tablicę KN pomocniczą od 1 do K, wpisując do k-tej komórki KN(k) = max { c i + KN(k-w i ); 1 i < n }. gdzie K – rozmiar plecaka, n - liczba przedmiotów Oprócz wartości należy (np. w odrębnej tablicy) zapamiętywać jakie elementy zostały zapakowane.

8 Problem plecakowy - dyskretny KWynikPrzedmioty 111,0,0,0,0 222,0,0,0,0 3110,0,1,0,0 4160,0,0,1,0 5240,0,0,0,1 6251,0,0,0,1 7270,0,1,1,0 8350,0,1,0,1 Nielimitowane przedmioty (1, 1) (2, 1) (3, 11) (4, 16) (5, 24)

9 Alg. Problem plecakowy class GOOD: weight=0 price=0 def Knapsack (goods,KSize) : KTmp = Array(KSize+1,0) for i in range(1,KSize): KTmp[i] = KTmp[i-1] for j in range(1, n+1): if Z[j].weight >= i and\ Z[j].price + KTmp[i-Z[j].weight] > KTmp[i]: KTmp[i] = Z[j].weight + KTmp[i-Z[j].weight] return KTmp[k]

10 Mnożenie ciągu macierzy Sformułowanie: Dla danego ciągu macierzy tak dobrać tak kolejność operacji, aby zminimalizować ilość mnożeń. Reprezentacja danych: m[1, n] = minimalna liczba mnożeń potrzebnych do obliczenia A 1* … * A n

11 Prosta implementacja mnożenia dwóch macierzy def MulMatrix(A, B): if Columns(A)!=Rows(B): ERROR else: for i in range(0, Rows(A)): for j in range(0, Columns(A)): C[i][j] = 0; for k in range(0, Columns(B)): C[i][j] += C[i][j]+ A[i][k]*B[k][j] return C

12 Mnożenie ciągu macierzy Przykład: Dla danego ciągu macierzy tak dobrać kolejność operacji, aby zminimalizować ilość mnożeń. [p, q] [q, r] = [p, r] O([p, q] [q, r]) = p*q*r A 1 = [10, 100] A 2 = [100, 3] A 3 = [3, 50] O((A1 A2) A3) = 10*100*3 + 10*3*50 = 4500 O(A1 (A2 A3)) = 100*3* *100*50 = 65000

13 Mnożenie ciągu macierzy Rozwiązanie: Podproblem – jeżeli podzielimy wyrażenie na dwa mniejszew miejscu podziłau "najwyższego" pozomu – nawiasowania w obu podwyrażeniach muszą być optymalne. m[i, j] = { min (m[i, k]+m[k+1, j]+p i-1 p k p j ; i<=k

14 Nieoptymalne rozwiązanie def RecursiveMatrixChain(p, i, j): if i == j: return 0 w = -1 for k in (i,j+1): q = p[i-1]*p[k]*p[j]+RecursiveMatrixChain(p,i,k)+\ RecursiveMatrixChain(p[], k+1, j) if q

15 Mnożenie ciągu macierzy Rozwiązanie: A 1 = [30, 35] A 2 = [35, 15] A 3 = [15, 5] A 4 = [5, 10] A 5 = [10, 20] A 6 = [20, 25] m j i optdiv i j

16 Implementacja wyznaczania optymalnego nawiasowania def MatrixChain(p, len): for i in range(1,len): m[i][j] = 0 for h in range(2,len): for i in range(1,len-h-1): j = i+h-1 m[i][j] = -1 for k in range (i,j+1): tmp = m[i][k]+m[k+1][j] + p[i-1]*p[k]*p[j] if m[i][j] < 0 or tmp < m[i][j]: m[i][j] = tmp optdiv[i][j] = k

17 Rekur. implementacja wyznaczania optymalnego nawiasowania def RecursiveMatrixChain(p, i, j): if (i == j) return 0 m[i][j] = -1; for k in range(i,j) q = RecursiveMatrixChain(p,i,k)+\ RecursiveMatrixChain(p,k+1,j) + p[i-1]*p[k]*p[j] if m[i][j]<0 or q <= m[i][j]: m[i][j] = q return m[i][j] RecursiveMatrixChain(p[], 1, len-1);

18 Spamiętywanie Odmiana programowania dynamicznego; Rekurencyjne podejście -> dziel i zwyciężaj; Szybka pamięć dla rozwiązań chwilowych;

19 def MemorizedMatrixChain(p, len): for i in range(1,len): for j in range(1,len): m[i,j] = -1 return LookupMatrixChain(p,1,len-1) Impl. mnożenia ciągu macierzy przy wykorzyst. spamiętywania

20 def LookupMatrixChain(p, i, j): if m[i][j] >= 0: return m[i][j] if i == j: m[i][j] = 0 else: for k in range(i,j) q = LookupMatrixChain(p,i,k) +\ LookupMatrixChain(p,k+1,j) + p[i-1]*p[k]*p[j] if (q <= m[i][j]): m[i][j] = q return m[i][j] Implementacja LookupMatrixChain

21 Inne klasyczne zastosowania programowania dynamicznego Najdłuższy wspólny podciąg; Triangulacja wielokąta z minimalną długością boków.

22 Algorytmy zachłanne Algorytm jest rozumiany jako ciąg decyzji optymalizacyjnych; W kolejnym kroku wybierane jest najlepsze dostępne lokalnie rozwiązanie; Niestety nie zawsze ta strategia prowadzi do optymalnych rozwiązań całościowych.

23 Problem plecakowy - ciągły Sformułowanie: Dla danego zbioru przedmiotów (opisanych przez wagę i cenę) i plecaka o rozmiarze K znaleźć upakowanie plecaka o największej wartości. Dysponujemy ograniczoną ilością przedmiotów każdego rodzaju. Przedmioty MOŻNA dzielić. Tj. dla Z = { (c 1,w 1,m 1 ), (c 2,w 2,m 2 ), (c 3,w 3,m 3 ) … (c n,w n,m n ) } znaleźć podzbiór L = (l 1, l 2,..., l n ), taki że l i *w i K, l i R +, l i m i i l i *c i = max

24 Problem plecakowy - ciągły Przykład (bez limitów): Przedmioty: Z = { (3, 1), (60, 10), (80, 15), (210, 30), (270, 45) } Plecak: K = 45 Optymalne upakowanie: KN(K, Z) = 315 Liczby przedmiotów: L = (0, 0, 0, 1.5, 0)

25 Problem plecakowy - ciągły Przykład (z limitami): Przedmioty: Z = { (3, 1), (60, 10), (80, 15), (210, 30), (270, 45) } Plecak: K = 45 Optymalne upakowanie: KN(K, Z) = 300 Liczby przedmiotów: L = (0, 0, 0, 1, 1/3) lub (0, 1, 0, 1, 1/9)

26 Ciągły problem plecakowy – algorytm // nielimitowana ilość przedmiotów deef Knapsack (goods, KSize): # przedmiot o najlepszym stosunku ceny do wagi i = GetMaxPrizeToValue(goods, n) KValue = KSize / goods[i].weight * goods[i].price return KValue

27 Ciągły problem plecakowy – algorytm Knapsack (goods, KSize) KValue = 0 cnt=0 while K >= 0 : # najlepszy stosunek ceny do wagi i max > 0 i = GetMaxPrizeToValue(goods, n) if KSize< goods[i].weight * goods[i].max: cnt = KSize / goods[i].weight else: Z[i].max KSize = KSize - cnt KValue += KValue + cnt* goods[i].price goods[i].max = 0 return KValue

28 Inne klasyczne zastosowania algorytmów zachłannych Przydział jak największej ilości zajęć do zasobu (przy założeniu wzajemnego wykluczania); Drzewo spinające w grafie. Własność zachłannego wyboru; Matroidy.

29 Kodowanie Huffmana Kodowanie o stałej długości – kody wszystkich znaków są jednakowe, np.: A = , B = , C = , … Kodowanie o zmiennej długości – kody znaków mają różne długości (im rzadszy znak, tym większa długość kodu) Kod prefixowy (kod dowolnego znaku nie jest prefixem innego)

30 Kodowanie Huffmana (1952) NIE PIEPRZ PIETRZE WIEPRZA PIEPRZEM T W A M N N: 1 T: 1 W: 1 A: 1 M: 1 R: 4 Z: 4 : 4 I : 6 P : 6 E : 7 I II T N III W A Częstotliwości: W kolejnym kroku scalane są dwa drzewa o najmniejszej wadze.

31 Kodowanie Huffmana (1952) NIE PIEPRZ PIETRZE WIEPRZA PIEPRZEM T drzewo E RZIP WAM N 0 1 N: T: W: A: M: R: 010 Z: 011 : 100 I : 110 P : 111 E : 00 normalnie: 35 x 8 = 280 b po kompresji: 110 bitów średnio: 3, 14 bity na znak


Pobierz ppt "Algorytmy i struktury danych dziel i zwyciężaj programowanie dynamiczne algorytmy zachłanne."

Podobne prezentacje


Reklamy Google