0% menganggap dokumen ini bermanfaat (0 suara)
95 tayangan9 halaman

Dynamic Programming

Teknik dynamic programming digunakan untuk menyelesaikan masalah perkalian matriks berantai dengan cara yang lebih efisien. Hal ini dilakukan dengan membangun tabel yang menyimpan jumlah operasi perkalian teroptimal untuk setiap submasalah, sehingga submasalah tidak perlu dihitung berulang kali. Tabel tersebut kemudian digunakan untuk menemukan jumlah operasi perkalian teroptimal untuk masalah utama perkalian matriks berantai.

Diunggah oleh

Allday 7
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
95 tayangan9 halaman

Dynamic Programming

Teknik dynamic programming digunakan untuk menyelesaikan masalah perkalian matriks berantai dengan cara yang lebih efisien. Hal ini dilakukan dengan membangun tabel yang menyimpan jumlah operasi perkalian teroptimal untuk setiap submasalah, sehingga submasalah tidak perlu dihitung berulang kali. Tabel tersebut kemudian digunakan untuk menemukan jumlah operasi perkalian teroptimal untuk masalah utama perkalian matriks berantai.

Diunggah oleh

Allday 7
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 9

VII TEKNIK ALGORITMA: Dynamic Programming

VII.1 Pendahuluan

Teknik Dynamic Programming memiliki prinsip yang sama dengan divide and conquer,
dimana keduanya menyelesaikan suatu problem dengan cara memecahnya menjadi sub-sub
problem yang dapat diselesaikan secara rekursif.

Meskipun demikian, pada dynamic programming diusahakan menghindari dilakukannya


redundansi proses suatu sub problem (selama proses rekursif), yakni dengan cara mencatat
hasil yang telah diperoleh dari suatu sub problem pada suatu tabel (look-up table), dengan
demikian untuk proses sub problem lain yang lebih besar, tidak perlu menghitung berulang-
ulang nilai sub problem yang lebih kecil yang pernah dihitung sebelumnya. Cara ini lebih
dikenal dengan teknik bottom-up.

Sebaliknya, pada divide and conquer lebih menekankan pada teknik yang disebut top-down
dimana problem utama diselesaikan dengan cara memecahnya menjadi sub-sub problem
tanpa berusaha untuk menggunakan kembali solusi/nilai dari sub problem tersebut bila
diperlukan pada proses sub problem lain yang memerlukannya. Dengan demikian sub
problem yang lebih besar diperoleh dengan menggabung solusi-solusi dari sub problem yang
lebih kecil, begitu seterusnya hingga diperoleh solusi dari persoalan utama.

Pada gambar 7.1 diberikan contoh, dua buah algoritma untuk menentukan barisan Fibonacci,
dimana pada gambar 7.1a diberikan algoritma secara top-down yang kurang efisien, dan pada
gambar 7.1b diberikan algoritma secara bottom-up yang lebih efisien. Adanya redundansi
proses pada algoritma 7.1a ditunjukkan pada gambar 7.2.

Algoritma Fibonacci Algoritma Fibonacci


(rekursif) (non-rekursif)

function Fib1(N : integer) : integer; function Fib2(N : integer) : integer;


var i, Last, NextToLast, Answer : integer;
1 if (N = 0) or (N = 1) then 1 if (N = 0) or (N = 1) then
2 Fib ← 1 2 Answer ← 1
3 else 3 else
4 Fib ← Fib(N - 1) + Fib (N - 2); 4 Last ← 1; NextToLast ← 1;
5 return Fib 5 for i ← 2 to N do
6 Answer ← Last + NextToLast;
7 NextToLast ← Last;
8 Last ← Answer;
9 Fib ← Answer
10 return Fib
Gambar 7.1a Gambar 7.1b

ANALISA ALGORITMA 42
F6
F5 F4

F4 F3 F3 F2

F3 F2 F2 F1 F2 F1 F1 F0

F2 F1 F1 F0 F1 F0 F1 F0

F1 F0

Gambar 7.2 Redundansi Proses pada Fib1(6)

Catatan: teknik dynamic programming biasa digunakan untuk persoalan optimisasi (yang
biasa memiliki beberapa kemungkinan solusi) yang memenuhi prinsip optimal, yakni bila
sebarisan solusi menghasilkan hasil optimal, maka sub barisan tersebut juga bernilai optimal.

VII.2 Perkalian Matriks Berantai

