METODE GREEDY MASALAH KNAPSACK Kita diberikan sebuah knapsack (ransel) yang dapat menampung berat maksimum M dan sehimpunan benda A = {a 0,a 1,...,a n-1 } yang berbobot W = {w 0,w 1,...,w n-1 }. Setiap benda tersebut diberikan nilai profit yang dinotasikan dengan P = {p 0,p 1,...,p n-1 }. Jika kita diperbolehkan memasukkan z i bagian dari benda a i yang ada ke dalam knapsack dimana 0 z i 1, maka kita dapatkan profit sebesar z i p i untuk benda a i tersebut. Yang dimaksud dengan masalah knapsack adalah : Bagaimana kita memilih atau menentukan z i untuk masing-masing benda a i dari keadaan di atas dengan tujuan mendapatkan total profit yang maksimal, dan dengan kendala bahwa total bobot dari benda-benda yang dimasukkan ke dalam knapsack tidak melebihi M. Secara matematis, masalah knapsack tersebut dapat ditulis sebagai berikut : n-1 maksimumkan Q = z ipi i=0 dengan kendala n 1 i= 0 zi w i W dan 0 z i 1, p i 0, w i 0, 0 i n-1 Sebuah solusi yang optimal adalah himpunan Z = {z 0,z 1,...,z n-1 } yang memaksimalkan nilai Q dan memenuhi kendala-kendala yang ada. Contoh : Kita diberikan sebuah knapsack (ransel) yang dapat menampung berat maksimum 15 Kg dan sehimpunan benda A = {a 0, a 1, a 2, a 3 } yang berbobot (dalam Kg) W = {5,9,2,4}. Setiap benda tersebut diberikan nilai profit P = {100, 135, 26, 20}. Jika kita diperbolehkan memasukkan z i
bagian dari benda a i yang ada ke dalam knapsack dimana 0 z i 1, maka tentukanlah Z = {z 0,z 1,z 2,z 3 } agar diperoleh total profit yang maksimal! Algoritma Sekuensial Knapsack Metode Greedy Salah satu cara untuk menyelesaikan masalah knapsack secara sekuensial adalah dengan pemakaian metode Greedy. Procedure tersebut disebut procedure GREEDY_KNAPSACK. Sebelum procedure tersebut digunakan, benda-benda harus diurutkan rasio p i /w i -nya tidak menaik. Dengan kata lain : p 0 / w 0 p 1 / w 1... p n-1 / w n-1 Adapun procedure GREEDY_KNAPSACK adalah sebagai berikut : procedure GREEDY_KNAPSACK(P,W,M,Z,n) real P(0:n-1),W(0:n-1),Z(0:n-1),cu; {n = banyak benda} integer i,n; Z 0 { Z(0), Z(1),..., Z(n-1) = 0} cu M for i 0 to n-1 do if W(i) cu then exit endif Z(i) 1 cu cu - W(i) repeat if i n-1 then Z(i) cu/w(i) endif end GREEDY_KNAPSACK Jika algoritma ini digunakan untuk menyelesaikan masalah seperti pada contoh yang lalu, dimana n = 4; M = 15; W = { 5,9,2,4 }; P = { 100,135,26,20 }, maka akan terlihat hasil tracenya sebagai berikut : Z 0 cu 15 i = 0 karena W(0) cu yaitu : 5 15 berarti : Z(0) 1 Logika dan Algoritma Yuni Dwi Astuti, ST 2
cu 15-5 = 10 i = 1 karena W(1) cu yaitu : 9 10 berarti : Z(1) 1 cu 10-9 = 1 i = 2 karena W(2) cu yaitu : 2 1 berarti : keluar dari loop (exit) Karena 2 3 maka Z(2) cu/w(2) = 1/2 = 0,5 Jadi optimisasi masalah knapsack diperoleh bila Z = { 1; 1; 0,5; 0 } Sehingga Q = 1 x 100 + 1 x 135 + 0,5 x 26 + 0 x 20 = 100 + 135 + 13 + 0 = 248 Analisis : Kompleksitas waktu dari algoritma Greedy_Knapsack ini adalah O(n). Tetapi jika data yang digunakan belum terurut rasio p i /w i -nya tidak menaik, maka diperlukan kompleksitas waktu sebesar O(n log n) untuk mengurutkan sebelumnya. Sehingga untuk masalah optimisasi knapsack, kompleksitas waktu dari algoritma ini akan lebih besar pada waktu proses pengurutannya. Latihan : Diketahui 3 buah benda dan sebuah knapsack dengan kapasitas maksimum 20. Berat dan profit dari masing-masing benda tersebut adalah (18, 15, 10) dan (25, 24, 15). Tentukanlah Z agar diperoleh total profit yang maksimal! Jawab : Pertama, kita periksa apakah rasio p i /w i -nya tidak menaik. p 0 /w 0 = 25/18 p 1 /w 1 = 24/15 p 2 /w 2 = 15/10 Logika dan Algoritma Yuni Dwi Astuti, ST 3
Terlihat bahwa syarat rasio p i /w i -nya tidak menaik belum terpenuhi. Jadi susunan (urutan) -nya untuk sementara kita ubah, agar syarat rasio p i /w i -nya tidak menaik terpenuhi dan kita dapat menyelesaikan masalah tersebut dengan procedure GREEDY_KNAPSACK. Untuk itu, kita ubah sementara urutan benda-bendanya (setelah diperoleh jawaban sementara, kita kembalikan urutan ke susunan semula). Perubahan yang kita lakukan adalah sebagai berikut : urutan ke- (yang lama) urutan ke- (yang baru) 0 2 1 0 2 1 sehingga syaratnya terpenuhi ; 24/15 15/10 25/18 rasio p i /w i -nya tidak menaik Sekarang kita sudah dapat menggunakan procedure GREEDY_KNAPSACK untuk menyelesaikan masalah tersebut. Adapun hasil trace-nya adalah sebagai berikut : Z 0 cu 20 i = 0 karena W(0) cu yaitu : 15 20 berarti : Z(0) 1 cu 20-15 = 5 i = 1 karena W(2) cu yaitu : 10 5 berarti : keluar dari loop (exit) Karena 1 2 maka Z(1) cu/w(1) = 5/10 = 0,5 Jadi diperoleh : Z(0) = 1 ; Z(1) = 0,5 ; Z(2) = 0 Sekarang urutannya kita kembalikan seperti semula, yakni : Logika dan Algoritma Yuni Dwi Astuti, ST 4
urutan ke- (yang saat ini) urutan ke- (yang semula) Z(i) 2 0 0 0 1 1 1 2 0,5 Jadi optimisasi masalah knapsack diperoleh bila Z = { 0; 1; 0,5 } Sehingga Q = 0 x 25 + 1 x 24 + 0,5 x 15 = 0 + 24 + 7,5 = 31,5 MASALAH POHON RENTANGAN MINIMAL Permasalahan umum dari pohon rentangan minimal adalah mencari minimum biaya (cost) pohon rentangan dari setiap ruas suatu graf yang membentuk pohon. Setiap graf tidak dapat ditentukan pohon rentangan minimalnya. Adapun graf yang dapat kita tentukan pohon rentangan minimalnya adalah graf yang memenuhi ketiga syarat berikut : 1. graf tersebut harus terhubung 2. setiap ruas dari graf tersebut harus mempunyai nilai atau bobot (graf berlabel) 3. graf teresbut tidak berarah Algoritma yang dapat digunakan untuk menyelesaikan masalah pohon rentangan minimal cukup banyak. Dalam pembahasan ini, algoritma yang akan dipakai adalah algoritma PRIM S. Berikut ini akan disajikan langkah-langkah penyelesaian masalah pohon rentangan minimal dengan menggunakan algoritma PRIM S. PROCEDURE PRIM(E,COST,n,T,mincost) REAL COST(n,n),mincost INTEGER NEAR(n),n,i,j,k,l,T(1:n-1,2) (k,l) ruas dengan biaya atau bobot yang minimum mincost COST(k,l) Logika dan Algoritma Yuni Dwi Astuti, ST 5
(T(1,1),T(1,2)) (k,l) FOR i 1 TO n DO IF COST (i,l) < COST(i,k) THEN NEAR (i) l ELSE NEAR(i) k ENDIF REPEAT i NEAR(k) NEAR(l) 0 FOR i 2 TO n-1 DO Pilih j (sebuah index) sedemikian sehingga NEAR(j) 0 AND COST(j,NEAR(j)) adalah minimum (T(i,1),T(i,2)) (j,near(j)) mincost mincost + COST(j,NEAR(j)) NEAR(j) 0 FOR k 1 TO n DO IF NEAR(k) 0 AND COST(k,NEAR(k)) > COST(k,j) THEN NEAR(k) j ENDIF REPEAT k REPEAT i IF mincost ~ THEN PRINT bukan pohon rentangan ENDIF END PRIM Contoh : Perhatikan graf berikut ini : Tentukanlah nilai pohon rentangan minimalnya, serta pohon yang membentuk pohon rentangan minimal tersebut. Logika dan Algoritma Yuni Dwi Astuti, ST 6
Penyelesaian : Dengan menggunakan algoritma PRIM S, prosesnya adalah sebagai berikut : (k,l) (1,2) mincost COST(1,2) = 10 (T(1,1),T(1,2)) (1,2) i=1 COST (1,2) < COST(1,1)? 10 < ~ TRUE : NEAR (1) 2 i=2 COST (2,2) < COST(2,1)? ~ < 10 FALSE : NEAR (2) 1 i=3 COST (3,2) < COST(3,1)? 50 < ~ TRUE : NEAR (3) 2 i=4 COST (4,2) < COST(4,1)? ~ < 30 FALSE : NEAR (4) 1 i=5 COST (5,2) < COST(5,1)? 40 < 45 TRUE : NEAR (5) 2 i=6 COST (6,2) < COST(6,1)? 25 < ~ TRUE : NEAR (6) 2 NEAR(1) NEAR(2) 0 i = 2 Pilih j = 6 karena NEAR(6) 0 dan COST(6,NEAR(6)) adalah minimum (T(2,1),T(2,2)) (6,2) mincost 10 + COST(6,2) = 10 + 25 = 35 NEAR(6) 0 Logika dan Algoritma Yuni Dwi Astuti, ST 7
k = 1 NEAR(1) 0 dan COST(1,NEAR(1)) > COST(1,6)? k = 2 NEAR(2) 0 dan COST(2,NEAR(2)) > COST(2,6)? 0 0 dan ~ > 25 FALSE dan TRUE FALSE k = 3 NEAR(3) 0 dan COST(3,NEAR(3)) > COST(3,6)? 2 0 dan 50 > 15 TRUE dan TRUE TRUE : NEAR(3) = 6 k = 4 NEAR(4) 0 dan COST(4,NEAR(4)) > COST(4,6)? 1 0 dan 30 > 20 TRUE dan TRUE TRUE : NEAR(4) = 6 k = 5 NEAR(5) 0 dan COST(5,NEAR(5)) > COST(5,6)? 2 0 dan 40 > 55 TRUE dan FALSE FALSE k = 6 NEAR(6) 0 dan COST(6,NEAR(6)) > COST(6,6)? i = 3 Pilih j = 3 karena NEAR(3) 0 dan COST(3,NEAR(3)) adalah minimum (T(3,1),T(3,2)) (3,6) mincost 35 + COST(3,6) = 35 + 15 = 50 NEAR(3) 0 k = 1 NEAR(1) 0 dan COST(1,NEAR(1)) > COST(1,3)? k = 2 NEAR(2) 0 dan COST(2,NEAR(2)) > COST(2,3)? 0 0 dan ~ > 50 FALSE dan TRUE FALSE k = 3 Logika dan Algoritma Yuni Dwi Astuti, ST 8
NEAR(3) 0 dan COST(3,NEAR(3)) > COST(3,3)? k = 4 NEAR(4) 0 dan COST(4,NEAR(4)) > COST(4,3)? 6 0 dan 20 > ~ TRUE dan FALSE FALSE k = 5 NEAR(5) 0 dan COST(5,NEAR(5)) > COST(5,3)? 2 0 dan 40 > 35 TRUE dan TRUE TRUE : NEAR(5) = 3 k = 6 NEAR(6) 0 dan COST(6,NEAR(6)) > COST(6,3)? 0 0 dan ~ > 15 FALSE dan TRUE FALSE i = 4 Pilih j = 4 karena NEAR(4) 0 dan COST(4,NEAR(4)) adalah minimum (T(4,1),T(4,2)) (4,6) mincost 50 + COST(4,6) = 50 + 20 = 70 NEAR(4) 0 k = 1 NEAR(1) 0 dan COST(1,NEAR(1)) > COST(1,4)? 0 0 dan ~ > 30 FALSE dan TRUE FALSE k = 2 NEAR(2) 0 dan COST(2,NEAR(2)) > COST(2,4)? k = 3 NEAR(3) 0 dan COST(3,NEAR(3)) > COST(3,4)? k = 4 NEAR(4) 0 dan COST(4,NEAR(4)) > COST(4,4)? k = 5 NEAR(5) 0 dan COST(5,NEAR(5)) > COST(5,4)? Logika dan Algoritma Yuni Dwi Astuti, ST 9
3 0 dan 35 > ~ TRUE dan FALSE FALSE k = 6 NEAR(6) 0 dan COST(6,NEAR(6)) > COST(6,4)? 0 0 dan ~ > 20 FALSE dan TRUE FALSE i = 5 Pilih j = 5 karena NEAR(5) 0 dan COST(5,NEAR(5)) adalah minimum (T(5,1),T(5,2)) (5,3) mincost 70 + COST(5,3) = 70 + 35 = 105 NEAR(5) 0 k = 1 NEAR(1) 0 dan COST(1,NEAR(1)) > COST(1,5)? 0 0 dan ~ > 45 FALSE dan TRUE FALSE k = 2 NEAR(2) 0 dan COST(2,NEAR(2)) > COST(2,5)? 0 0 dan ~ > 40 FALSE dan TRUE FALSE k = 3 NEAR(3) 0 dan COST(3,NEAR(3)) > COST(3,5)? 0 0 dan ~ > 35 FALSE dan TRUE FALSE k = 4 NEAR(4) 0 dan COST(4,NEAR(4)) > COST(4,5)? k = 5 NEAR(5) 0 dan COST(5,NEAR(5)) > COST(5,5)? k = 6 NEAR(6) 0 dan COST(6,NEAR(6)) > COST(6,5)? 0 0 dan ~ > 55 FALSE dan TRUE FALSE mincost ~? 105 ~ FALSE Logika dan Algoritma Yuni Dwi Astuti, ST 10
terdapat sebuah pohon rentangan, yang mempunyai nilai minimal = 105 Berikut adalah bentuk pohon rentangan minimalnya : Logika dan Algoritma Yuni Dwi Astuti, ST 11