Anda di halaman 1dari 23

Desain dan Analisis Algoritma

Pemrograman Dinamis
Programming Dinamis
(Dynamics Programming)
• Seperti metode divide and conquer, pemrograman dinamis
memecahkan masalah (problem) dengan menggabungkan solusi
dengan subproblem
• “Pemrograman” disini merefer : metode tabular, bukan membuat
program komputer
• Algoritma yang berdasarkan metode divide and conquer –
mempartisi problem ke subproblem independen, memecahkan
subproblem secara rekursif, dan menggabungkan solusinya untuk
memecahkan problem original
• Sebaliknya, pemrograman dinamis, dapat diaplikasikan saat
subproblem tidak independen , dimana subproblem membagi
subsubproblem
• Algoritma pemrograman dinamis memecahkan setiap subsubproblem
hanya satu kali dan kemudian jawabannya dalam suatu tabel, untuk
penggunaan selanjutnya
Pemrograman Dinamis
• biasanya diaplikasikan terhadap masalah optimasi; dimana
masalah tersebut banyak memiliki solusi yang mungkin
• Setiap solusi memiliki nilai, dan digunakan untuk menemukan
solusi dengan nilai optimal (minimum atau maksimum) /solusi
optimal

Pembangunan algoritma pemrograman dinamis ada 4 langkah:


• Karakterisasi struktur dari solusi optimal
• Secara rekursif mendefinisikan nilai solusi optimal
• Menghitung nilai dari solusi optimal degan cara bottom-up
• Membangun solusi optimal dari informasi yang dihitung
Contoh :
• masalah perkalian rantai-matriks (matrix chain multiplication)
perkalian Rantai-Matriks
(matrix-chain Multiplication)
• PROBLEM :
• Suatu sekuen (rantai ) <A1, A2, ..., An > dari n matriks akan
dikalikan, dimana untuk i=1, 2, ..., n, matriks Ai
mempunyai dimensi pi-1 x pi
• Pemberian tanda kurung perkalian dari A1 A2 ... An
• adalah cara meminimisasi jumlah perkalian skalar.

• Perkalian matriks adalah asosiatif, maka semua hasil dengan


tanda kurung menghasilkan nilai / produk yang sama
• Tetapi pemberian tanda kurung yang berbeda dapat
menghasilkan “cost’ yang berbeda dalam jumlah perkalian
skalar >> contoh
• Pseudocode
Perkalian
dua matriks

• Perkalian dua matriks A dan B kompatibel jika :


➢ jumlah kolom A sama dengan jumlah baris B
• Jika A adalah matriks (pxq) dan B adalah matriks (qxr) , maka
hasilnya C - matriks (pxr)
• Waktu (running time) untuk menghitung C didominasi olrh jumlah
perkalian skalar pada baris 7 : yaitu dengan total p q r
Contoh – perkalian Matriks
Jml perkalian=Jk1 * jb1 * jk2

3x3 3x2 3x2


A B C
Contoh 1 –
perkalian rantai-matriks
(matrix-chain Multiplication)
• Berikut problem dari rantai <A1, A2, A3 > dari 3 matriks. Anggap
dimensi dari matriks adalah 10 x 100, 100 x 5 dan 5 x 50
• Perkalian A1A2A3 dapat dapat diberi tanda kurung dengan 2 cara
berbeda : ((A1A2 )A3 ) dan (A1 (A2, A3 ))
A1 A2 A3
• Jika perkalian menurut cara : ((A1A2 )A3 ) , didapat : 10x100 100x5 5x50
5.000 + 2.500 = 7.500 perkalian skalar 10x5 100x50

