Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

12
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.

Transcript of Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

Page 1: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

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

Page 2: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

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 2 3 4 5 6 7 8 9 10

Harga Pi (dalam

dollar)

1 5 8 9 10 17 17 20 24 30

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 optimal:

n = i1 + i2 + ……. + ik

Page 3: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

dengan hasil akhir panjang batang baja i1, 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 rn = 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.

Page 4: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

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

2       return 0

3       q = -∞

4       for i = 1 to n

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

6       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 ≤i≤n (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 CUT-

ROD (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

Page 5: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

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.

Top–down dengan memoisasi (memoization):

MEMOIZED-CUT-ROD.p; n/1 let r[0 . . n]  n_ be a new array2 for i D 0 to n3 rOEi_ D _14 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

Page 6: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

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.

Page 7: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

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 baru2  r [0] = 03     for j = 1 to n4          q = -∞5          for i = 1 to j6          if q < p[i] + r[ j – i] 7          q = p[i] + r [r - i] 8          s[j] = i9 r[j] = q10 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:

Page 8: Algoritma Rod Cutting Merupakan Salah Satu Bentuk Pemrograman Dinamik

i 0 1 2 3 4 5 6 7 8 9 10r[i] 0 1 5 8 10 13 17 18 22 25 30s[i] 0 1 2 3 4 4 6 1 2 3 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