Natura Fibonacciego
Transkrypt
Natura Fibonacciego
Temat: Programowanie dynamiczne. Przykłady zastosowania. 1. Programowanie dynamiczne U ycie strategii programowania dynamicznego polega na zapami taniu w odpowiedniej strukturze (najcz ciej tablicy) wyników rozwi zania podproblemów, na które został podzielony problem zasadniczy, unikaj c w ten sposób wielokrotnych oblicze dla tego samego podproblemu. Programowanie dynamiczne prowadzi do całkowitej b d cz ciowej eliminacji rekurencji. Problem mo e by rozwi zany technik programowania dynamicznego gdy ma własno optymalnej podstruktury czyli jego optymalne rozwi zanie jest funkcj optymalnych rozwi za podproblemów. Innymi słowy problem ma własno optymalnej podstruktury gdy ma natur rekurencyjn . Jednak rozwi zanie problemu nie powinno by zapisywane w postaci kodu rekurencyjnego, ale poprzez spami tywanie wyników lokalnych. 2. Przykłady zastosowania a) Ci g Fibonacciego Funkcja obliczaj ca warto ci elementów ci gu Fibonacciego Ci g Fibbonaciego: F(0)=0 F(1)=1 F(n)=F(n-1)+F(n-2) dla n>2 Algorytm I (rozwi zanie rekurencyjne) F(n) { if (n==0) return 0; else if (n==1) return 1; else return F(n-1)+F(n-2); } Koszt czasowy: O(2n) Koszt pami ciowy: O(n) 1 Algorytm II (programowanie dynamiczne) F(n) { if (n==1) return 0; else if (n==2) return 1; for (i=2; i<=n; i++) { c = a+b; a = b; b = c; } return c; } Koszt czasowy: O(n) Zło ono pami ciowa: O(1) b) Problem optymalnego mno enia macierzy WP : Ci g rozmiarów macierzy: M 1 , M 2 ,..., M n , gdzie M i jest macierz o ri −1 wierszach i ri kolumnach; wektor rozmiarów R : [r0, r1, …, rn] WK: Takie rozstawienie nawiasów w iloczynie macierzowym: M 1 M 2 ... M n , aby liczba wykonanych operacji mno enia wykonanych przy obliczaniu iloczynu macierzy była minimalna. Przykład 1 M 1 = [5 × 10], M 2 = [10 × 20], M 3 = [20 × 1], M 4 = [1× 10] R = [5 10 20 1 10], Je eli mno ymy dwie macierze: A = [ p × q ], B = [q × r ] , to wykonywanych jest pqr mno e . 2 I kolejno : ((M 1 M 2 ) (M 3 M 4 )) = M 12 M 34 = M 1234 Liczba mno e : 5 ⋅10 ⋅ 20 + koszt mno enia macierzy M1 M 2 II kolejno : (M 1 Liczba mno e : 20 ⋅1⋅10 koszt mno enia macierzy M 3 M 4 (M 2 (M 3 M 4 ))) = M 1 + 10 ⋅ 20 ⋅10 20 ⋅1⋅10 + koszt mno enia macierzy M 3 M 4 5 ⋅ 20 ⋅10 = 2200 koszt mno enia macierzy M12 M 34 (M 2 M 34 ) = M 1 M 234 = M 1234 + koszt mno enia macierzy M 2 M 34 5 ⋅10 ⋅10 = 2700 koszt mno enia macierzy M1 M 234 Algorytm naiwny Rozwa y wszystkie mo liwe ustawienia nawiasów, obliczaj c dla ka dej mo liwo ci liczb wykonanych operacji mno enia. Liczba mo liwych ustawie nawiasów X(n) w iloczynie M 1 M 2 ... M n wyra a si nast puj c zale no ci rekurencyjn : (*) X (n ) = n −1 i =1 1 dla n = 1 X (i ) ⋅ X (n − i − 1) dla n > 1 Mo na pokaza , e posta jawna równania (*) jest nast puj ca: X (n ) = 1 2n − 1 1 n ⋅ ... ⋅ ( 2n − 1) (n + 1) ⋅ ... ⋅ (2n − 1) = ⋅ = n n −1 n (n − 1)! (n − 1)! Mo na udowodni , e: (n + 1) ⋅ (n + 3) ⋅ ... ⋅ (2n − 1) ≥ 2 n−3 (n − 1)! 3 Algorytm oparty na programowaniu dynamicznym Oznaczenie: mij - minimalny koszt obliczenia fragmentu iloczynu macierzy od macierzy i do macierzy j M i M i +1 ... M j dla 1 ≤ i ≤ j ≤ n 0 dla i = j mij = min (m + m ik k +1 j + ri −1 rk r j ) dla i < j i≤k < j mik − minimalny koszt mno enia macierzy M i M i +1 ... M k o rozmiarze ri −1 × rk mk +1 j − minimalny koszt mno enia macierzy M k +1 M k +2 ... M j o rozmiarze rk × r j ri −1 ⋅ rk ⋅ r j − koszt mno enia macierzy M ik M k +1 j o rozmiarze ri −1 × r j Algorytm polega na wyznaczeniu warto ci funkcji mij, które zapami tuje w tablicy dwuwymiarowej. Własno optymalnej podstruktury dla problemu optymalnego nawiasowania wynika z faktu, e optymalne nawiasowanie całego ci gu jest zale ne od optymalnego nawiasowania fragmentów: M 1 M i +1 ... M k M k +1 M k + 2 ... M n dla k =1, 2, …, n-1 4 Przykład 2 M 1 = [5 × 10], M 2 = [10 × 20], M 3 = [20 × 1], M 4 = [1 × 10] R : [5, 10, 20, 1, 10] m11 m12 M = m13 m22 m23 m24 m33 m34 m44 m14 Proces wyznaczania warto ci macierzy M Elementy pierwszego wiersza macierzy M m11 = 0, m22 = 0, m33 = 0, m44 = 0 Elementy drugiego wiersza macierzy M (koszty fragmentów o długo ci dwóch macierzy), wyrazy m12, m23, m34 m12 = min (m1k + mk +12 + r0rk r2 ) = 1≤ k < 2 = min m11 + m22 + r0r1r2 = 0 + 0 + 5 ⋅10 ⋅ 20 = 1000 k =1 m23 = min(m2 k + mk +13 + r1rk r3 ) = 2≤ k <3 = min m22 + m33 + r1r2 r3 = 0 + 0 + 10 ⋅ 20 ⋅ 1 = 200 k =2 5 m34 = min(m3k + mk +14 + r2 rk r4 ) = 3≤ k < 4 = min m33 + m44 + r2 r3 r4 = 0 + 0 + 20 ⋅ 1 ⋅ 10 = 200 k =3 Elementy trzeciego wiersza macierzy M (koszty fragmentów o długo ci trzech macierzy), wyrazy m13, m24. m13 = min (m1k + mk +13 + r0rk r3 ) = 1≤ k <3 = min m11 + m23 + r0r1r3 , m12 + m33 + r0r2r3 = k =1 k =2 = min{0 + 200 + 5 ⋅10 ⋅ 1,1000 + 0 + 5 ⋅ 20 ⋅1} = 250 m24 = min (m2k + mk +14 + r1rk r4 ) = 2≤ k < 4 = min m22 + m34 + r1r2r4 , m23 + m44 + r1r3r4 = k =2 k =3 = min{0 + 200 + 10 ⋅ 20 ⋅10,200 + 0 + 10 ⋅1 ⋅10} = 300 Elementy czwartego wiersza macierzy M (koszty fragmentów o długo ci czterech macierzy), wyrazy m14 m14 = min (m1k + mk +14 + r0rk r4 ) = 1≤ k < 4 = min m11 + m24 + r0r1r4 , m12 + m34 + r0r2r4 ,m13 + m44 + r0r3r4 = k =1 k =2 k =3 = min{0 + 300 + 5 ⋅ 10 ⋅10,1000 + 200 + 5 ⋅ 20 ⋅ 10,250 + 0 + 5 ⋅ 1 ⋅ 10} = 300 6 Ostatecznie macierz M ma nast puj c posta : 0 M= 0 0 0 1000 200 200 250 300 300 Optymalny koszt optymalnego mno enia wynosi 300 i zachodzi przy nast puj cym rozstawieniu nawiasów w iloczynie M 1 M 2 M 3 M 4 : (M 1 (M 2 M 3 )) M 4 Algorytm for (i=1; i<=n; i++) mii = 0; for (t=1; t<=n-1; t++) for (i=1; i<= n-t; i++) { j=i+t; mij = min (mik + mk +1 j + ri −1rk r j ); i ≤k < j }; Zło ono pesymistyczna algorytmu rozwi zuj cego problem optymalnego nawiasowania stosuj cego programowanie dynamiczne: Rozmiar problemu: n – liczba macierzy w iloczynie Operacja elementarna: wyznaczanie iloczynu rozmiarów macierzy ri-1rk rj Tmax (n ) = 1 ⋅ (n − 1) + 2 ⋅ (n − 2 ) + ... + (n − 2) ⋅ 2 + (n − 1) ⋅ 1 ( ) Mo na pokaza , e Tmax (n ) = Θ n . 3 7 c) Problem optymalnej triangulacji wielok ta wypukłego WP: v0, v2, ... , vn-1 – ci g wierzchołków wielok ta wypukłego W WK: T – zbiór nie przecinaj cych si przek tnych wielok ta, dziel cych go na rozł czne trójk ty tak, e suma obwodów powstały trójk tów jest najmniejsza. Algorytm wykorzystuj cy programowanie dynamiczne Problem optymalnego mno enia macierzy jest szczególnym przypadkiem problemu optymalnej triangulacji. Ka dy egzemplarz problemu nawiasowania iloczynu macierzy mo na sformułowa jako równowa ny egzemplarz problemu optymalnej triangulacji. Ci gowi rozmiarów macierzy r0 , r1 , r2 ,..., rn −1 odpowiada ci g wierzchołków wielok ta v0 , v1 , v2 ,..., vn −1 . Wystarczy w algorytmie ustalaj cym optymalne nawiasowanie iloczyn rozmiarów macierzy: ri −1 ⋅ rk ⋅ r j zast pi wywołaniem funkcji obliczaj cej mij macierzy wyznaczonej w obwód trójk ta vi −1 , vk , v j . Warto algorytmie optymalnego nawiasowania opowiada wynikowi optymalnej triangulacji wielok ta: vi −1 , vi ,..., v j . Odpowiednikiem rozstawienia nawiasów w iloczynie macierzowym (M 1 (M 2 M 3 )) M 4 jest nast puj ca triangulacja: (M 1 (M 2 (M 2 M 3 )) M3) v0 , v1 , v2 , v3 v1 , v2 , v3 8 v0 v1 v4 v2 v3 9