• Jika perkalian menurut cara : (A1 (A2, A3 )), didapat : Jml perkalian A2.A3:
25.000 + 50.000 = 75.000 perkalian skalar 100x5x50 + 10x100x50
= 25000 + 50000 = 75000
Dimensi :
((A1A2 ) A3 ) =>p0, p1, p2, p3=10,100,5,50
→ (p0xp1),(p1xp2), (p2xp3) Jml perkalian=Jk1 * jb1 * jk2
→ (p0xp2), (p2,p3)
→ (p0xp3) Jml perkalian: ((A1A2 )A3 )
(10x100)(100x5)
Contoh - Dimensi : (10x5) (5x50)
((A1A2 )A3 ) : (10x5)(5x50) --- (10x50) 100x10x5 +10x5x50
(A1 (A2, A3 )): (10x100)(100x50) -- (10x50) =5000 + 2500 = 7500
Menghitung Jumlah Tanda Kurung
• Didefinisikan P(n) : jumlah tanda kurung alternatif dari sekuen
n matriks
• Saat n = 1 : hanya 1 perkalian matriks – hanya 1 cara memberi
tanda kurung produk matriks
• Saat n >= 2, tanda kurung perkalian matriks adalah perkalian
dari dua subperkalian matriks yang diberi tanda kurung, dan
pemisahan / split antara dua subperkalian akan terjadi antara
matriks ke (k) dan (k+1) untuk k=1, 2, .., n-1
• Jumlah total tanda kurung , dengan recurrence :
Contoh 2 –
perkalian rantai-matriks
(matrix-chain Multiplication)
• Dengan berapa cara dapat dilakukan pemberian tanda
kurung untuk perkalian A1A2A3A4 ?

• Dengan 5 cara :

Bagaimana dengan pemberian tanda kurung untuk


perkalian A1A2A3A4A5 ?
Menghitung Jumlah Tanda Kurung
• Dengan metode – generating function, dapat dilihat bahwa
solusi adalah
• P(n) = C(n-1)

• Dimana C(n) adalah bilangan Catalan

• Jumlah total tanda kurung adalah eksponensial


• metode brute-force untuk memeriksa semua kemungkinan
tanda kurung adalah strategi yang buruk dalam menentukan
pemberian tanda kurung perkalian rantai-matriks
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis
Step 1
Karakterisasi struktur dari tanda kurung yang optimal
• Step pertama dalam paradigma pemrograman dinamis adalah
menemukan substructure optimal dan menggunakannya untuk
membangun solusi optimal problem dari solusi optimal-subproblem

Untuk problem matrix-chain multiplication dilakukan step berikut :


• Notasi Ai..j menunjukkan matriks hasil dari evaluasi perkalian Ai Ai.+1 ... Aj
dimana i ≤ j
• Jika problem adalah nontrivial (misal i < j), maka pemberian tanda
kurung dari perkalian Ai Ai.+1 ... Aj harus split perkalian antara Ak dan
Ak+1 untuk k dengan range i ≤ k < j.
• Cost untuk pemberian tanda kurung ini adalah (cost perhitungan
matriks Ai..k ) + (cost perhitungan matriks Ak+1 ..j ) + ( cost perkalian
keduanya)
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis
Substructure optimal:
• Anggap bahwa pemberian tanda kurung optimal dari Ai Ai.+1 ...
Aj split perkalian antara Ak dan Ak+1
• Kemudian pemberian tanda kurung dari subrantai Ai Ai+1 ... Ak
dalam pemberian tanda kurung optimal dari Ai Ai+1 ... Aj ini
harus memberi tanda kurung optimal dari Ai Ai+1 ... Ak

• Begitu juga pemberian tanda kurung subrantai Ak+1 Ak+2 ... Aj


dalam pemberian tanda kurung optimal dari Ai Ai+1 ... Aj
harus memberi tanda kurung optimal dari Ak+1 Ak+2 ... Aj
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis

• Sekarang digunakan substructure optimal untuk


menunjukkan bahwa solusi optimal dari problem dapat
dibangun dari solusi optimal – subproblem

Solusi optimal dari problem dapat dibangun dengan :