Bila diperlukan menghitung suatu operasi perkalian dari beberapa matriks sbb.:

M = M1.M2. ... Mn

maka karena perkalian matrik bersifat asosiatif, maka M dapat dihitung dengan menggunakan
beberapa cara, misalnya:

M = ( ... ((M1.M2).M3 ) ... Mn )

= (M1.(M2.(M3 ... (Mn-1 .Mn ) ... )))

= ((M1.M2).(M3.M4 ) ... ), dst.

Persoalan perkalian matrik berantai adalah menentukan urutan/cara mana yang


menghasilkan jumlah perkalian skalar yang paling sedikit.

Contoh 7.1:
Misal diberikan 4 buah matrik A, B, C dan D yang masing-masing berukuran 13x5, 5x89, 89x3
dan 3x34. Maka matrik M = A.B.C.D dapat dihitung dengan beberapa cara seperti pada
gambar 7.3, dimana banyaknya perkalian skalar yang diperlukan untuk mengalikan 2 matrik A
(pxq) dan B (qxr) adalah p.q.r.

Pada gambar 7.3 tampak bahwa total operasi terkecil lebih cepat 19 kali dari pada total
operasi terbesar.

Untuk mengetahui urutan perkalian yang paling cepat, kita dapat lakukan secara sederhana
dengan mencoba semua urutan perkalian yang mungkin dan menentukan banyaknya operasi
perkalian skalar yang diperlukan masing-masing. Namun hal ini menjadi tidak efisien karena
memiliki pertumbuhan berorder eksponensial. Hal ini dapat ditunjukkan sebagai berikut:

ANALISA ALGORITMA 43
Misal T(n) adalah banyaknya cara/urutan untuk mengalikan n buah matrik. Ini berarti kita
memiliki T(1) = T(2) = 1, T(3) = 2 dan seperti contoh di atas T(4) = 5 cara. Bila kita lakukan:

Urutan Perkalian Jumlah Perkalian Total Operasi


((A.B).C).D (A.B) : 5.785 10.582
(A.B).C : 3.471
(A.B).C).D : 1.326
(A.B).(C.D) (A.B) : 5.785 54.201
(C.D) : 9.078
(A.B).(C.D) : 39.338
(A.(B.C)).D (B.C) : 1.335 2.856
(A.(B.C)) : 195
(A.(B.C)).D : 1.326
A.((B.C).D) (B.C) : 1.335 4.055
((B.C).D) : 510
A.((B.C).D) : 2.210
A.(B.(C.D)) (C.D) : 9.078 26.418
(B.(C.D)) : 15.130
A. (B.(C.D)) : 2.210
Gambar 7.3 Variasi perkalian matrik A.B.C.D

M = ( M1.M2. ... Mi ).( Mi+1.Mi+2. ... Mn )

maka terdapat T(i) cara untuk mengalikan suku pertama di ruas kanan dan T(n-i) cara
untuk suku ke dua. Karena 1 ≤ i ≤ (n-1), maka secara umum banyaknya cara tersebut
dapat ditulis secara rekursif sbb.:

1 , n =1
 n −1
T ( n) = 
∑
(7.1)
T (i ). T (n − i ) , n≥2
i =1

Nilai-nilai dari T(n) pada persamaan (7.1) dikenal dengan bilangan Catalan, yang memiliki
order eksponensial sebesar Ω(4n / n2). Waktu yang diperlukan untuk menghitung jumlah
operasi skalar untuk suatu cara adalah Ω(n). Dengan demikian cara sederhana ini
memerlukan waktu Ω(4n / n), yang menjadi tidak efisien lagi untuk nilai n yang besar.

VII.2.1 Implementasi teknik Dynamic Programming

Untuk menghindari cara yang kurang efisien di atas, kita dapat menerapkan teknik
dynamic programming. Hal ini terutama karena persoalan perkalian matrik berantai di
atas memenuhi prinsip optimal, yaitu bila cara terbaik (optimal) untuk mengalikan n matrik
di atas adalah dengan memotong antara matrik ke-i dan ke-(i+1), maka haruslah (M1.M2.
... Mi ) dan ( Mi+1.Mi+2. ... Mn ) diproses dengan cara optimal pula. Hal ini dapat dilakukan
sbb.:

