Seperti halnya
metode divide dan conquer, algoritma ini memecahkan masalah dengan mengombinasikan
solusi-solusi dari subproblem. Programing dalam konteks ini mengacu pada metode tabular
dan bukan pada programming dalam artian menulis kode komputer. Secara umum kita
mengaplikasikan dynamic programming untuk mencari solusi yang optimal dari seuatu
permasalahan. Beberapa masalah mempunyai banyak solusi, tiap solusi mempunyai nilai dan
kita mencari sebuah solusi dengan nilai optimal. Pemrograman algoritma dinamik mencari
solusi setiap subproblem dan disimpan pada tabel, dengan demikian dapat dihindari
penghitungan ulang untuk menjawab subsubproblem yang sebelumnya telah diketahui
solusinya.
Ketika mengembangkan algoritma dynamic programming, kita mengikuti urutan
empat tahapan sebagai berikut:
1.
2.
Langkah 1-3 merupakan dasar dari solusi permasalahan dynamic programming. Jika kita
hanya membutuhkan nilai dari solusi optimal dan bukan solusi itu sendiri, kita dapat
menghilangkan langkah nomer 4. Ketika melakukan langkah 4, terkadang membutuhkan
informasi cara 3 sehingga dengan mudah kita menggagas solusi yang optimal.
Pada
bab-bab
selanjutnya
akan
dijelaskan
contoh
penyelesaian
permasalahan
Penjelasan metode rod cutting paling mudah adalah dengan menjabarkan permasalahan
pemotongan batang baja. Perusahaan membeli batangan baja yang panjang dan memotong
baja menjadi beberapa bagian atau tidak memotongnya sama sekali, kemudian dijual untuk
mendapatkan keuntungan maksimal. Manajemen perusahaan dapat menggunakan metode rod
cutting untuk mengetahui letak dan jumlah potongan batangan baja tersebut.
Jika diasumsikan, kita mengetahui i = 1, 2 harga Pi dolar untuk batang baja sepanjang I
inchi. Panjang batangan selalu bernilai bulat untuk setiap inchinya. Daftar harga persatuan
panjang dapat dilihat pada tabel 2.1.
Tabel 2.1 Panjang i dan harga Pi
Panjang i (dalam inchi) 1
Harga Pi (dalam
1
2
5
3
8
4
9
5
10
6
17
7
17
8
20
9
24
10
30
dollar)
Persoalan Rod Cutting dapat dijabarkan sebagai penentuan nilai penjualan optimal untuk
baja dengan panjang batangan n inches. Berdasarkan tabel harga Pi untuk i = 1, 2, 3..n, kita
dapat menentukan hasil maximum
per potongan dengan metode Rod Cutting. Harga Pn sebuah batangan baja dengan panjang
batang n mempunyai kemungkinan sebagai nilai optimal sehingga dimungkinkan nilai
optimal didapatkan tanpa melakukan pemotongan.
Pada gambar 2.1 dapat dilihat berbagai macam kemungkinan untuk pemotongan batangan
besi sepanjang 4 inchi (n = 4). Dari delapan macam cara yang ada dapat diketahui bahwa
solusi optimal untuk batangan baja sepanjang 4 inchi adalah dengan memotongnya menjadi
dua bagian dengan panjang masing-masing 2 inchi. Solusi optimal yang didapatkan
mengahasilkan nilai pendapatan 10 dollar.
Gambar 2.1. Delapan kemungkinan memotong batang dan di dapat pada gambar c merupakan
strategi optimal dengan panjang 2 dengan nilai total 10
Potongan-potongan batangan sebagai solusi ditunjukkan menggunakan penjumlahan
sederhana, sehingga 7 = 2+2+3 menunjukan bahwa batangan panjang 7 di potong menjadi
tiga batang dengan dua batang mempunyai panjang 2 inchi dan satu batang dengan panjang 3
inchi. Jika solusi optimal pemotongan batang adalah k batang, maka 1 k n dengan
dekomposisi
n = 1 + i2 + . + ik
optimal:
dengan hasil akhir panjang batang baja 1, i2,., ik dan memberikan hasil maximum:
rn = pi + p12 + .+ pik .
Hasil nilai dari solusi optimal untuk panjang batang mula-mula i dapat dilihat pada table 2.2.
rn-1 + r1.
Sehingga diperoleh :
ri
Solusi optimal
1
1
1 (tidak di potong)
2
5
2 (tidak di potong)
3
8
3 (tidak di potong)
4
10
2+2
5
13
2+3
6
17
6 (tidak di potong)
7
18
1+6 atau 2+2+3
8
22
2+6
9
25
3+6
10
30
10
Tabel 2.2. Contoh panjang batangan dan solusi optimalnya.
Kemungkinan solusi diantaranya adalah dengan tanpa melakukan pemotongan,
sehingga n = Pi. Kemungkinan kedua adalah dengan melakukan pemotongan awal n-i dari
titik awal batang (bias kanan ataupun kiri), dengan i = 1, 2, 3.(n-1), sehingga didapatkan
dua batang dengan panjang (i) dan (n-i). Demikian seterusnya hingga seluruh kemungkinan
dipertimbangkan. Solusi optimal dapat ditemukan dengan menghitung kemungkinan untuk
setiap solusi, namun akan sangat menghabiskan banyak waktu dan sumber daya.
Permasalahan memotong batang disebut dengan optimal substructure: yaitu solusi optimal
if n == 0
return 0
q = -
for i = 1 to n
return q
Prosedur CUT-ROD mengambil inputan dari array p[1..n] dan integer n kemudian
Dapat kita ketahui bahwa algoritma Rod cutting tidak efektif karena algoritma ini
menyelesaikan subproblem yang sama secara berulang-ulang. Untuk meningkatakan
efisiensi, setiap subproblem diselesaikan hanya sekali saja kemudian menyimpan solusinya.
Ketika kita membutuhkan solusi untuk permasalahan yang sama, kita tidak perlu melakukan
penghitungan ulang untuk mendapatkan solusinya tetapi hanya perlu mencari solusi yang
telah disimpan. Pada prinsipnya adalah apabila menemukan permasalahan yang sama dengan
permasalahan yang telah ditemukan solusinya, kita tidak perlu menghitung ulang namun
hanya perlu mengambil data solusi yang telah disimpan. Langkah penyimpanan solusi ini
merupakan contoh penerapan time-memory trade-off.
Terdapat dua pendekatan yaitu top-down dengan memoization dan bottom-up.
Topdown dengan memoisasi (memoization):
MEMOIZED-CUT-ROD.p; n/
1 let r[0 . . n] n_ be a new array
2 for i D 0 to n
3 rOEi_ D _1
4 return MEMOIZED-CUT-ROD-AUX.p; n; r/
-
Prosedur utama Memoized-Cut-Rod menginialisasi array baru r[0..n] dan memberi nilai
Subproblem Graph
Saat kita berfikir tentang problem pemrograman dinamis, kita seharusnya memahami
aturan dari subproblem yang terlibat dan bagaimana subproblem bergantung satu sama lain.
Gambar 2.4 Subproblem graph dengan permasalahan rod cutting dengan n = 4.
Pada Gambar 2.4 diatas menunjukkan subproblem graph untuk rod-cutting problem
dengan n=4. Ini adalah graph yang secara langsung, berisi satu vertex untuk setiap
subproblem yang berbeda. Subproblem graph mempunyai ujung dari vertex yang secara
langsung berhubungan dengan vertex subproblem x ke subproblem y jika menentukan sebuah
solusi optimal dari subproblem x untuk memuat pertimbangan dari solusi pertimbangan y.
Sebagai contoh, subproblem graph berisi sebuah ujung dari x ke y jika sebuah prosedur
rekursif top-down untuk memecahkan x secara langsung memanggil dirinya sendiri untuk
memecahkan y. Kita dapat mempertimbangkan subproblem graph seperti sebuah versi
reduce atau collapse dari pohon rekursi untuk metode rekursif top-down, dimana kita
menyatukan semua node untuk subproblem yang sama menjadi satu vertex dan mengarahkan
semua ujung dari parent ke child.
Metode bottom-up untuk pemrograman dinamis menganggap simpul dari subproblem
graph seperti sebuah perintah yang memecahkan subproblem y berdekatan dengan
subproblem x sebelum kita memecahkan subproblem x. (Pemanggilan ulang dari Section B.4
yang relasinya berdekatan bukan simetrik yang penting). Pada sebuah algoritma
pemrograman dinamis bottom-up, kita mempertimbangkan vertex dari subproblem graph
pada sebuah perintah yang reverse topological sort atau topological sort of the transpose
dari subproblem graph. Dengan kata lain, tidak ada subproblem yang dipertimbangkan
sampai semua subproblem bergantung pada solusi yang telah diselesaikan. Secara mirip,
menggunakan dugaan dari bab yang sama, kita dapat melihat metode top-down (dengan
memorization) untuk pemrograman dinamis seperti sebuah depth-first search dari
subproblem graph.
Ukuran dari subproblem graph G = (V, E) dapat membantu menentukan waktu
running dari algoritma pemrograman dinamis. Sejak kita memecahkan setiap subproblem
hanya sekali, waktu running adalah jumlah dari waktu yang dibutuhkan untuk memecahkan
setiap subproblem. Secara umum, waktu untuk menghitung solusi dari subproblem adalah
proporsional untuk derajat (nomor dari ujung yang keluar) dari vertex yang bersesuaian
dalam subproblem graph, dan nomor dari subproblem sama dengan nomor dari vertex dalam
subproblem graph. Pada kasus yang ada, waktu running dari program dinamis adalah linear
pada nomor vertex dan edge.
dari solusi optimal, tetapi tidak mengembalikan solusi aktual: sebuah daftar dari potongan
ukuran. Kita dapat memperluas pendekatan pemrograman dinamis untuk mencatat tidak
hanya nilai optimal (value) yang dihitung untuk setiap subproblem, tetapi juga sebuah pilihan
(choice) yang mengarahkan ke nilai optimal. Dengan informasi ini, kita dapat siap mencetak
solusi optimal.
Disini adalah versi extended dari BOTTOM-UP-CUT-ROD yang dihitung, untuk
setiap ukuran batang j, tidak hanya hasil maksimum rj, tetapi juga sj, ukuran optimal dari
potongan pertama:
EXTENDED-BOTTOM-UP-CUT-ROD.p; n/
1 let r[0 . . n] dan s[0 . . n] menjadi array baru
2 r [0] = 0
3 for j = 1 to n
4
q = -
5
for i = 1 to j
6
if q < p[i] + r[ j i]
7
q = p[i] + r [r - i]
8
s[j] = i
9 r[j] = q
10 return r and s
Prosedur ini mirip dengan BOTTOM-UP-CUT-ROD, kecuali jika itu membuat array
s pada baris 1, dan mengupdate s[j] pada baris 8 untuk memegang ukuran optimal i dari
potongan pertama untuk memotong saat memecahkan sebuah subproblem dari ukuran j.
Prosedur berikut menerima sebuah harga dari tabel p dan sebuah ukuran batang n, dan
memanggil EXTENDED-BOTTOM-UP-CUT-ROD untuk menghitung array s[1..n] dari
ukuran potongan pertama yang optimal dan mencetak daftar lengkap dari ukuran potongan
pada sebuah dekomposisi optimal pada sebuah batang dengan panjang n:
PRINT-CUT-ROD-SOLUTION(p, n)
1 (r,s) = EXTENDED-BOTTOM-UP-CUT-ROD(p,n)
2 while n > 0
3 print s[n]
4 n = n s[n]
Pada contoh rod-cutting, untuk panjang batang 10 inchi (n=10) maka kita memanggil
prosedur EXTENDED-BOTTOM-UP-CUT-ROD (p, 10) dan akan mengembalikan array
sebagai hasil solusi sebagai berikut:
i
r[i]
s[i]
0
0
0
1
1
1
2
5
2
3
8
3
4
10
4
5
13
4
6
17
6
7
18
1
8
22
2
9
25
3
10
30
10