1. Split problem menjadi dua subproblem (yaitu
mengoptimalkan pemberian tanda kurung subrantai
Ai Ai+1 ... Ak dan Ak+1 Ak+2 ... Aj
2. Cari solusi optimal –subproblem
3. Gabung solusi – solusi optimal dari subproblem
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis
Step 2
Secara rekursif definisikan nilai dari solusi optimal
• Definisikan cost dari solusi optimal secara rekursif dalam hal solusi
optimal – subproblem
• Pilih subproblem: problem yang menentukan cost minimum dari
pemberian tanda kurung pada perkalian Ai Ai.+1 ... Aj dimana 1 ≤ i ≤ j
≤n
• didefinisikan m[i,j] : jumlah minimum dari perkalian skalar yang
diperlukan untuk menghitung matriks Ai..j
• Untuk problem full, cost – cara termurah untuk menghitung A1..j
adalah pada m[1,n]
• Definisi rekursif dari cost minimum dari pemberian tanda kurung
perkalian Ai Ai.+1 ... Aj adalah :
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis
• Untuk menjaga track – bagaimana membangun solusi optimal,
didefinisikan s[i,j] untuk menjadi nilai k dimana kita dapat men-split
perkalian Ai Ai.+1 ... Aj untuk memperoleh pemberian tanda kurung optimal.
• Dengan kata lain : s[i,j] sama dengan nilai k dimana :
m[i,j]= m[i,k] + m[k+1, j] + pk pi-1 pj

Step 3
Menghitung nilai dari solusi optimal dengan cara bottom-up
• Cara simpel untuk menulis algoritma rekursif berdasarkan recurrence .
Algoritma ini memerlukan waktu eksponensial, tidak lebih baik dari
metode brute-force yang memeriksa tiap cara pemberian tanda kurung
dari perkalian
• Satu observasi penting adalah ada subproblem yang
berbeda. Satu problem untuk tiap pilihan dari i dan j yang memenuhi
1≤i≤j≤n
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis
• Algoritma rekursif dapat mengatasi setiap subproblem berkali-kali dalam
cabang yang berbeda dari tree rekursi. Sifat dari subproblem overlapping
adalah hal kedua dari pengaplikasian pemrograman dinamis (hal
pertama adalah substructure optimal)
• Pada step 3, tidak digunakan recurrence; paradigma pemrograman
dinamis menghitung cost optimal menggunakan tabel dengan
pendekatan bottom-up

Berikut pseudocode yang mengasumsikan matriks Ai yang mempunyai


dimensi pi-1 x pi untuk i=1, 2, ..n
• Input adalah sekuen p =< p0, p1, .. pn >
• Prosedur menggunakan tabel m[1..n, 1..n] untuk menyimpan cost m[i, j]
dan tabel s[1..n, 1..n] yang mencatat indeks k yang didapat untuk cost
optimal dalam perhitungan m[i,j]. Tabel s dapat digunakan untuk
membangun solusi optimal
Pemecahan Problem : Matrix-chain
Multiplication dengan Pemrograman Dinamis
Pemecahan Problem : Matrix-chain
Perkalian Rantai-Matriks -
Multiplication dengan Pemrograman Dinamis
• Contoh dengan n=6

Dimensi pi p=<30, 35, 15, 5, 10, 20, 25>


p0, p1, p2, p3, p4, p5, p6
Mencari m(i,j); s(i,j)

Tabel s[1..6, 1..6]

p=<30, 35, 15, 5, 10, 20, 25>


Tabel m[1..6, 1..6]
Cari minimum m(i,j)

• Jumlah minimum perkalian skalar untuk mengalikan 6 matriks adalah


[1,6] = 15125, dan pemberian tanda kurung adalah
Tabel s[1..6, 1..6] Tabel m[1..6, 1..6]
• Prosedur Rekursif berikut ini mencetak pemberian tanda kurung
optima; dari perkalian < Ai , Ai.+1 ,... Aj >, dengan input tabel s yang
cetak
dihitung oleh MATRIX-CHAIN-ORDER dan index i dan j.
• Memanggil PRINT-OPTIMAL_PARENS(s, 1, n) mencetak pemberian
tanda kurung optimal dari perkalian < A1 , A2 ,... An >

Tabel s[1..6, 1..6]


Running TIme
• Running time dari algoritma pemrograman dinamis
tergantung perkalian dari dua faktor:
• jumlah subproblem, dan
• jumlah pilihan untuk setiap subproblem

• Untuk perkalian rantai-matriks, ada Ɵ(n2) subproblem yang


berbeda, dan setiap subproblem ada paling banyak n-1
pilihan. Untuk itu, running time adalah O(n3)
Latihan
• Temukan jumlah tanda kurung optimal dari
perkalian rantai-matriks dimana sekuen dari
dimensi matriks adalah <5, 10, 3, 12, 5, 50, 6>

Anda mungkin juga menyukai