170 likes | 370 Views
Dynamic Programming. Modul-7 : Analisis Algoritma dan Struktur data. Apa itu dynamic programming?. Teknik pemrograman yang menghindari komputasi berulang dari hal-hal yang sama dengan cara menyimpan hasil setiap langkah (subproblem) dalam memory atau suatu tabel / vektor
E N D
Dynamic Programming Modul-7 : Analisis Algoritma dan Struktur data
Apaitu dynamic programming? • Teknik pemrograman yang menghindari komputasi berulang dari hal-hal yang sama dengan cara menyimpan hasil setiap langkah (subproblem) dalam memory atau suatu tabel / vektor • Teknik pemrograman “bottom-up”, dimulai dari subproblem kecil selangkah-demi selangkah, dengan antisipasi hal-hal yang mungkin berulang (diperlukan lagi) sehingga dapat disimpan dalam suatu tabel.
Rekursif Fibonacci: % algoritma rekursif Fungsi fibo1(n) if (n < 2) return n else return fibo1(n-1) + fibo1(n-2); • Misalnya: fibo1(4) = fibo1(3) + fibo1(2), sehingga fibo1(3) dihitung = fibo1(2)+fibo1(1), dan fibo1(2) juga dihitung = fibo1(1) + fibo1(0). Disini fibo1(2) dua kali dihitung, demikian pula fibo1(1). Komputasinya tidak efisien • Karena F(n+1)/F(n) = golden ratio = 1.61803, maka kompleksitasnya adalah O(1.62n) • Algoritma yang menerapkan dynamic programming diharapkan memiliki kompleksitas linier O(n)
Solusi dinamis: % algoritma non rekursif Fungsi fibo2(n) i 1; j 0; for k 1 to n do { j i + j; i j – i; } return j; • Atau sbb: F(0) = 0; F(1)=1 for i=1 to n F(i) = F(i-1) + F(i-2) end.
Contoh1: Kompetisi Tim Olahraga • Andaikan ada dua tim olahraga, tim A dan tim B, bertanding sebanyak maksimum 2n-1 pertandingan, dimana tim yang pertama memenangkan n pertandingan dianggap sebagai pemenang. • Assumsi pertama yang harus diterapkan adalah tidak pernah ada pertandingan dengan hasil draw, kedua, setiap pertandingan adalah independen, tidak bergantung dengan pertandingan sebelumnya. • Anggaplah bahwa kebolehjadian untuk tim A menang adalah p, dan tentu saja kebolehjadian tim B menang adalah q = 1 – p.
Apabila P(i,j) adalahkebolehjadianuntuk A menangperluikemenangan, danuntuk B perlu j kemenangan. • Padaawalpertandingankebolehjadian=P(n,n) • Ketika A menangmaka P(0,j)=1, p=1, q=0, danketika B menangmaka P(i,0)=1, p=0 dan q=1 • Secaraumum P(i,j)=p*P(i-1,j) + q*P(i,j-1) Fungsi P(i,j) if i = 0 then return 1 else if j = 0 then return 0 else return p*P(i-1,j) + q*P(i,j-1) Kompleksitasnya: T(k) 2T(k-1) + d Asimptotik : O(2k) = O(4n) bilai=j=n
Solusidinamikadalahdenganmenyimpanhasilperhitungan P(i,j) dalamsuatutabel/array, kemudianbiladiperlukantinggaldiaksesdaritabel Fungsi Pertandingan(n, p) array P[0..n, 0..n]; q = 1 – p; for s = 1 to n { P[0,s] 1; P[s,0] 0; for k = 1 to (s-1) { P[k,s-k] = p*P[k-1,s-k] + q*P[k,s-k-1]; } } for s = 1 to n { for k = 0 to (n-s) { P[s+k,n-k] = p*P[s+k-1,n-k] + q*P[s+k,n-k-1]; } } return P[n,n]. • Kompleksitas-nyahanya O(n2)
Contoh 2: PerkalianMatriksBerantai • Perkalianduamatriks A,B bisadilakukanbilajumlahkolom A = jumlahbaris B Fungsi Kali-Matrix(A, B) if columns(A) ≠ rows(B) then error “dimensi tidak sesuai”; else { for i 1 to rows(A) for j 1 to columns(B){ C[i,j] 0; for k 1 to columns(A) C[i,j] C[i,j] + A[i,k]*B[k,j]; }
Andaikanada 4 matriks A1,A2,A3, dan A4 akandiperkalikanmakaada 5 kemungkinanperkalian: (A1(A2(A3A4))) (A1((A2A3)A4)) ((A1A2)(A3A4)) ((A1(A2A3))A4) (((A1A2)A3)A4) • Andaikandimensinyasbb: • A1 : 13 x 5 • A2 : 5 x 89 • A3 : 89 x 3 • A4 : 3 x 34 • Maka (A1A2) perlu: 13 x 5 x 89 = 5785 perkalian, (A1A2)A3 perlu: 13 x 89 x 3 = 3471, dan ((A1A2)A3)A4 perlu : 13 x 3 x 34 = 1326 • Total perlu 5785 + 3471 + 1326 = 10582 perkalian
dapat dibuktikan bahwa : ((A1A2)A3)A4 = 10582 perkalian (A1A2)(A3A4) = 54201 perkalian (A1(A2A3))A4 = 2856 perkalian A1((A2A3)A4) = 4055 perkalian A1(A2(A3A4)) = 26418 perkalian • Dengan kata lain kompleksitas tergantung pada cara perkalian yang dipilih, dimana yang paling efisien adalah (A1(A2A3))A4 = 2856 • Persoalannya: bagaimana menemukan cara perkalian matriks berantai yang efisien? Apakah dengan cara coba-coba satu persatu?
Secara teoritis cara coba-coba tdk efisien: • Andaikan jumlah percobaan yang harus dilakukan adalah P(n) untuk n buah matriks. Karena tanda kurung bisa disisipkan antara matriks ke-k dan ke (k+1) untuk semua nilai k mulai dari 1 hingga (n-1), maka akan diperoleh rekurensi: P(n) = 1 bila n = 1 = bila n 2 • Solusinya adalah “catalan number” C(n-1) = dengan Ω(4n/n3/2).
Solusidinamik: Function Matrix-Chain-Order(d) array n length[d] – 1; fori = 1 to n A[i,i] 0; endFor; for l = 2 to n fori = 1 to (n – l + 1) j i + l – 1; A[i,j] ; for k = i to j-1 q A[i,k] + A[k+1,j] + d(i-1)*d(k)*d(j); if (q < A[i,j]) then A[i,j] q; s[i,j] k; endIf endFor; endFor endFor return A, s;
d : adalah vektor yang menyatakan dimensi dari n buah matriks, misalnya: M1 : d0 x d1, M2 : d1 x d2 … Mn : d(n-1) x d(n) • Contoh: d = [13, 5, 89, 3, 34] adalah dimensi dari 4 matriks A1, A2, A3, dan A4 • Tabel A[n,n] memuat biaya perkalian setiap kombinasi perkalian matriks • Tabel s[n,n] berisi indeks, dimana s[i,j] berisi indeks k pada saat A[i,j] optimum
the call PRINT-OPTIMAL-PARENS(s, 1, 6) prints the parenthesization ((A1 (A2 A3)) ((A4 A5)A6)).
Algoritma Matrix-Chain-Multiply(A, s, i, j) if (j > i) then X Matrix-Chain-Multiply(A, s, i, s[i,j]); Y Matrix-Chain-Multiply(A, s, s[i,j] + 1,j); return Matrix-Multiply(X, Y); else return A(i) endIf Algoritma ini menggunakan tabel A[ ] dan tabel s[ ] dari algoritma “matrix-chain-order” untuk menujukkan cara melakukan perkalian matriksnya. Mula-mula algoritma ini dipanggil dengan argumen (A, s, 1, n)