Kelompok 23 (WaterJug...Oh…WaterJug)
Kelas IF-29-05
OLEH :
Algoritma dapat dikatakan sebagai urutan langkah-langkah logis yang sistematis dalam
mencari suatu solusi dari suatu permasalahan yang ada. Pada program komputer, algoritma
terdiri dari sekumpulan langkah-langkah untuk mencapai suatu tujuan, seperti logika if-then-
else maupun pengulangan suatu tindakan atau langkah dengan loop. Begitu pula jika kita
ingin mensimulasikan penyelesaian masalah water jug di komputer, maka diperlukan juga
algoritma yang tepat agar masalah dapat ditangani se-efisien mungkin.
Water jug merupakan salah satu permasalah klasik yang sudah ada sejak lama dan
kadang-kadang masih terjadi dalam kehidupan manusia sekarang. Masalah water jug dapat
dibayangkan dengan suatu tujuan mengisi sebuah wadah yang diketahui kapasitasnya dengan
air secara tepat penuh menggunakan dua atau lebih wadah lain yang juga telah diketahui
kapasitasnya tetapi tidak mempunyai ukuran takaran. Dalam implementasinya, mungkin tidak
ada solusi atau bahkan akan ada lebih dari satu solusi untuk menyesaikan masalah water jug
tersebut. Memang sering kali terdapat banyak cara untuk menyelesaikan suatu masalah, akan
tetapi dari sekian cara tersebut, memilih manakah yang paling optimal akan memerlukan
suatu cara tersendiri.
Gambaran kasus water jug sederhana dan alternatif penyelesaiannya adalah sebagai
berikut:
Kolam air 3 l 4 l
1l
Wadah A Wadah B Wadah C
Misalkan kita ingin mengisi penuh wadah C yang berkapasitas 1 liter dengan air dari
kolam dengan menggunakan dua wadah lainnya yaitu wadah A dan wadah B yang
kapasitasnya masing-masing adalah 3 liter dan 4 liter. Maka akan ada beberapa alternatif cara
yang diantaranya sebagai berikut:
1) Alternatif 1
- Awalnya semua wadah kosong
- Isi air ke wadah A sampai penuh
- Tuangkan semua air dari wadah A ke wadah B
- Isi kembali wadah A sampai penuh
- Tuangkan sebagian isi wadah A ke wadah B sampai wadah B penuh
- Kosongkan wadah A
- Tuangkan sebagian isi wadah B ke wadah A sampai wadah A penuh
- Tuangkan sisa air di wadah B ke wadah C
- Akan didapat tepat 1 liter pada wadah C
2) Alternatif 2
- Awalnya semua wadah kosong
- Isikan air ke wadah B sampai penuh
- Tuangkan sebagian isi wadah B ke wadah A sampai wadah A penuh
- Tuangkan sisa air di wadah B ke wadah C
- Akan didapat tepat 1 liter pada wadah C
Dari kedua alternatif tersebut manakah yang lebih optimal dari segi usaha yang kita
lakukan? Dalam hal inilah algoritma A* diperlukan dalam mencari solusi dengan upaya
seoptimal mungkin.
1. LANDASAN TEORI
No State
S Nexxt state Deskrip psi
1 (x,yy) if x = 0 (3, y, z) isi wadah
w A sammpai penuh
2 (x,yy) if y = 4 (xx, 4, z) isi wadah
w B sam
mpai penuh
Tuanggkan seluruhh isi wadah A
3 (x, y) if x <= 1 and x != 0 (0, y, (x))
ke wadaah C
Tuanggkan seluruhh isi wadah B
4 (x, y) if y <= 1 and y != 0 (x, 0, (y))
ke wadaah C
Tuangkaan isi wadahh B ke wadaah A
5 (x,y) if x+
+y >= 3 and y >0 (3, y--(3-x), z)
sam
mpai wadahh A penuh
Tuangkaan isi wadahh A ke wadaah B
6 (x, y) if x+
+y >= 4 andd x>0 (x-(44-y), 4, z)
sam
mpai wadahh B penuh
Tuanggkan seluruhh isi wadah B
7 (x, y) if x+
+y <= 3 andd y>0 (x+
+y, 0, z)
ke wadaah A
Tuanggkan seluruhh isi wadah A
8 (x, y) if x+
+y <= 4 andd x>0 (0, x+y, z)
ke wadaah B
9 (x,yy) if x= 3 (00, y, z) kkosongkan w
wadah A
10 (x,yy) if y = 4 (xx, 0, z) k
kosongkan w
wadah B
Tabel 1 Atu
uran Produkssi Water Jug
Prooses 1 :
0,0,0
Prooses 2 :
0,0,0
3
3,0,0 0,4,0
0
Prooses 3:
0,0,0
0
3,0,0 0,4,0
Prooses 4 :
0,0,0
3,0,0 0,4,0
Prooses 5 :
0,0,0
3,0,0 0,4,0
3,0,,0 0,4,0
Prooses 6 :
0,0,0
3,0,0 0,4
4,0
3
3,4,0 0,0,,0 0,3,0 3,4,0 0,0
0,0 3,1,0
0
Prooses 7 :
0,0,0
3,0,0 0,4
4,0
3
3,4,0 0,0,,0 0,3,0 3,4,0 0,0
0,0 3,1,0
0
3,0,0 0,4,0
3,4,0 0,0
0,0 0,3,0 3,4,0 0,,0,0 3,1
1,0
3,0,0 0,4,0 3
3,3,0 3,0,0 3,0,0 0,4,0 0,1,0 0,4
4,0 3,0,1
Prooses 9 :
0,0
0,0
3,0,0 0,4,0
3,4,0 0,0
0,0 0,3,0 3,4,0 0,,0,0 3,1
1,0
3,0,0 0,4,0 3
3,3,0 3,0,0 3,0,0 0,4,0 0,1,0 0,4
4,0 3,0,1
Gamb
bar 2: Tree Seearch dalam proses
p algorittma A*
Dalam pembuatan program Water Jug kali ini, kelompok kami menggunakan aplikasi
pemrograman Delphi 2007 dengan bahasa pemrograman yang digunakan sama dengan bahasa
pemrograman Pascal. Alasan pemilihan bahasa dan aplikasi pemrograman tersebut yaitu
bahwa bahasa pemrogramannya lebih mudah dimengerti dan bisa memenuhi semua
requirement dari spesifikasi tugas besar yang diberikan (interface harus berbasis GUI).
a) Tabel1 : berfungsi untuk menyimpan data status node yang menyangkut parent,
g(n), h(n), dan f(n). Record yang digunakan untuk pembentukkan Tabel1
yaitu Rec1.
b) Tabel2 : untuk menyimpan semua informasi node yang telah di-expand dengan
kondisi terurut secara ascending berdasarkan f(n). Record yang digunakan
untuk membentuk Tabel2 yaitu Rec2
Ket : isi dari field i tergantung dari nilai field i di Tabel1 yang menunjuk
ke suatu status node.
c) Result : digunakan jika proses expanding node telah selesai dilakukan dan
ditemukan solusi. Tabel ini digunakan untuk mengambil semua index
parent dari node tujuan dengan tracing mundur sampai ke kondisi awal
(node awal).
Hal penting berikutnya yaitu bagaimana mencari nilai heuristik cost dan nilai real cost
untuk kasus Water Jug.? Untuk menghitung nilai heurisitik cost, kami menggunakan fungsi
sebagai berikut :
dimana : xi , y i = adalah usaha yang telah dikeluarkan untuk mencapai state tersebut
Zmax-zn = kondisi kekurangan jug goal saat itu untuk ke tujuan (goal state)
h(n) = nilai heuristic cost, dimana return value = hasil pembagian yang
dibulatkan ke atas dengan fungsi ‘Ceil’ (bukan sisa pembagian).
Fungsi h(n) tersebut dapat diartikan sebagai perbandingan usaha yang dilakukan saat itu
terhadap kurangnya air saat itu juga untuk mencapai goal yang diinginkan. Jadi misalkan kita
mengisi suatu jug A sampai penuh maka usaha yang dilakukan adalah xi dan karena jug
kedua tidak dilakukan apa-apa, maka yi = 0, lalu usaha yang telah dilakukan tersebut
dibandingkan dengan tujuan yang ingin dicapai saat itu. Sedangkan untuk menghitung nilai
real cost, kami menggunakan besarnya usaha yang digunakan untuk memasukkan air ke
suatu jug, membuang air dari suatu jug, ataupun untuk memindahkan air dari jug satu ke jug
yang lain dengan ditambah real cost sebelumnya. Misal: kapasitas masing-masing jug yaitu
{4,3,1}, current state {0,0,0}, dan next-state {4,0,0}, maka nilai real cost = 4+0 = 4.
Hal berikutnya yang harus didefinisikan yaitu mengenai aturan-aturan produksi yang
merupakan rule dalam meng-expand suatu node. Dalam program, semua aturan produksi ini
diletakkan dalam satu procedure ExpandNode(j1, j2, gol : Integer), dimana secara
keseluruhan aturan produksi tersebut dapat dilihat pada tabel berikut :
No State Next state Deskripsi
1 (x,y) if x = 0 (3, y, z) isi wadah A
2 (x,y) if y = 0 (x, 4, z) isi wadah B
Tabel 1: Aturan Produksi Water Jug
Mengingat tidak semua kombinasi jug/wadah yang diinputkan user memiliki solusi,
maka diperlukan suatu fungsi khusus yang berperan untuk mengecek apakah inputan user
tersebut memiliki solusi dan valid untuk dikerjakan atau tidak. Dalam algoritma kami, fungsi
tersebut disebut fungsi CekJug() dengan hasil Boolean yang mengembalikan nilai True jika
valid dan False jika tidak valid/tidak mungkin ada solusi. Prinsip yang kami gunakan, bahwa
suatu kombinasi untuk 3 buah jug akan, misal A, B, dan C dimana jug C adalah goal, akan
valid dan akan ada solusi jika memenuhi kalimat berikut:
dengan adanya fungsi ini, maka dapat dihindari loop pencarian tak hingga (karena tak ada
solusi) yang dapat menyebabkan program mengalami crash.
Di samping itu, masih ada procedur/function pendukung lain seperti InsertTabel1,
InsertTabel2, SortTabel2, berbagai atribut global dan lain-lain yang akan ditunjukkan
kegunaannya dalam penjelasan algoritma program berikut ini.
4.2 Algoritma Program
Algortima program yang kami buat, tidak jauh beda dengan yang telah diajarkan
diperkuliahan mengenai A* search. Alur jalannya program yaitu sebagai berikut:
a) Pada kondisi awal, akan di-assign status awal {0,0,0}, dimana setelah menghitung
nilai heuristic cost dan real cost, maka informasi tersebut akan langsung diinsertkan
ke dalam Tabel1 dan Tabel2.
Di Tabel2 akan dilakukan pengurutan ascending berdasarkan nilai f(n). Kemudian,
informasi yang berada di nomor urut 1 (index2=1) akan di delete yang dilakukan oleh
procedure DelFirstTabel2(), dimana nilai yang di-delete tersebut dimasukkan dalam
variabel global i, node, f. Pada saat goal_state dicapai, informasi mengenai goal_state
yang dicapai dapat dilihat pada variabel global ini.
Di program juga disediakan variabel global jug_1, jug_2, jug_goal yang akan di-
update nilainya setiap kali proses insert ke tabel akan dilakukan. Proses ini dilakukan
oleh procedure KondisiJug(a, b, c : Integer).
b) Setelah itu, proses akan berlanjut ke perulangan (looping) meng-expand node
berdasarkan variabel i, node, f, yang terdiri dari proses-proses seperti pada langkah 1.
Looping terus dijalankan selama index2 (index untuk Tabel2) <> 1 dan jug_gol <>
gol_maks.
c) Pada saat kondisi looping tidak terpenuhi (program running succesfully), maka akan
dilakukan procedure GetParent(), yang menjalankan proses insert ke tabel Result
untuk semua index di Tabel1 yang menjadi jalur dari goal_state ke state {0,0,0}
berdasarkan informasi parent goal_state yang ada di variabel global i.
d) Langkah terakhir yaitu membaca tabel Result dari index terakhir ke index 1 untuk
memperoleh informasi bagaimana air dipindahkan dari satu jug ke jug lain hingga
memenuhi jug_gol (mencapai goal_state). Prose ini dilakukan oleh procedure
TimerTimer(Sender: TObject) yang disertai simulasi perpindahan nilai kapasitas air.
5. ANALISIS IMPLEMENTASI
Table 2:Table percobaan terhadap 20 kasus water jug
Grafik Perbandingan Suatu Problem Water
Jug Terhadap Waktu
0,12
0,1
0,08
0,06
0,04
0,02
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Grafik 1: Kebutuhan waktu solusi untuk kasus‐kasus di tabel sebelumnya
Dapat dilihat bahwa pertumbuhan kebutuhan waktu dapat meningkat secara signifikan pada
kasus tertentu. Berdasarkan beberapa kali percobaan, dapat disimpulkan bahwa suatu kasus
dalam water jug akan membutuhkan solusi dan waktu yang lebih panjang jika terdapat
perbedaan yang besar antara jug goal dengan jug yang digunakan untuk mengisinya.
Percobaan diatas semuanya complete karena setiap masalah yang diajukan hanya yang
memiliki solusi. Seandai suatu kasus tidak memiliki solusi, maka program secara otomatis
akan memberi pemberitahuan. Menurut pengamatan pula, program akan selalu complete
dengan catatan node yang diperlukan tidak melebihi kapasitas buffer program.
6. KESIMPULAN