Misal di , 0 ≤ i ≤ n, adalah suatu vektor yang berisi dimensi dari Mi ∋ dimensi dari Mi
adalah di-1 x di . Akan dibentuk suatu matrik/tabel mij , 0 ≤ i ≤ j ≤ n, dimana elemen-
elemen mij menunjukkan banyaknya operasi perkalian skalar yang diperlukan dalam
proses (Mi .Mi+1.Mi+2. ... Mj ). Dengan demikian solusi optimal (jumlah perkalian skalar
yang paling sedikit dalam M1.M2. ... Mn ) diperoleh dari m1n .

ANALISA ALGORITMA 44
Pembentukan Matrik/Table mij

1. Matrik mij dibentuk secara diagonal.

2. diagonal ke-s berisi elemen mij ∋ s = j - i dan untuk

• s = 0: mii = 0 , i = 1, 2, ... , n.

• s = 1: mi,i+1 = di-1 . di . di+1 , i = 1, 2, ... , n-1.

• 1 < s < n : mi,i+s = min ( mik + mk+1, i+s + di-1 . dk . di+s ), i = 1, 2, ... , n-s.
i ≤ k <i + s

catatan: kasus ke tiga menunjukkan bahwa untuk memperoleh jumlah perkalian skalar
yang paling sedikit dalam proses (Mi .Mi+1.Mi+2. ... Mi+s ), maka harus dilihat semua
kemungkinan proses ( Mi .Mi+1.. ... Mk ).( Mk+1 ... Mi+s ), untuk i ≤ k < i+s.

Pada gambar 7.4 diberikan pseudo-code untuk membentuk matrik mij . Pada algoritma
tersebut diberikan pula matrik LastChange yang digunakan untuk menentukan urutan
proses perkalian M1.M2. ... Mn yang akan memberikan jumlah perkalian skalar terkecil
(lihat gambar 7.5).

Algoritma Menentukan Jumlah Perkalian Skalar Optimal


pada Perkalian Matrik Berantai
procedure OptMatrix ( d : Array of Integer; N : integer; var m LastChange: TwoArray) ;
1 var k, s, Left, Right, ThisM : integer;
2 for Left ← 1 to N do
3 m[Left, Left ] ← 0;
4 for s ← 1 to N-1 do
5 for Left ← 1 to ( N - s ) do
6 Right ← Left + s;
7 m[Left, Right ] ← ∞ ;
8 for k ← Left to (Right - 1) do
9 ThisM ← m[ Left, k ] + m[ k+1, Right ] + ( d[Left -1] * d [ k ] * d[Right ] );
10 if ThisM < M[ Left, Right ] then
11 m[ Left, Right ] ← ThisM;
12 LastChange[ Left, Right ] ← k;
13 return
Gambar 7.4 Algoritma Jumlah Perkalian Skalar Optimal pada Perkalian Matrik Berantai

ANALISA ALGORITMA 45
Algoritma Menentukan Urutan Perkalian Matrik Berantai
function OrderMult( M : set of matrices { M1.M2. ... Mn }, LastChange: TwoArray, i, j: integer): Urutan;
{ LastChange adalah matrik yang diperoleh dari Algoritma pada gambar 7.4. Prosedur OrderMult ini dimulai
dengan pemanggilan OrderMult(M, LastChange, 1, n) }
1 if ( j > i ) then
2 X ← OrderMult( M, LastChange, i, LastChange[ i, j ] )
3 Y ← OrderMult( M, LastChange, (LastChange[ i, j ]+1), j )
4 return ( X. Y )
5 else return ( i )

Gambar 7.5 Algoritma Menentukan Urutan Perkalian Matrik Berantai

Contoh 7.2:

Perkalian matrik pada contoh 7.1 akan memberikan d = (13, 5, 89, 3, 34) dan untuk:

• s = 1: m12 = 5.785, m23 = 1.335, m34 = 9.078

• s = 2: m13 = min(m11 + m23 + (13 x 5 x 3), m12 + m33 + (13 x 89 x 3) )

= min(1.530, 9.256) = 1.530

m24 = min(m22 + m34 + (5 x 89 x 34), m23 + m44 + (5 x 3 x 34) )

= min(24.208, 1.845) = 1.845

