Anda di halaman 1dari 8

Algoritma rod cutting merupakan salah satu bentuk pemrograman dinamik.

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.

Menemukan karakter struktur dari solusi optimal.

2.

Mendefinisikan nilai solusi optimal secara rekursif.

3. Menghitung/menemukan nilai solusi optimal, biasanya dengan metode buttom-up.


4. Menggagas solusi optimal dengan memanfaatkan informasi yang sudah didapatkan

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

menggunakan algoritma rod cutting beserta optimasinya dengan menggunakan pendekatan


dynamic programming. Contoh permasalahan yang akan dibahas adalah pemotongan
batangan baja untuk mendapatkan nilai penjualan optimal. Analisis akan dilakukan pada
permasalahan pemotongan baja dalam penyelesaiannya menggunakan metode rod cutting dan
rod cutting yang telah dioptimasi dengan pendekatan dynamic programming.
PEMBAHASAN
2.1 Rod Cutting

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

rn yang diperoleh dari pemotongan batang dan menjual

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 dapat menunjukan hasil yang optimal dengan mengambil nilai maximum :

Pn : Didapatkan tanpa memotong batang baja.

r1 + rn-1: hasil maximum dari batang 1 inch dan batang ke n -1 inches.

r2 + rn-2: hasil maximum dari batang

2 inch dan batang ke n-2 inches.

rn-1 + r1.

Sehingga diperoleh :

rn = max (Pn.r1 + rn-1.r2 + rn-2.rn-1 + r1)


Panjang (i)

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

untuk permasalahan menggabungkan solusi optimal yang berhubungan dengan subproblem,


kita dapat menentukan solusi dengan bememanfaatkan solusi subproblem yang telah
diketahui dengan pencarian solusi secara independen

Implementasi Recursive top-down


Prosedur selanjutnya adalah implementasi perhitungan selengkapnya pada persamaan

dapat dilakukan dengan cara recursive top down.


CUT-ROD (p; n)
1

if n == 0

return 0

q = -

for i = 1 to n

q = max (q; p[i] + CUT-ROD (p,n _ i))

return q
Prosedur CUT-ROD mengambil inputan dari array p[1..n] dan integer n kemudian

mengembalikan kemungkinan hasil maximum untuk batangan dengan panjang n. Jika n = 0,


kemungkinan tidak ada hasil dan kemudian CUT-ROD dikembalikan 0 pada line 2. Pada line
3 inisialisasi hasil maximum q = -, sehingga untuk for (perulangan) pada line 4-5 dilakukan
pengecekan apakah q =max1 in (pi + CUT-ROD(p, n-i). Kemudian pada line 6
mengembalikan nilai. n dibuktikan dengan jawaban yang sama rn.
CUT-ROD tidak efisien karena melakukan pemanggilan CUT-ROD berulang-ulang
secara rekursif dengan nilai parameter yang sama. Hal tersebut sama dengan mengulang
pencarian solusi untuk semua subproblem, walaupun pernah ditemukan solusi untuk
subproblem yang sama. Pada gambar 2.3 ternjadi n = 4; CUT-ROD(p, n) memanggil CUTROD (p, n-i) untuk i = 1,2,..,n. Dengan CUT-ROD (p, n) memanggil (p, j) setiap j = 0,1.,
n-1. Ketika proses terjadi berulang-ulang maka besar kompleksitas permasalahan untuk n
akan membengkak dikarenakan pencarian solusi subproblem yang sama.
Gambar 2.3. Recursive three terlihat pemanggilan berulang

Penggunaan Dynamic Programming untuk Optimasi Rod Cutting

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

negatif tak hingga untuk setiap anggota array.


Menyelesaikan permasalahan secara rekursif, kemudian simpan solusi untuk setiap

permasalahan pada array r.


Untuk menemukan solusi subproblem terlebih dahulu lihat di table penyimpanan.
Apabila solusi ditemukan maka tidak perlu dilakukan penghitungan, apabila tidak ditemukan
maka dilakukan penghitungan untuk mencari solusi kemudian simpan solusi yang didapatkan

pada table penyimpanan untuk digunakan selanjutnya.


Memoizing dapat diartikan juga sebagai aktifitas atau tahapan mengingat apa yang telah
dikomputasi sebelumnya.
Bottom-up:

Pada pendekatan bottom-up kita mengurutkan subproblem berdasarkan ukuran kemudian

menyelesaikannya mulai dari subproblem dengan ukuran terkecil.


Ketika kita mencoba menyelesaikan sebuah subproblem, kita dapat memanfaatkan
subproblem dengan ukuran yang lebih kecil yang telah diselesaikan terlebih dahulu.

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.

Rekonstruksi ulang sebuah solusi


Solusi pemrograman dinamis untuk rod-cutting problem adalah mengembalikan nilai

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

Sebuah pemanggil untuk PRINT-CUT-ROD-SOLUTION (p, 10) akan mencetak


hanya 10, tetapi sebuah pemanggil dengan n=7 akan mencetak potongan 1 dan 6, bersesuaian
dengan dekomposisi optimal yang pertama untuk r7 yang diberikan sebelumnya. Dengan
prosedur ini maka semua data potongan penyusun solusi akhir dan nilai optimalnya tercatat.
KESIMPULAN
Algoritma rod cutting dapat digunakan untuk menyelesaikan permasalahan optimasi.
Algoritma rod cutting standar tidak efektif karena menyeselesaikan subbproblem yang sama
secara berulang-ulang. Oleh karena itu untuk mengoptimalkan kinerja algoritma rod cutting
maka diterapkan pendekatan dynamic programming .Metode ini menyimpan solusi
subprobelm-subproblem untuk digunakan kembali apabila permasalahan yang sama
ditemukan, dengan demikian penghitungan/pencarian solusi ulang untuk permasalahan yang
sama dapat dihindari.
Terdapat dua jenis metode rod cutting yang telah dioptimasi dengan dynamic
programming, yaitu Top-Down dengan memoisasi dan Bottom Up. Pada prinsipnya kedua
metode rod cutting teroptimasi tersebut sama, perbedan hanya terletak pada pencarian solusi
awal dan penyimpanan solusi pada array-nya yang menggunakan rekursif. Kompleksitas
waktu untuk kedua metode sama, yaitu

Anda mungkin juga menyukai