• s = 3: m14 = min( {k=1} m11 + m24 + (13 x 5 x 34),

{k=2} m12 + m34 + (13 x 89 x 34),

{k=3} m13 + m44 + (13 x 3 x 34)

= min (4.055, 54.201, 2.856) = 2.856

dari sini akan diperoleh matrik mij seperti pada gambar 7.6 dan matriks LastChange pada
gambar 7.7.

mij j=1 2 3 4

i=1 0 5.785 1.530 2.856 s=3

2 0 1.335 1.845 s=2

3 0 9.078 s=1

4 0 s=0

Gambar 7.6 Matrik mij

ANALISA ALGORITMA 46
LC j=1 2 3 4

i=1 1 1 3

2 2 3

3 3

Gambar 7.7 Matrik LastChange

Analisa:

Untuk menentukan elemen mij , pada setiap diagonal s > 0, diperlukan menghitung (n - s)
elemen, yang masing-masing elemen dipilih diantara s kemungkinan (sebanyak nilai k).
Dari sini algoritma di atas memiliki waktu:

n −1 n −1 n −1

∑ (n − s). s = n. ∑ s − ∑ s
s =1 s =1 s =1
2

= n .(n − 1) / 2 − n.(n − 1)(2n − 1) / 6


2

= (n 3 − n) / 6.

yang merupakan Θ(n3).

VII.3 Persoalan Penjaja Keliling (Travelling Salesperson Problem)

Persoalan penjaja keliling adalah persoalan mencari sirkuit terpendek dari suatu graph
yang berbobot non-negatif. Sirkuit tersebut dapat dikatakan menggambarkan perjalanan
seorang penjaja keliling yang bermula dari suatu kota/node dan harus kembali ke kota
tersebut dengan hanya melalui sekali dan hanya sekali kota-kota/node yang lain yang
menjadi anggota graph tersebut.

Misalkan G = <N, A> adalah suatu graph berarah, dan misal N = {1, 2, ... , n}.
Panjang/bobot dari setiap edge ditandai dengan Lij dengan Lii = 0 dan Lij ≥ 0 untuk i ≠ j
serta Lij = ∞ bila tidak terdapat edge antara node i dan j.

Teknik dynamic programming dapat digunakan untuk memecahkan masalah ini, karena
persoalan tersebut memenuhi prinsip optimal, yakni misalkan sirkuit yang akan dicari
bermula dan berakhir pada node 1, maka terdapat sebuah edge (1, j), j ≠ 1 yang diikuti
oleh suatu path dari j ke 1 yang tepat melalui hanya satu kali setiap node i ∈ N \ {1, j }.
Bila sirkuit tersebut adalah optimal, maka path dari j ke 1 pastilah optimal pula.

Algoritma persoalan ini yang menerapkan teknik dynamic programming dapat


digambarkan sbb.:

• Perhatikan himpunan node S ⊆ N \ {1} dan sebuah node i ∈ N \S ( i = 1 hanya bila


S = N \ {1} ).

ANALISA ALGORITMA 47
• Definisikan g(i, S) sebagai panjang path terpendek dari node i ke node 1 yang
melalui tepat satu kali setiap node di S. Ini berarti g( 1, N \ {1} ) menunjukkan panjang
dari sirkuit optimal.

• Sesuai prinsip optimal, kita memiliki:

g( 1, N \ {1} ) = min ( L1 j + g ( j , N \ {1, j})) (7.2)


2≤ j ≤n

secara umum, bila i ≠ 1, S ≠ ∅, S ≠ N \ {1} dan i ∉ S, kita memiliki

g( i, S ) = min( Lij + g ( j , S \ { j})) (7.3)


j ∈S

dan

g( i, ∅ ) = L i1 , i = 2, 3, ... , n (7.4)

• Tentukan nilai g mulai dari S = ∅ (dengan menggunakan 7.4), dan S berisi satu node,
berisi dua node dst. (dengan menggunakan persamaan 7.3)

• Bila nilai dari g(j, N \ {1, j}) telah diketahui untuk semua node j ≠ 1, maka dengan
menggunakan persamaan 7.2 kita dapat selesaikan persoalan penjaja keliling
dengan memperoleh nilai g(1, N \ {1}).

Contoh 7.3:

Suatu graph berarah G yang terdiri dari 4 buah node memiliki matrik Lij sbb.

0 10 15 20
5 0 9 10
L= 
6 13 0 12 
 
8 8 9 0 

Untuk menentukan panjang dari sirkuit optimal dapat dilakukan sesuai algoritma di atas
sbb.:

• untuk S = ∅: g(2, ∅) = 5, g(3, ∅) = 6 , g(4, ∅) = 8

• untuk S berisi 1 node, dengan menggunakan persamaan (7.3) diperoleh:

g(2, {3}) = L23 + g(3, ∅) = 15, g(2, {4}) = L24 + g(4, ∅) = 18,

g(3, {2}) = L32 + g(2, ∅) = 18, g(3, {4}) = L34 + g(4, ∅) = 20,

g(4, {2}) = L42 + g(2, ∅) = 13, g(4, {3}) = L43 + g(3, ∅) = 15,

• untuk S berisi 2 node, dengan menggunakan persamaan (7.3) diperoleh:

g(2, {3, 4}) = min(L23 + g(3, {4}) , L24 + g(4, {3} )) = min (29, 25) = 25,

g(3, {2, 4}) = min(L32 + g(2, {4}) , L34 + g(4, {2} )) = min (31, 25) = 25,

ANALISA ALGORITMA 48
g(4, {2, 3}) = min(L42 + g(2, {3}) , L43 + g(3, {2} )) = min (23, 27) = 23

• dengan menggunakan persamaan (7.2), diperoleh:

g(1, {2, 3, 4}) = min(L12 + g(2, {3, 4}), L13 + g(3, {2, 4}), L14 + g(4, (2, 3}))

= min(35, 40, 43) = 35.

∴ Dari sini, sirkuit optimal memiliki panjang 35.

Untuk mengetahui rute/bentuk sirkuit optimal, dapat dilakukan dengan mendefinisikan


suatu fungsi J(i,S) yang menghasilkan nilai j yang dipilih pada saat mencari nilai yang
meminimumkan g pada proses g(i,S) dengan menggunakan persamaan 7.2 maupun 7.3.

Pada contoh di atas, kita peroleh:

J(2, {3, 4}) = 4, J(3, {2, 4}) = 4, J(4, {2, 3}) = 2, J(1, {2, 3, 4}) = 2

dengan demikian rute sirkuit optimal berupa:

1 → ( J(1, {2, 3, 4}) = 2 ) → ( J(2, {3, 4}) = 4 ) → ( J(4, {3}) = 3 ) → 1

yang digambarkan pada gambar (7.8).

10
1 2

10
6
9
4 3

Gambar 7.8 Sirkuit Optimal dengan panjang 35

Analisa:

• untuk menentukan g( j, ∅ ) diperlukan (n-1) nilai.

• untuk menentukan semua g(i, S) ∋ 1 ≤ (banyak anggota S = k) ≤ (n - 2), secara


 n − 2
keseluruhan memerlukan ( n − 1)  . k penjumlahan.
 k 

• untuk menentukan g(1, N \ {1}) diperlukan (n-1) penjumlahan.

Dari sini. total waktu yang diperlukan:

ANALISA ALGORITMA 49
n−2
 n − 2 r
 r
Θ( 2.(n - 1) + ∑ (n − 1). k .   ) = Θ( n .2 ),
2 n
(karena ∑ k .  k  = r.2 r −1
)
k =1  k  k =1

meskipun algoritma ini memiliki waktu eksponensial, namun masih lebih baik
dibandingkan dengan cara mencoba semua bentuk sirkuit yang mungkin, yang
memerlukan waktu Ω( n! ).

Sebagai ilustrasi, pada gambar 7.9 diberikan perbandingan waktu dari keduanya.

n Metode Langsung Dynamic Programming


(memerlukan n!) (memerlukan n2.2n )
5 120 800

10 3.628.800 102.400

15 1,31 x 1012 7.372.800

20 2,43 x 1018 419.430.400


Gambar 7.9 Perbandingan Waktu Pada Persoalan Penjaja Keliling

Catatan:

Pada pembahasan mengenai teori kompleksitas, akan ditunjukkan bahwa persoalan


penjaja keliling ini masuk kedalam kelas NP-Complete problem.

Soal-soal :

1. Bila dilakukan perkalian berantai dari 6 buah matrik: A1. A2. A3.A4. A5. A6 yang masing-
masing memiliki dimensi: A1 (30 x 35), A2 (35 x 15), A3 (15 x 5), A4 (5 x 10), A5 (10 x
20), A6 (20 x 25), maka tentukan:

a. jumlah perkalian skalar yang paling sedikit (optimal).

b. tentukan urutan perkalian tersebut untuk menghasilkan proses yang optimal.

2. Tentukan panjang dan rute optimal dari perjalanan penjaja keliling pada graph yang
memiliki matrik Lij sbb.:

0 10 15 20
5 0 9 10
L= 
6 13 0 12 
 
8 8 9 0 

ANALISA ALGORITMA 50

Anda mungkin juga menyukai