• Tidak ada hasil yang ditemukan

Perbandingan Answer Set Programming dan Iterative Deepening Search dalam Menyelesaikan Game N-puzzle

N/A
N/A
Protected

Academic year: 2017

Membagikan "Perbandingan Answer Set Programming dan Iterative Deepening Search dalam Menyelesaikan Game N-puzzle"

Copied!
61
0
0

Teks penuh

(1)

PERBANDINGAN

ANSWER SET PROGRAMMIN

G DAN

ITERATIVE DEEPENING SEARCH

DALAM MENYELESAIKAN

GAME

N-PUZZLE

TEGUH FAJAR NURBIANSYAH

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

INSTITUT PERTANIAN BOGOR

(2)

PERBANDINGAN

ANSWER SET PROGRAMMIN

G DAN

ITERATIVE DEEPENING SEARCH

DALAM MENYELESAIKAN

GAME

N-PUZZLE

TEGUH FAJAR NURBIANSYAH

Skripsi

sebagai salah satu syarat untuk memperoleh gelar

Sarjana Komputer pada

Departemen Ilmu Komputer

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

INSTITUT PERTANIAN BOGOR

(3)

ABSTRACT

TEGUH FAJAR NURBIANSYAH. Application Solver N-puzzle with Answer Set Programming and Iterative Deepening Search. Supervised by MUSHTHOFA.

(4)

Judul Skripsi : Perbandingan Answer Set Programming dan Iterative Deepening Search dalam Menyelesaikan Game N-puzzle

Nama : Teguh Fajar Nurbiansyah NIM : G64086015

Menyetujui:

Dosen Pembimbing

Mushthofa SKom MSc NIP. 19820325 200912 1 003

Mengetahui:

Ketua Departemen Ilmu Komputer Institut Pertanian Bogor

Tanggal Lulus :

(5)

PRAKATA

Alhamdulillaahirabbil ‘aalamiin, segala puji dan syukur penulis panjatkan kepada Allah

Subhanahu wata’ala atas segala curahan rahmat dan karunia-Nya sehingga penelitian ini berhasil diselesaikan. Sholawat dan salam semoga senantiasa tercurah kepada Nabi Muhammad Shalallahu ‘alaihi wassalam, keluarganya, para sahabat, serta para pengikutnya. Karya tulis ini merupakan salah satu syarat memperoleh gelar Sarjana Komputer di Departemen Ilmu Komputer Fakultas Matematika dan Ilmu Pengetahuan Alam (FMIPA). Judul dari karya ilmiah ini adalah Perbandingan Answer Set Programming dan Iterative Deepening Search dalam Menyelesaikan Game N-puzzle.

Penulis juga menyampaikan terima kasih kepada Bapak Mushthofa SKom MSc selaku pembimbing yang telah meluangkan waktu dan tenaganya untuk membimbing penulis, memberikan ilmu-ilmu yang sangat berharga, serta dukungan selama penelitian ini berjalan.

Penyelesaian penelitian ini tidak terlepas dari dukungan dan bantuan berbagai pihak, oleh karena itu penulis ingin mengucapkan terima kasih sebesar-besarnya kepada:

1 Kedua orang tua tercinta Ayahanda Deddy Mulyadi, SE dan Ibunda Eti Rohayati, AmKeb, adik penulis yang bernama Dewi Intan Permata Hati, dan segenap keluarga besar penulis atas do’a, dukungan, semangat, kasih sayang, dan perhatian yang tidak pernah berhenti diberikan selama ini, 2 Bapak Endang Purnama Giri, SKom, MKom dan Ibu Dr Yeni Herdiyeni, SSi, MKom selaku dosen

penguji, atas waktu, ilmu, kesabaran, nasihat, dan masukan yang diberikan,

3 Mutia Fijri Taufani SKom, Riyan Adi Lesmana, Herman Gusti Anugrah, serta teman-teman mahasiswa Sarjana Penyelenggaraan Khusus Ilmu Komputer, Departemen Ilmu Komputer, FMIPA Institut Pertanian Bogor (IPB) khususnya angkatan 3, serta teman-teman lain yang tidak dapat penulis sebutkan satu per satu atas bantuan, motivasi, kebersamaan, serta semangat kepada penulis,

4 Departemen Ilmu Komputer, Bapak/Ibu Dosen dan Tenaga Kependidikan yang telah begitu banyak membantu baik selama pelaksanaan penelitian ini maupun sebelumnya.

Kepada semua pihak lainnya yang telah memberikan kontribusi yang besar selama pengerjaan penelitian ini yang tidak dapat disebutkan satu per satu, penulis ucapkan terima kasih banyak. Segala kesempurnaan hanya milik Allah Subhanahu wata’ala. Semoga hasil penelitian ini dapat bermanfaat,

Amin.

Bogor, Juni 2012

(6)

RIWAYAT HIDUP

Penulis yang bernama Teguh Fajar Nurbiansyah dilahirkan di Jakarta pada tanggal 11 Juli 1987 sebagai anak pertama dari dua bersaudara dari pasangan Bapak Deddy Mulyadi SE dan Ibu Bidan Eti Rochayati AmKeb. Pada tahun 1999, penulis lulus dari SD Negeri Bangka 3, kemudian pada tahun 2002, penulis lulus dari SLTP Negeri 5 Bogor, dan pada tahun 2005, penulis lulus dari SMU Negeri 8 Bogor. Pada tahun yang sama, penulis diterima sebagai mahasiswa di Institut Pertanian Bogor (IPB) pada Program Studi Diploma 3, Program Keahlian Manajemen Informatika, Direktorat Diploma IPB melalui jalur reguler.

(7)

DAFTAR ISI

Halaman

DAFTAR TABEL ... vi

DAFTAR GAMBAR ... vi

DAFTAR LAMPIRAN ... vi

PENDAHULUAN... 1

Latar Belakang... 1

Tujuan Penelitian ... 1

Ruang Lingkup ... 1

Manfaat ... 1

METODE PENELITIAN ... 2

Logic N-puzzle ... 2

Back End... 2

Pembangkitan Soal N-puzzle ... 2

Generate Plan Penyelesaian N-puzzle ... 3

Pembangunan Front End ... 3

Komunikasi ... 4

Arsitektur Sistem ... 4

HASIL DAN PEMBAHASAN ... 4

Domain Masalah dalam DLV ... 4

Encoding dengan DLV ... 4

Menjalankan Model Penyelesaian N-puzzle ... 5

Struktur Data pada C++ ... 6

Penyelesaian N-puzzle dengan C++ ... 6

Hasil Pengujian ... 8

KESIMPULAN DAN SARAN ... 10

Kesimpulan ... 10

Saran ... 11

DAFTAR PUSTAKA ... 11

LAMPIRAN ... 12

(8)

DAFTAR TABEL

Halaman

1 Waktu eksekusi dan kondisi selesai dari teknik ASPdan PP untuk 8-puzzle. ... 9

2 Waktu eksekusi dan kondisi selesai dari teknik ASP dan PP untuk 15-puzzle. ... 9

3 Waktu eksekusi dan kondisi selesai dari teknik ASP dan PP untuk 24-puzzle. ... 9

4 Waktu eksekusi dan kondisi selesai dari teknik ASP dan PP untuk 35-puzzle.... 10

DAFTAR GAMBAR

Halaman

1 Diagram alur langkah penelitian. ... 2

2 Langkah awal pengacakan puzzle. ... 3

3 Langkah pengacakan puzzle. ... 3

4 Langkah pengacakan puzzle. ... 3

5 Arsitektur sistem. ... 4

6 Diagram alur proses N-puzzle. ... 4

7 Soal N-puzzle yang dibangkitkan. ... 4

8 Solusi N-puzzle... 6

9 Menyimpan soal N-puzzle ke array. ... 6

10 Pergerakan N-puzzle. ... 7

11 Pergerakan puzzle pada array... 7

12 Path dari soal sampai solved. ... 8

13 Backtrack dan prioritas langkah berikutnya. ... 8

DAFTAR LAMPIRAN

Halaman

1 Pseudo code program C++ untuk pembangkitan soal N-puzzle. ... 13

2 Program DLV, Pembangkitan kemungkinan gerak pada langkah pertama (T=0). ... 14

3 Program DLV, Pembangkitan kemungkinan gerak pada langkah berikutnya (T>0). ... 15

4 Program DLV, akibat jika terjadi gerakan (move). ... 17

5 Program DLV, kondisi state pada nilai yang tidak bergerak (frame axiom). ... 18

6 Pseudo code program C++, membaca soal N-puzzle yang dibangkitkan. ... 19

7 Pseudo code program C++, memeriksa apakah N-puzzle sudah selesai (solve)... 20

8 Pseudo code program C++, iterasi yang memanggil fungsi menggerakan puzzle. ... 21

9 Hasil Pengujian untuk N-puzzle 3x3 (8-puzzle). ... 22

10 Hasil Pengujian untuk N-puzzle 4x4 (15-puzzle). ... 23

11 Hasil Pengujian untuk N-puzzle 5x5 (24-puzzle). ... 24

12 Hasil Pengujian untuk N-puzzle 6x6 (35-puzzle). ... 25

(9)

PENDAHULUAN

Latar Belakang

N-Puzzle adalah permainan teka-teki untuk mencari langkah agar puzzle yang berisi sekumpulan angka dapat terurut (Kendall et al. 2008). Salah satu cara penyelesaian N-puzzle dilakukan dengan mencari semua kemungkinan langkah yang mencapai solusi. Gambaran yang sangat baik untuk permasalahan N-puzzle dapat direpresentasikan dengan 8-puzzle, 15-puzzle, dan 24-puzzle.

Permainan 8-puzzle mudah untuk diselesaikan sebagai ruang pencarian yang relatif kecil. Teknik *IDA adalah algoritme yang pertama kali berhasil menemukan solusi optimal untuk masalah 15-puzzle. Namun, dengan algoritme ini solusi optimal untuk

24-puzzle tidak dapat dihasilkan dalam waktu yang wajar (Kendall et al. 2008). Mencari solusi untuk N-puzzle dengan langkah paling sedikit telah terbukti NP-Complete (Ratner & Warmuth 1990).

Pencarian semua kemungkinan solusi dapat menyebabkan kompleksitas dari algoritme penyelesaiannya menjadi eksponensial. Hal tersebut bergantung pada ukuran puzzle. Permasalahan pencarian solusi seperti ini disebut Nondeterministic Polynomial-time Complete (NP-Complete) (Cormen et al.2001).

Penyelesaian N-puzzle pada komputer yang dilakukan dengan paradigma teknik pemrograman imperatif atau prosedural

menjadi cukup sulit. Hal tersebut disebabkan

programmer harus memberikan sekumpulan perintah langkah-langkah yang harus dilakukan komputer secara detail, mulai dari menerima masukan, menentukan struktur data, banyaknya looping, pemanggilan fungsi, sampai proses perhitungan dilakukan. Perintah-perintah tersebut akan dieksekusi baris per baris secara berurutan oleh komputer. Hal tersebut menyebabkan kode program menjadi panjang dan rumit.

Iterative deepening search (IDS) merupakan salah satu teknik pemrograman dengan paradigma imperatif. IDS menggabungkan optimalisasi breadth-first search (BFS) dengan depth-first search (DFS) yang beroperasi dengan batas pencarian yang diperpanjang secara berturut-turut (Reinefed & Marsland 1993).

Untuk itu, penulis mencoba membangun

N-puzzlesolver dengan menggunakan answer set programming (ASP) sebagai pendekatan yang berbeda dengan IDS. Penulis bermaksud membandingkan ASP dan IDS berdasarkan kinerja model penyelesaian yang dibangun. Hal-hal yang menjadi pertimbangan adalah tingkat kesulitan kontrol pada kode program, panjang-pendeknya kode program, waktu eksekusi, dan kemampuan menyelesaikan

puzzle (selesai atau tidak).

ASP sendiri merupakan teknik pemrogaman berorientasi deklaratif untuk pencarian solusi pada permasalahan yang sulit (Lifschitz 2008). ASP hanya menggunakan ekspresi logika untuk membuat model penyelesaian suatu permasalahan.

Tujuan Penelitian

Penelitian ini bertujuan membuat model untuk penyelesaian game N-puzzle masing-masing memanfaatkan ASP dan IDS. Selanjutnya, penelitian ini akan membandingkan kinerja dari model-model penyelesaian tersebut.

Ruang Lingkup

Ruang lingkup permasalahan pada penelitian ini adalah:

1 Model penyelesaian ASP dibuat dengan

datalog with disjunction (DLV) dan model penyelesaian IDS menggunakan C++. 2 Pembangkitan soal N-puzzle dan

antarmuka dibuat dengan PHP.

3 Soal N-puzzle yang dibangkitkan dengan bentuk n x n, di antaranya 3-puzzle,

8-puzzle, 15-puzzle, dan 24-puzzle.

4 Ukuran perbandingan yang digunakan adalah kemampuan dan kecepatan solver

dalam menemukan solusi. Kecepatan

solver dihitung berdasarkan waktu penyelesaiannya.

Manfaat

Manfaat penelitian ini adalah menunjukkan bahwa ASP bisa menyelesaikan masalah NP-Complete pada N-puzzle

sebagaimana imperative programming dapat melakukannya. Diharapkan model penyelesaian dengan ASP dapat mencari path

(10)

METODE PENELITIAN

Pembangunan Back end

Pembangunan Front end

Studi Literatur

Logika N-puzzle

Representasi

Logika Algoritme IDS

Encoding Implementasi C++

DLV Solver IDS Solver

Pembangkitan Soal N-puzzle

Pengujian dengan DLV Pengujian dengan IDS Analisa Hasil Pengujian Perbandingan Solusi yang dihasilkan

Gambar 1 Diagram alur langkah penelitian. Logic N-puzzle

Seperti pada Gambar 1, bagian logic N-puzzle merupakan elemen paling penting dalam penelitian ini. Bagian ini menerapkan aturan-aturan yang diizinkan pada permainan ini ke pembangkitan dan penyelesaian N-puzzle. Berikut adalah aturan-aturan logic dari

N-puzzle:

1 N-puzzle berbentuk segi n atau n x n grid, dengan N = n2 -1.

2 N-puzzle terdiri dari N kotak bernilai 1 sampai N dan 1 buah kotak bernilai 0. 3 Pada pergerakan N-puzzle, hanya kotak

bernilai 0 yang dapat bertukar dengan salah satu kotak yang adjacent

dengannya.

4 Bergantung pada posisinya, kotak bernilai 0 memiliki dua, tiga, atau empat kotak yang adjacent.

5 Pada langkah pertama, kotak bernilai 0 dapat bergerak ke salah satu dari semua kotak yang adjacent dengannya.

6 Jika waktu sekarang adalah T, pada langkah ke T+1 kotak bernilai 0 tidak boleh kembali ke posisi ketika kotak bernilai 0 berada pada waktu T-1 (tidak boleh kembali secara langsung).

7 Kondisi selesai (solve) adalah N-puzzle

sudah terurut dari 1 sampai N dan kotak bernilai 0 ada di posisi n2 (kanan bawah).

Back End

Bagian back end akan melakukan proses pembangkitan dan penyelesaian permainan N-puzzle. Secara lebih spesifik, back end akan terdiri atas empat modul, yaitu:

1 Modul generate soal: membangkitkan soal

N-puzzle dengan menspesifikasikan kondisi awal puzzle.

2 Modul logic: menangani aturan dan mekanisme berjalannya permainan N-puzzle.

3 Modul generate plan: mencari penyelesaian dari N-puzzle. Pada modul ini, akan ada strategi yang diterapkan untuk menyelesaikan N-puzzle.

4 Modul output: menuliskan ouput

penyelesaian N-puzzle untuk komunikasi ke bagian front end.

Pembangkitan Soal N-puzzle

Pembangkitan soal N-puzzle bergantung pada ukuran puzzle dan banyaknya langkah pengacakan. Soal yang akan dibangkitkan adalah puzzle yang harus bisa diselesaikan atau dijamin terdapat solusi. Langkah pengacakan puzzle harus memenuhi aturan

logic permainan N-puzzle. Berikut adalah aturan langkah pembangkitan soal N-puzzle: 1 Membuat N-puzzle yang sudah selesai

(solve) berdasarkan ukuran yang dipilih. 2 Langkah pengacakan puzzle dilakukan

dengan menukar 0 dengan salah satu kotak yang adjacent dengan posisi 0.

3 Banyaknya arah yang dituju yang tersedia bisa dua, tiga, atau empat bergantung pada posisi 0 dan adjacent yang tersedia.

4 Tujuan pergerakan 0 ke kotak yang

adjacent dengannya dilakukan dengan pengacakan terhadap arah 0 yang dapat dituju.

5 Pada langkah berikutnya, langkah kembali ke posisi sebelumnya tidak boleh dilakukan.

6 Lakukan langkah pengacakan puzzle

berdasarkan banyaknya langkah pengacakan puzzle yang dipilih.

Berikut contoh pembangkitan N-puzzle

dengan n=3 dan pengacakan puzzle sebanyak 3 langkah:

1 Mengacak dua arah yang tersedia (semua

(11)

Gambar 2 Langkah awal pengacakan puzzle. 2 Mengacak dua arah yang tersedia karena

tidak boleh kembali ke satu langkah sebelumnya. Pada Gambar 3 di bawah ini, hasil pengacakan arah adalah ke atas.

Gambar 3 Langkah pengacakan puzzle. 3 Mengacak tiga arah yang tersedia karena

tidak boleh kembali ke satu langkah sebelumnya. Pada Gambar 4 di bawah ini, hasil pengacakan arah adalah ke kanan.

Gambar 4 Langkah pengacakan puzzle. Generate Plan Penyelesaian N-puzzle

Generate plan akan menerapkan strategi untuk mencari solusi yang dapat menyelesaikan permasalahan N-puzzle. Dalam kasus ini, solusi adalah pencarian langkah menuju kondisi selesai (solve). Strategi yang diterapkan tetap harus dapat memenuhi logic

dari permainan N-puzzle. Generate plan akan mencari semua kemungkinan gerak yang diizinkan logic N-puzzle dan menghitung langkah menuju solusi. Jika satu solusi sudah ditemukan, pencarian akan dihentikan.

Pada ASP, representasi logika dan strategi pendekatan yang digunakan untuk menyelesaiakan masalah adalah guess and check (Musthofa 2010). Penerapan guess and check untuk pencarian solusi pada N-puzzle

adalah sebagai berikut:

1 Guess: ASP akan menebak semua kemungkinan path yang menjadi kandidat solusi. Penebakan dilakukan berdasarkan kemungkinan arah gerak dari nilai 0 dengan memanfaatkan disjungsi. Hal ini

akan terus dilakukan selama puzzle belum

solve.

2 Check: ASP akan memeriksa semua kandidat solusi yang ditebak dengan memanfaatkan constraint. Kandidat solusi yang tidak diinginkan akan digugurkan oleh constraint. Dalam hal ini, semua path

yang tidak mencapai solusi dieliminasi sehingga solusi yang dihasilkan adalah solusi yang benar, yaitu path yang mencapai kondisi solve.

Model penyelesaian dengan ASP dibuat pada DLV. DLV adalah tool untuk mengomputasi answer set yang mengimplementasikan pemrograman logika disjungsi dengan menggunakan semantik

answer set (Gelfond & Lifschitz 1991).

Komputasi DLV adalah sound and complete. Maksud dari sound adalah solusi yang dihasilkan oleh DLV merupakan solusi yang benar, sedangkan maksud dari complete

adalah semua solusi yang benar harus muncul. Algoritme iterative deepening search

(IDS) digunakan sebagai strategi pembanding. IDS dibuat dengan menggunakan bahasa pemrograman C++. Ide dasar algoritme IDS adalah melakukan DFS dengan batas pencarian yang diperpanjang oleh kedalaman

tree. Dengan pendekatan iterative, IDS dijamin menemukan solusi shortest path, seperti pada BFS (Reinefed & Marsland 1993). Pencarian Solusi dengan IDS adalah sebagai berikut:

1 Mendeteksi posisi 0 saat ini.

2 Mengunjungi semua node (adjacent) yang bisa dikunjungi menggunakan cara DFS dengan kedalaman tertentu.

3 Jika belum menemukan solusi (mencapai kondisi solve), lakukan kembali langkah nomor 2 dari awal dengan kedalaman ruang pencarian yang diperpanjang secara berturut-turut setiap pemanggilannya. Pembangunan Front End

Front end akan dibangun menggunakan PHP dan JavaScript. Fungsi utama bagian

front end adalah sebagai graphic user interface (GUI). Bagian front end terdiri atas tiga modul, yaitu:

(12)

2 Modul permainan untuk user akan menampilkan graphic user interface

berupa soal N-puzzle yang dapat dimainkan oleh user dan solusinya.

3 Modul untuk pengujian akan menampilkan soal yang dibangkitkan, solusi yang dihasilkan, dan waktu penyelesaiannya. Komunikasi

Bagian komunikasi akan mengodekan (encode) problem menjadi input untuk back end dan harus mengodekan kembali output

dari backend menjadi representasi N-puzzle. Modul komunikasi akan dibangun dengan PHP.

Arsitektur Sistem

Komunikasi Back end

logic Front end GUI Generate soal Generate plan Generate problems N-puzzle (pilih ukuran dan pengacakan) output Pengujian N-puzzle Parser

Gambar 5 Arsitektur sistem.

Arsitektur sistem pada Gambar 5 terdiri atas tiga bagian yaitu, back end, front end, dan modul komunikasi. Back end untuk pembangkitan soal dikerjakan oleh PHP. Sedangkan untuk penyelesaian akan dikerjakan oleh DLV dan C++. Berdasarkan arsitektur sistem di atas, diagram alur proses

N-puzzle sampai menghasilkan solusi dapat di lihat pada Gambar 6.

Pembangkitan soal N-puzzle

Pilih ukuran N-puzzle Pilih jumlah pengacakan Generate.php Soal.dat N-puzzle solver Npuzzle.txt (DLV) solve5.cpp (solve5.exe) solve10.cpp (solve.exe) solve15.cpp (solve15.exe) Idsgame.php (fungsi exec) N-puzzle solved GUI Parsing output

dari solver

Menampilkan hasil parsing

ke bentuk representasi

N-puzzle

Pengujian

Gambar 6 Diagram alur proses N-puzzle.

HASIL DAN PEMBAHASAN

Banyaknya arah bergerak untuk nilai 0 bergantung pada banyaknya adjacent dari nilai 0 tersebut. Selain itu, pergerakan N-puzzle tidak boleh kembali pada satu langkah tepat sebelumnya karena akan jadi gerakan yang percuma. Pembangkitan soal dimulai dari puzzle yang solve. Node yang dikunjungi akan dipilih secara random dari adjacent yang tersedia. Pseudo code dari pembangkitan N-puzzle lihat pada Lampiran 1. Penyelesaian N-puzzle dilakukan dengan dua cara yaitu

answer set programming (ASP) dengan DLV dan iteration deepening search (IDS) dengan C++.

Domain Masalah dalam DLV

Posisi sebuah nilai pada N-puzzle

direpresentasikan dengan predikat at(T,N,X,Y). T menunjukkan waktu dari sebuah nilai N pada posisi dengan koordinat X,Y pada grid. Pada soal N-puzzle variabel T dimulai dari 0 dan akan bertambah sampai dengan waktu N-puzzle selesai (solve). Variabel N akan berisi nilai 0 sampai N pada

N-puzzle. Variabel X dan Y bergantung pada ukuran puzzle. Soal N-puzzle yang dibangkitkan dibentuk menjadi himpunan predikat at dan menjadi fakta awal untuk permasalahan N-puzzle. Sebagai contoh soal

N-puzzle dengan ukuran 3x3 seperti pada Gambar 7.

Gambar 7 Soal N-puzzle yang dibangkitkan. Soal N-puzzle pada Gambar 7 dikodekan ke dalam bentuk predikat seperti berikut :

at(0,1,1,1). at(0,2,2,1). at(0,3,3,1). at(0,4,1,2). at(0,6,2,2). at(0,0,3,2). at(0,7,1,3). at(0,5,2,3). at(0,8,3,3).

Pergerakan angka 0 pada N-puzzle akan direpresentasikan dengan predikat move(T,X,Y) pada waktu T angka 0 akan bergerak ke koordinat X,Y.

Encoding dengan DLV

(13)

DLV. Guess akan menebak semua kandidat solusi. Untuk menebak semua kandidat solusi kita mulai dengan mendefinisikan ruang pencarian yang memenuhi logic dari N-puzzle. Waktu melangkah, posisi nilai 0, kotak yang

adjacent dengannya, dan kondisi puzzle akan menentukan ruang pencarian.

Langkah pertama dan langkah-langkah berikutnya akan memiliki ruang pencarian yang berbeda. Pada langkah pertama, N-puzzle

memiliki node tujuan sebanyak dua, tiga, atau empat tergantung pada jumlah adjacent dari nilai 0, sedangkan pada langkah berikutnya N-puzzle memiliki : node tujuan = adjacent – 1. Selain itu, pada langkah selanjutnya kondisi

puzzle menjadi pertimbangan untuk melakukan langkah atau berhenti (selesai), sedangkan pada langkah pertama tidak. Hal ini disebabkan puzzle yang dibangkitkan tidak mungkin sudah solve dari awal.

Jika posisi 0 seperti pada soal di Gambar 7, contoh aturannya sebagai berikut:

move(1,2,2) v move(1,3,1) v

move(1,3,3) :- at(0,0,3,2).

Aturan di atas menjelaskan jika nilai 0 berada di sisi kanan puzzle dengan koordinat (3,2), nilai 0 memiliki tiga kemungkinan gerak, yaitu ke kiri (2,2), ke atas (3,1), dan ke bawah (3,3). Kode aturan gerakan pada langkah pertama yang lebih lengkap dapat dillihat pada Lampiran 2. Pada posisi yang sama, jika sebelumnya nilai 0 bergerak dari bawah (3,3) ke posisi tersebut (3,2), program akan memeriksa apakah puzzle sudah

solve atau belum. Jika puzzle sudah solve, tidak akan melakukan langkah lagi dan program akan berhenti. Namun, jika puzzle

belum solve, kemungkinan gerak nilai 0 tinggal ke kiri (2,2) atau ke atas (3,1). Kode aturan gerakan pada langkah berikutnya dapat dillihat pada Lampiran 3. Berikut adalah contoh aturannya :

move(2,2,2) v move(2,3,1) :-

at(1,0,3,2), at(0,0,3,3), not

solved(1).

Selanjutnya, menentukan aturan pertukaran posisi 0 akibat terjadi suatu pergerakan. Jika pada aturan di atas menghasilkan move(2,2,2), nilai 0 akan bertukar posisi dengan nilai N yang pada T=1 berada di posisi 2,2. Kode aturan pertukaran posisi nilai 0 dapat dillihat pada Lampiran 4. Berikut adalah contoh bentuk aturannya:

at(2,0,2,2) :- at(1,0,3,2),

at(1,N,2,2), move(2,2,2).

at(2,N,3,2) :- at(1,0,3,2),

at(1,N,2,2), move(2,2,2).

Selain itu, kita juga harus membuat aturan

frame axiom. Frame axiom berfungsi untuk menentukan kondisi state pada langkah selanjutnya untuk nilai-nilai yang tidak bergerak. Program akan terus menentukan

frame axiom selama kondisi puzzle belum

solve. Namun, jika puzzle sudah solve

program akan berhenti menetukan frame axiom. Kode aturan frame axiom dapat dillihat pada Lampiran 5. Pada kasus di atas, contoh aturannya sebagai berikut :

at(2,N,3,1) :- at(1,0,3,2),

at(1,N,3,1), not move(2,3,1),not

solved(1).

Bagian terpenting dari logika adalah kita harus menentukan tujuan dari pencarian. Program dinyatakan selesai (solve) jika sudah mencapai tujuan pada waktu T. Berikut adalah aturan pada DLV untuk kondisi selesai (solve):

solvedt :- solved(T).

Kondisi solved(T) adalah tujuan dari program, yaitu ketika N-puzzle sudah terurut. Kondisi solved(T) dibangkitkan berdasarkan ukuran puzzle dari soal yang dibangkitkan. Berikut adalah kondisi yang dibangkitkan untuk soal pada Gambar 7 di atas:

solved(T) :- at(T,1,1,1), at(T,2,2,1),

at(T,3,3,1), at(T,4,1,2), at(T,6,2,2),

at(T,0,3,2), at(T,7,1,3), at(T,5,2,3),

at(T,8,3,3).

Setelah guess menebak semua kandidat solusi, check akan memeriksa semua kandidat solusi yang dihasilkan dengan menggunakan

constraint. Constraint akan menghapus

answer set yang tidak memenuhi syarat. Pada

N-puzzle, semua path langkah yang tidak menemukan kondisi selesai (solve) akan digugurkan, constraint akan ditulis sebagai berikut:

:- solvedt.

Menjalankan Model Penyelesaian N-puzzle

(14)

dan kondisi yang akan di tulis pada file

soal.dat:

#maxint=8.

pos(1..3). angka(0..8). n(3). at(0,1,1,1). at(0,2,2,1). at(0,3,3,1). at(0,4,1,2). at(0,6,2,2). at(0,0,3,2). at(0,7,1,3). at(0,5,2,3). at(0,8,3,3).

solved(T) :- at(T,1,1,1), at(T,2,2,1),

at(T,3,3,1), at(T,4,1,2),

at(T,6,2,2), at(T,0,3,2),

at(T,7,1,3), at(T,5,2,3),

at(T,8,3,3).

Fakta di atas diproses bersama dengan model penyelesaian pada file Npuzzle.txt oleh DLV. Output yang diminta hanya path

langkah menuju solusi dan jumlah langkahnya. Berikut adalah eksekusi program DLV untuk soal pada Gambar7 :

C:\solver>dlv.mingw.tgh soal.dat

Npuzzle.txt –nofacts –filter = move, solved –silent

{move(1,2,2), move(2,2,3),

move(3,3,3), solved(3)}

Answer set di atas diterjemahkan kembali menjadi sebuah bentuk representasi N-puzzle

seperti pada Gambar 8.

Gambar 8 Solusi N-puzzle. Struktur Data pada C++

Ukuran N-puzzle yang dipilih disimpan dalam file ukuran.dat dan soal N-puzzle

yang dibangkitkan disimpan dalam file

imperatif.dat. Soal N-puzzle yang

dibangkitkan akan ditulis dengan format berikut: Nilai1 Nilai2 Nilai3 ... NilaiN

Sebagai contoh, penulisan soal N-puzzle

pada Gambar 7 memiliki ukuran puzzle adalah 3 dan soal akan ditulis ke file

imperatif.dat seperti berikut :

1 2 3 4 6 0 7 5 8

Penyelesaian N-puzzle dengan C++

Sama seperti DLV, program penyelesaian

N-puzzle menggunakan C++ juga harus menerapkan logic dari N-puzzle. Pada C++, program dibuat dengan tiga buah fungsi, yaitu fungsi utama yang akan mengambil soal dan ukuran dari file, fungsi untuk memeriksa kondisi solve puzzle, dan fungsi untuk menggerakan puzzle. Program akan dimulai dengan membuka file ukuran.dat dan imperatif.dat untuk mendapatkan ukuran dan soal puzzle. Pseudo code untuk mendapatkan ukuran dan soal dapat dilihat pada Lampiran 6.

Ukuran dan soal puzzle yang didapat menjadi input untuk program ini. Ukuran

puzzle dikonversi dari sebuah string menjadi

integer dan disimpan dalam sebuah variabel. Dengan cara yang sama, semua nilai pada soal

N-puzzle akan disimpan ke dalam array satu dimensi. Penyimpanan nilai puzzle dan posisinya pada array dapat dilihat pada Gambar 9.

Pada Gambar 9, posisi nilai pada N-puzzle

diwakili indeks pada array, dengan indeks

array dimulai dari 1. Langkah berikutnya program akan memeriksa puzzle sudah solve

atau belum. Untuk memeriksa kondisi solve puzzle program akan menghitung jumlah jarak setiap posisi nilai saat konfigurasi puzzlesolve

terhadap posisi nilai pada konfigurasi saat ini. Berikut ini adalah rumus untuk memeriksa kondisi solvepuzzle:

∑ |[nilai saat solve] – [posisi nilai saat ini]|

Posisi nilai saat ini dapat menggunakan nilai dari array. Pengecualian terjadi jika nilai

array adalah 0, nilai 0 diganti menjadi banyaknya indeks pada array. Banyaknya indeks pada array adalah ukuran*ukuran. Misal untuk puzzle dengan ukuran 3 x 3, nilai 0 akan diganti menjadi 9, sedangkan nilai saat

solve adalah indeks dari array untuk posisi nilai tersebut.

Gambar 9 Menyimpan soal N-puzzle ke

(15)

Jika total perhitungan tersebut bernilai 0,

puzzle sudah solve dan program selesai, namun jika hasilnya lebih besar dari 0, puzzle

belum terurut (not solve). Pseudo code untuk memeriksa kondisi solve array dapat dilihat pada Lampiran 7. Sebagai contoh untuk penjelasan perhitungan di atas, digunakan kondisi puzzle pada Gambar 9 :

Hitsolve = |1-1| + |2-2| + |3-3| + |4-4| + |5-6| + |6-9| + |7-7| + |8-5| + |9-8|

= 0 + 0 + 0 + 0 + 1 + 3 + 0 + 3 + 1 = 8

Hasil perhitungan di atas akan disimpan ke sebuah variabel. Anggap saja nama variabel tersebut adalah Hitsolve. Perhitungan di atas menghasilkan nilai yang lebih besar dari 0, sehingga puzzle dinyatakan belum terurut (not solve). Ketika puzzle belum terurut, program akan mencari path menuju goal state dari N-puzzle dengan teknik iterative deepening search (IDS).

Fungsi utama akan memanggil fungsi yang bertugas menggerakan puzzle dengan parameter array dari puzzle, node tempat nilai 0 berada, node sebelumnya, ukuran puzzle, kedalaman ruang pencarian, status langkah (jika belum melangkah status langkahnya 0), dan kondisi puzzle.

Selanjutnya, dengan fungsi yang menggerakan puzzle tersebut program akan melakukan pencarian path yang menuju solusi menggunakan teknik depth-first search (DFS) dengan kedalaman yang dibatasi. Sesuai logic, pergerakan posisi 0 bergantung dari posisinya pada puzzle, banyaknya adjacent, langkah sebelumnya, dan kondisi puzzle. Pada langkah pertama, karena belum melangkah pergerakan 0 tidak dipengaruhi oleh langkah sebelumnya.

Fungsi yang menggerakan puzzle ini menerapkan prioritas penentuan arah langkah gerakan 0. Prioritas ini menentukan arah yang lebih dulu dituju oleh nilai 0. Arah yang tersedia bergantung pada adjacent dari posisi 0 dan langkah pertama atau bukan.

Gambar 10 Pergerakan N-puzzle.

Berdasarkan arah yang tersedia, pertama 0 diprioritaskan bergerak ke kanan, jika tidak menemukan tujuan setelah bactrack prioritas kedua 0 bergerak ke bawah, jika masih belum menemukan tujuan prioritas setelah bactrack

prioritas berikutnya 0 bergerak ke kiri, dan terakhir ke atas.

Prioritas berikutnya dilakukan jika pada pencarian pada prioritas sebelumnya tidak menemukan tujuan walaupun sudah mencapai batas kedalaman yang ditentukan dan kembali ke node sebelumnya (setelah bactrack dari prioritas sebelumnya). Seperti pada Gambar 10 di atas, prioritas bergerak 0 adalah ke bawah dulu, lalu ke kiri, dan terakhir ke atas. Pergerakan ke kanan tidak tersedia karena posisi 0 pada puzzle adalah sisi paling kanan.

Sesuai gerakan 0 pada puzzle, posisi 0 pada array juga berubah berdasarkan pertukaran dengan adjacent dari posisi 0 pada

puzzle. Jika posisi 0 ada pada indeks i,dan n

adalah ukuran N-puzzle, pergerakan ke kanan posisi 0 akan bertukar dengan nilai yang berada pada indeks i+1 pada array, pergerakan ke bawah akan bertukar dengan nilai yang berada pada indeks i+n pada array, pergerakan ke kiri akan bertukar dengan nilai yang berada pada indeks i-1 pada array, dan pergerakan ke atas akan bertukar dengan nilai yang berada pada indeks i-n pada array. Jika 0 bergerak ke bawah seperti pada Gambar 10, posisi nilai pada array akan berubah seperti pada Gambar 11.

Pada Gambar 11, posisi 0 yang sebelumnya pada indeks 6 di array, setelah pada puzzle posisi 0 bergerak ke bawah, nilai 0 akan berpindah posisi ke indeks 9 pada

array. Posisi nilai 8 yang sebelumnya berada pada indeks ke 9 berpindah ke indeks 6 yang sebelumnya ditempati nilai 0.

Fungsi yang menggerakan puzzle ini bersifat rekursif karena setelah melangkah (menggerakan posisi 0) fungsi ini akan memanggil dirinya sendiri dengan kondisi

puzzle setelah melangkah untuk melakukan langkah berikutnya. Kondisi puzzle setelah melangkah meliputi posisi 0 saat ini, posisi 0 sebelumnya, nilai yang adjacent, dan kondisi

puzzle.

(16)

Berikut adalah pseudo code untuk prioritas langkah dan pemanggilan dirinya sendiri: IF adjacent right available and not previous THEN

Go to adjacent right Increment step Call this function

ELSE IF adjacent down available and not previous THEN

Go to adjacent down Increment step Call this function

ELSE IF adjacent left available and not previous THEN

Go to adjacent left Increment step Call this function

ELSE IF adjacent up available and not previous THEN

Go to adjacent up Increment step Call this function END IF

Jika posisi 0 berada di indeks paling akhir pada array, program akan memeriksa kondisi

puzzle sudah solve atau belum. Berikut adalah

pseudo code jika posisi 0 berada di indeks paling akhir pada array:

IF position of 0 is number of puzzle THEN

Cek solve

IF puzzle solve THEN puzzle solved print

END THIS function ELSE

backtrack END IF END IF

Jika puzzle sudah solve, program akan mencetak array (konfigurasi puzzle) saat di

node tersebut dan kembali ke super function

(fungsi yang memanggil fungsi ini) untuk mencetak konfigurasi array-array sebelumnya sampai konfigurasi array soal, sehingga akan terbentuk path yang memiliki solusi dan program selesai seperti pada Gambar 12.

Gambar 12 Path dari soal sampai solved.

Namun, jika puzzle belum solve dan sudah melakukan pencarian sampai batas kedalaman, program akan melakukan

backtrack ke langkah sebelumnya (super function) untuk melakukan langkah pada prioritas berikutnya. Jika pada langkah sebelumnya prioritas pertama 0 bergerak ke semua node di kanan dan buntu, setelah

bactrack langkah yang dilakukan berdasarkan prioritas berikutnya (bukan ke kanan). Sebagai contoh, jika pada Gambar 9 nilai 0 bergerak ke bawah lalu buntu, setelah melakukan backtrack, puzzle akan melakukan langkah ke kiri seperti pada Gambar 13.

Gambar 13 Backtrack dan prioritas langkah berikutnya.

Teknik iteration (iterasi) dari IDS diterapkan pada fungsi utama yang memanggil fungsi untuk menggerakan puzzle

berkali-kali dengan batas kedalaman yang bertambah secara berturut-turut. Setiap fungsi utama memanggil fungsi ini kondisi puzzle

dimulai dari kondisi awal (soal puzzle).

Pseudo code untuk memanggil fungsi yang menggerakan puzzle dapat dilihat pada Lampiran 8. Namun, jika sudah melakukan teknik iterasi sampai batas maksimal kedalaman yang ditentukan tapi masih belum menemukan path yang mencapai solusi, program model penyelesaian N-puzzle dengan pemrograman IDS dinyatakan not solved. Hasil Pengujian

Pengujian dilakukan dengan cara membangkitan masing-masing 10 soal N-puzzle untuk ukuran 3 x 3 (8-puzzle), 4 x 4 (15-puzzle), dan 5 x 5 (24-puzzle). Sebagai tambahan, untuk perbandingan dilakukan pengujian untuk puzzle ukuran 6 x 6

(17)

penelitian ini dapat menyelesaikan semua ukuran N-puzzle.

Model penyelesaian yang digunakan adalah model penyelesaian permainan N-puzzle dengan DLV yang menggunakan

answer set programming dibandingkan dengan model penyelesaian yang menggunakan teknik iterative deepening search dengan kedalaman maksimal 5, 10, dan 15. Semua soal yang dibangkitkan tersebut digunakan untuk menguji semua model penyelesaian yang dibangun. Pengujian dilakukan sampai solusi ditemukan atau sudah mengunjungi seluruh ruang pencarian sampai batas kedalaman yang ditentukan. Selain menguji pencarianmencapai solusi atau tidak, akan dihitung waktu eksekusi (satuan detik) beserta waktu rata-rata penyelesaian dari setiap solver untuk setiap ukuran. Waktu rata-rata penyelesaian hanya dihitung dari waktu eksekusi solver yang mencapai solusi. Hasil pengujian waktu model penyelesaian dituliskan pada Tabel 1, Tabel 2, Tabel 3, dan Tabel 4.

Tabel 1 Waktu eksekusi dan kondisi selesai dari teknik ASP dan IDS untuk

8-puzzle

Untuk 10 soal 8-puzzle yang dibangkitkan dengan jumlah langkah pengacakan yang berbeda, model penyelesaian (solver) dengan ASP (menggunakan DLV) dapat menyelesaikan seluruhnya. Model penyelesaian IDS dengan kedalaman pencarian 5 (IDS5) hanya mampu menyelesaikan 2 soal, yaitu soal dengan langkah pengacakan 4 dan 5 (acak 4 dan 5). Sedangkan model penyelesaian IDS dengan kedalaman pencarian 10 (IDS10) hanya mampu menyelesaikan 5 soal, yaitu 2 soal dengan langkah pengacakan 6 , dan masing-masing 1 soal dengan langkah pengacakan 4,5, dan 8. Model penyelesaian IDS dengan kedalaman pencarian 15 (IDS15) dapat menyelesaikan seluruh langkah pengacakan soal berada pada selang 1 sampai 15. Waktu

rata-rata dihitung hanya dari waktu pencarian yang menemukan solusi.

Tabel 2 Waktu eksekusi dan kondisi selesai dari teknik ASP dan IDS untuk

15-puzzle

Dari 10 soal 15-puzzle yang dibangkitkan, seluruhnya dapat diselesaikan dengan DLV dan IDS15. Sementara model IDS5 hanya berhasil menyelesaikan 1 soal dengan acak 5. Model IDS10 hanya berhasil menyelesaiakan 6 soal, yaitu 4 soal dengan acak 10 dan masing-masing 1 soal dengan acak 5 dan 6. Kemudian waktu rata-rata didapat dengan menghitung rata-rata dari waktu eksekusi yang berhasil menemukan solusi. Hal tersebut menyebabkan waktu rata-rata IDS5 hanya dihitung dari 1 waktu penyelesaian yang berhasil menemukan solusi pada langkah ke 5. Tabel 3 Waktu eksekusi dan kondisi selesai dari teknik ASP dan IDS untuk

24-puzzle

(18)

15. Sementara model IDS5 hanya mampu menyelesaikan 3 soal yang langkah pengacakan untuk pembangkitannya sebanyak 5 langkah atau lebih rendah. Model IDS10 hanya dapat menyelesaikan 6 soal dengan langkah pengacakan masing-masing 5, 10, 5, 10, 8, dan 3. Waktu rata-rata dihitung hanya dari waktu pencarian yang menemukan solusi. Tabel 4 Waktu eksekusi dan kondisi selesai

dari teknik ASP dan IDS untuk

35-puzzle

Dari 10 soal 35-puzzle yang dibangkitkan, seluruhnya dapat diselesaikan dengan DLV dan IDS15. Sama seperti pada 24-puzzle, beberapa solusi pertama yang dimunculkan model DLV dapat menyelesaikan soal-soal tersebut dengan jumlah langkah menuju

solved yang lebih besar dari 15 langkah, sedangkan model IDS15 menyelesaikan soal tersebut dengan jumlah langkah yang lebih kecil atau sama dengan 15 langkah. Model IDS5 hanya mampu menyelesaikan 3 soal dengan acak 3, 2, dan 5. Model IDS10 hanya mampu menyelesaikan 6 soal, yaitu 3 soal yang bisa diselesaikan ids5 ditambah 3 soal dengan acak 10. Waktu rata-rata dihitung hanya dari waktu pencarian yang menemukan solusi.

Untuk melihat hasil pengujian lebih lengkap yang disertai perbandingan penggunaan memori antara DLV dan IDS dapat dilihat pada Lampiran 9, Lampiran 10, Lampiran 11, dan Lampiran 12. Selain itu, pada hasil pengujian yang di tampilkan pada Lampiran 9, Lampiran 10, Lampiran 11, dan Lampiran 12 disertakan perhitungan banyaknya node yang dikunjungi dengan teknik IDS sampai dengan solve.

Sesuai dengan tujuan dari penelitian yaitu membuat dan membandingkan model penyelesaian untuk N-puzzle dengan answer set programming (ASP) dan iterative deepening search (IDS), hasil penelitian menunjukan keduanya memiliki keunggulan dan kekurangan. Hal ini bergantung pada

ukuran keunggulannya. Kelebihan ASP adalah kita tidak perlu menentukan kedalaman ruang pencarian. Model penyelesaian dengan DLV dapat menyelesaiakan soal N-puzzle untuk semua jenis pengacakan. Hal ini cukup berpengaruh karena saat soal dibangkitkan kita tidak mengetahui pada langkah ke berapa soal puzzle bisa mencapai solve. Model penyelesaian dengan IDS yang menggunakan C++ tidak dapat menyelesaiakan soal yang jumlah pengacakannya lebih besar dari kedalaman ruang pencarian.

Pola untuk pencarian path yang mencapai solusi pada ASP tidak hanya satu karena mengandalkan guess and check, sedangkan pada C++ pola pencariannya hanya satu dengan memanfaatkan prioritas dan teknik IDS. Namun akibatnya ASP memiliki waktu penyelesaian yang lebih besar dari waktu penyelesaian dengan IDS.

KESIMPULAN DAN SARAN

Kesimpulan

Answer Set Programming (ASP) akan menyelesaikan N-puzzle seperti cara berpikir manusia dengan mengodekan program ke dalam bahasa logika. ASP akan menebak semua kemungkinan path menuju solusi, lalu memeriksa semua path yang ditebak mencapai solusi atau tidak, sedangkan pada Iterative Deepening Search (IDS), programmer harus menuliskan perintah-perintah yang akan mengendalikan operasi yang akan dikerjakan oleh komputer.

Model penyelesaian yang dibuat dengan ASP terbukti lebih singkat dari pada model penyelesaian dengan imperative programming. Untuk menyelesaiakan N-puzzle, ASP hanya terdiri atas 33 baris aturan dengan disjungsi untuk arah gerak nilai 0, 4 baris aturan yang mengatur pertukaran antara nilai 0 dan adjacent yang dituju, 1 baris yang mengatur nilai yang tidak bergerak (frame axiom), 2 baris aturan solve dan 1 baris

constraint. Untuk menyelesaikan masalah yang sama, IDS perlu sekitar 1900 baris kode program C++. Perhitungan baris kode program pada C++ tersebut sudah termasuk komentar dan spasi.

(19)

pengacakannya lebih besar dari tingkat kedalaman pencarian.

Pada ASP, kontrol terhadap alur program dilakukan oleh mesin solver dari DLV. Hal ini membuat ASP dapat membangkitkan beberapa path berbeda menuju solusi, namun menyebabkan waktu eksekusinya menjadi lebih lambat jika dibandingkan dengan IDS, sedangkan IDS menerapkan prioritas dalam menentukan alur program dan langkahnya. Hal tersebut membuat IDS hanya memiliki satu pola penyelesaian, namun dengan waktu eksekusi yang lebih cepat dari pada ASP.

Model penyelesaian N-puzzle telah sukses diaplikasikan ke program berbasis web dengan menggunakan antarmuka sehingga pengguna bisa memainkan N-puzzle. Selain itu, pengguna dapat meminta penyelesaian untuk masalah yang dibangkitkan baik dengan ASP atau IDS. Jika pengguna ingin pencarian solusi puzzle dengan waktu eksekusi yang lebih cepat, pengguna dapat memilih penyelesaian dengan IDS, walau ada kemungkinan tidak menemukan solusi. Namun, jika pengguna ingin kepastian mendapatkan solusi dari suatu puzzle

walaupun dengan waktu penyelesaian pencarian lebih lambat, ASP solver layak dikedepankan.

Saran

Penelitian selanjutnya diharapkan bisa menerapkan answer set programming untuk membangkitkan soal N-puzzle, karena saat ini pembangkitannya menggunakan imperative programming. Penyelesaian diharapkan dapat mendeteksi konfigurasi state dari N-puzzle

yang sudah pernah terjadi pada langkah sebelumnya.

DAFTAR PUSTAKA

Cormen TH, Leiserson CE, Rivest RL, Stein C. 2001. Introduction to Algorithm. London : McGraw-Hill.

Gelfond M, Lifschitz V. 1991. Classsical Negation in Logic Programs and Disjunctive Databases. Austin : University of Texas.

Kendall G, Parkes A, Spoerer K. 2008. A Survey of NP-CompletePuzzles. Nottingham : School of Computer Science – University of Nottingham.

Lifschitz V. 2008. What is Answer Set Programming. Austin : Department of

Computer Sciences – University of Texas at Austin.

Mushthofa M. 2010. Evaluation of Answer Set Programs with bounded Predicate Arities. [thesis]. Vienna : Faculty of Informatics Department of Knowledge Based Systems – Vienna University of Technology. Ratner D, Warmuth M. 1990. The

(n2-1)-puzzle and Relocated Problems. Santa Cruz : Computer and Information Sciences – University of California.

Reinefed A, Marsland T.A. 1993. Enhanced Iterative- Deepening Search*. Paderborn : Computing Science Departement-University of Alberta.

(20)
(21)

Lampiran 1Pseudo code program C++ untuk pembangkitan soal N-puzzle.

1 Set i to 1

2 FOR each i on index array puzzle

3 IF i is end of index array puzzle

4 Set nilai[i] to 0

5 ELSE

6 Set nilai[i] to i

7 END IF

8 Increment i

9 END FOR

10 Set i to 1

11 FOR each i on index array puzzle

12 IF nilai[i] is 0

13 i is position of 0

14 END IF

15 Increment i

16 END FOR

17 Set i to 1

18 FOR each i on number of randomization step

19 Search position of 0

20 IF nodes available not previous position of 0

21 Random target node from nodes available

22 Switch 0 with target node

23 END IF

24 Increment i

25 END FOR

Baris 1 sampai baris 9 pada lampiran ini digunakan untuk menentukan nilai dari 1 sampai N

(22)

Lampiran 2 Program DLV, Pembangkitan kemungkinan gerak pada langkah pertama (T=0).

1 move(1,2,1) v move(1,1,2) :- at(0,0,1,1).

2 move(1,X,2) v move(1,X0,1) :- at(0,0,X,1),n(X),X=X0+1,pos(X0).

3 move(1,2,Y) v move(1,1,Y0) :- at(0,0,1,Y),n(Y),Y=Y0+1,pos(Y0).

4 move(1,X,Y0) v move(1,X0,Y) :- at(0,0,X,Y), n(X), n(Y), X=X0+1, Y=Y0+1,

pos(X0), pos(Y0).

5 move(1,X1,1) v move(1,X,2) v move(1,X0,1) :-

at(0,0,X,1),X>1,n(S),S>2,X<S,X1=X+1,X=X0+1,pos(X0).

6 move(1,X1,Y) v move(1,X,Y0) v move(1,X0,Y) :-

at(0,0,X,Y),X>1,n(S),S>2,X<S,n(Y),X1=X+1,Y=Y0+1,X=X0+1,pos(Y0),pos(X0).

7 move(1,2,Y) v move(1,1,Y1) v move(1,1,Y0) :-

at(0,0,1,Y),X=1,Y>1,n(S),S>2,Y<S,Y1=Y+1,Y=Y0+1,pos(Y0).

8 move(1,X,Y1) v move(1,X0,Y) v move(1,X,Y0) :-

at(0,0,X,Y),n(X),Y>1,n(S),S>2,Y<S,Y1=Y+1,X=X0+1,Y=Y0+1,pos(X0),pos(Y0).

9 move(1,X1,Y) v move(1,X,Y1) v move(1,X0,Y) v move(1,X,Y0) :-

at(0,0,X,Y),X>1,n(S),S>2,X<S,Y>1,n(S),Y<S,X1=X+1,Y1=Y+1,X=X0+1,Y=Y0+1,pos(X0),p os(Y0).

Sebagai keterangan X=X0+1 menunjukkan bahwa posisi X ada di sebelah kanan X0, X1=X+1 menunjukkan bahwa posisi X ada di sebelah kiri X1, Y=Y0+1 menunjukkan bahwa posisi Y ada di atas Y0, dan Y1=Y+1 menunjukkan bahwa posisi Y ada di bawah Y1 .

Baris 1 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di pojok kiri atas. Baris 2 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di pojok kanan atas. Baris 3 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di pojok kiri bawah. Baris 4 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di pojok kanan bawah. Baris 5 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di sisi atas.

(23)

Lampiran 3 Program DLV, Pembangkitan kemungkinan gerak pada langkah berikutnya (T>0).

1 move(T1,2,1) :- at(T,0,1,1),at(T0,0,1,2),T>0,T=T0+1,T1=T+1,not solved(T).

2 move(T1,1,2) :- at(T,0,1,1),at(T0,0,2,1),T>0,T=T0+1,T1=T+1,not solved(T).

3 move(T1,X0,1) :-

at(T,0,X,1),at(T0,0,X,2),T>0,T=T0+1,T1=T+1,n(X),X=X0+1,pos(X0),not solved(T).

4 move(T1,X,2) :-

at(T,0,X,1),at(T0,0,X0,1),T>0,T=T0+1,T1=T+1,n(X),X=X0+1,pos(X0),not solved(T).

5 move(T1,1,Y0) :-

at(T,0,1,Y),at(T0,0,2,Y),T>0,T=T0+1,T1=T+1,n(Y),Y=Y0+1,pos(Y0),not solved(T).

6 move(T1,2,Y) :-

at(T,0,1,Y),at(T0,0,1,Y0),T>0,T=T0+1,T1=T+1,n(Y),Y=Y0+1,pos(Y0),not solved(T).

7 move(T1,X0,Y) :-

at(T,0,X,Y),at(T0,0,X,Y0),T>0,T=T0+1,T1=T+1,n(X),n(Y),X=X0+1,Y=Y0+1,pos(X0),pos (Y0),not solved(T).

8 move(T1,X,Y0) :-

at(T,0,X,Y),at(T0,0,X0,Y),T>0,T=T0+1,T1=T+1,n(X),n(Y),X=X0+1,Y=Y0+1,pos(X0),pos (Y0),not solved(T).

9 move(T1,X,2) v move(T1,X0,1) :-

at(T,0,X,1),at(T0,0,X1,1),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,X1=X+1,X=X0+1,pos( X0),not solved(T).

10 move(T1,X1,1) v move(T1,X0,1) :-

at(T,0,X,1),at(T0,0,X,2),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,X1=X+1,X=X0+1,pos(X 0),not solved(T).

11 move(T1,X1,1) v move(T1,X,2) :-

at(T,0,X,1),at(T0,0,X0,1),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,X1=X+1,X=X0+1,pos( X0),not solved(T).

12 move(T1,X,Y0) v move(T1,X0,Y) :-

at(T,0,X,Y),at(T0,0,X1,Y),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,n(Y),X1=X+1,Y=Y0+1 ,X=X0+1,pos(X0),pos(Y0),not solved(T).

13 move(T1,X1,Y) v move(T1,X0,Y) :-

at(T,0,X,Y),at(T0,0,X,Y0),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,n(Y),X1=X+1,Y=Y0+1 ,X=X0+1,pos(X0),pos(Y0),not solved(T).

14 move(T1,X1,Y) v move(T1,X,Y0) :-

at(T,0,X,Y),at(T0,0,X0,Y),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,n(Y),X1=X+1,Y=Y0+1 ,X=X0+1,pos(X0),pos(Y0),not solved(T).

15 move(T1,1,Y1) v move(T1,1,Y0) :-

at(T,0,1,Y),at(T0,0,2,Y),T>0,T1=T+1,T=T0+1,Y>1,n(S),S>2,Y<S,Y1=Y+1,Y=Y0+1,pos(Y 0),not solved(T).

16 move(T1,2,Y) v move(T1,1,Y0) :-

at(T,0,1,Y),at(T0,0,1,Y1),T>0,T1=T+1,T=T0+1,Y>1,n(S),S>2,Y<S,Y1=Y+1,Y=Y0+1,pos( Y0),not solved(T).

17 move(T1,2,Y) v move(T1,1,Y1) :-

at(T,0,1,Y),at(T0,0,1,Y0),T>0,T1=T+1,T=T0+1,Y>1,n(S),S>2,Y<S,Y1=Y+1,Y=Y0+1,pos( Y0),not solved(T).

18 move(T1,X0,Y) v move(T1,X,Y0) :-

at(T,0,X,Y),at(T0,0,X,Y1),T>0,T1=T+1,T=T0+1,n(X),Y>1,n(S),S>2,Y<S,Y1=Y+1,X=X0+1 ,Y=Y0+1,pos(X0),pos(Y0),not solved(T).

19 move(T1,X,Y1) v move(T1,X,Y0) :-

at(T,0,X,Y),at(T0,0,X0,Y),T>0,T1=T+1,T=T0+1,n(X),Y>1,n(S),S>2,Y<S,Y1=Y+1,X=X0+1 ,Y=Y0+1,pos(X0),pos(Y0),not solved(T).

20 move(T1,X,Y1) v move(T1,X0,Y) :-

at(T,0,X,Y),at(T0,0,X,Y0),T>0,T1=T+1,T=T0+1,n(X),Y>1,n(S),S>2,Y<S,Y1=Y+1,X=X0+1 ,Y=Y0+1,pos(X0),pos(Y0),not solved(T).

21 move(T1,X,Y1) v move(T1,X0,Y) v move(T1,X,Y0) :-

at(T,0,X,Y),at(T0,0,X1,Y),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,Y>1,n(S),Y<S,X1=X+ 1,Y1=Y+1,X=X0+1,Y=Y0+1,pos(X0),pos(Y0),not solved(T).

22 move(T1,X1,Y) v move(T1,X0,Y) v move(T1,X,Y0) :-

at(T,0,X,Y),at(T0,0,X,Y1),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,Y>1,n(S),Y<S,X1=X+ 1,Y1=Y+1,X=X0+1,Y=Y0+1,pos(X0),pos(Y0),not solved(T).

23 move(T1,X1,Y) v move(T1,X,Y1) v move(T1,X,Y0) :-

(24)

24 move(T1,X1,Y) v move(T1,X,Y1) v move(T1,X0,Y) :-

at(T,0,X,Y),at(T0,0,X,Y0),T>0,T1=T+1,T=T0+1,X>1,n(S),S>2,X<S,Y>1,n(S),Y<S,X1=X+ 1,Y1=Y+1,X=X0+1,Y=Y0+1,pos(X0),pos(Y0),not solved(T).

Pada semua aturan diatas tidak mengizinkan kembali ke posisi tepat satu langkah sebelumnya. Baris 1 sampai baris 2 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di pojok kiri atas. Pada baris 1 nilai 0 akan bergerak ke kanan. Pada baris 2 nilai 0 akan bergerak ke bawah.

Baris 3 sampai baris 4 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di pojok kanan atas. Pada baris 3 nilai 0 akan bergerak ke kiri. Pada baris 4 nilai 0 akan bergerak ke bawah.

Baris 5 sampai baris 6 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di pojok kiri bawah. Pada baris 5 nilai 0 akan bergerak ke atas. Pada baris 6 nilai 0 akan bergerak ke kanan.

Baris 7 sampai baris 8 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di pojok kanan bawah. Pada baris 7 nilai 0 akan bergerak ke kiri. Pada baris 8 nilai 0 akan bergerak ke atas.

Baris 9 sampai baris 11 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di atas. Pada baris 9 nilai 0 akan bergerak ke kiri atau ke bawah. Pada baris 10 nilai 0 akan bergerak ke kiri atau ke kanan. Pada baris 11 nilai 0 akan bergerak ke kanan atau ke bawah.

Baris 12 sampai baris 14 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di bawah. Pada baris 12 nilai 0 akan bergerak ke kiri atau ke atas. Pada baris 13 nilai 0 akan bergerak ke kiri atau ke kanan. Pada baris 14 nilai 0 akan bergerak ke kanan atau ke atas.

Baris 15 sampai baris 17 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di kiri. Pada baris 15 nilai 0 akan bergerak ke atas atau ke bawah. Pada baris 16 nilai 0 akan bergerak ke atas atau ke kanan. Pada baris 17 nilai 0 akan bergerak ke kanan atau ke bawah.

Baris 18 sampai baris 20 adalah aturan pembangkitan kemungkinan gerak langkah ke jika posisi 0 di kanan. Pada baris 18 nilai 0 akan bergerak ke atas atau ke kiri. Pada baris 19 nilai 0 akan bergerak ke atas atau ke bawah. Pada baris 20 nilai 0 akan bergerak ke kiri atau ke bawah.

(25)

Lampiran 4 Program DLV, akibat jika terjadi gerakan (move).

1 at(T1,0,X1,Y) :- at(T,0,X,Y),move(T1,X1,Y),T1=T+1,pos(Y).

2 at(T1,0,X,Y1) :- at(T,0,X,Y),move(T1,X,Y1),T1=T+1,pos(X).

3 at(T1,N,X,Y) :- at(T,N,X1,Y),move(T1,X1,Y),at(T,0,X,Y),T1=T+1,angka(N),pos(Y).

4 at(T1,N,X,Y) :- at(T,N,X,Y1),move(T1,X,Y1),at(T,0,X,Y),T1=T+1,angka(N),pos(X).

Pada baris 1 menunjukkan jika pada waktu T nilai 0 ada di X,Y dan bergerak ke X1,Y, maka pada waktu T1 ,dimana T1=T+1 nilai 0 ada di X1,Y .

Pada baris 2 menunjukkan jika pada waktu T nilai 0 ada di X,Y dan bergerak ke X,Y1, maka pada waktu T1 ,dimana T1=T+1 nilai 0 ada di X,Y1 .

Pada baris 3 menunjukkan jika pada waktu T nilai N ada di X1,Y dan nilai 0 ada di X,Y, lalu nilai 0 bergerak ke X1,Y, maka pada waktu T1 ,dimana T1=T+1 nilai N ada di X,Y .

(26)

Lampiran 5 Program DLV, kondisi state pada nilai yang tidak bergerak (frame axiom).

1 at(T1,N,X,Y) :- at(T,N,X,Y),not

move(T1,X,Y),N>0,T1=T+1,pos(X),pos(Y),angka(N),not solved(T).

(27)

Lampiran 6 Pseudo code program C++, membaca soal N-puzzle yang dibangkitkan.

1 Set ukuran to string on ukuran.dat

2 Set size to integer (ukuran}

3 Set i to 1

4 FOR each string on imperatif.dat

5 Set puzzle to string

6 Set puzzle[i] to integer (puzzle)

7 IF i is number of puzzle

8 break

9 END IF

10 Increment i

11 END FOR

(28)

Lampiran 7 Pseudo code program C++, memeriksa apakah N-puzzle sudah selesai (solve).

1 Set i to 1

2 FOR each index of array puzzle

3 IF puzzle[i] is 0

4 Set value to number of puzzle - i

5 ELSE

6 Set value to puzzle[i] – i

7 Set value to absolute (value)

8 END IF

9 Sum all of value

10 Increment i

11 END FOR

(29)

Lampiran 8 Pseudo code program C++, iterasi yang memanggil fungsi menggerakan puzzle.

1 Choose max deep (5,10,or 15)

2 Set deep to 2

3 FOR each deep till max deep

4 IF puzzle not solved THEN

5 Move puzzle

6 ELSE

7 break

8 END IF

9 Increment deep

10 END FOR

11

(30)
(31)
(32)
(33)
(34)

ABSTRACT

TEGUH FAJAR NURBIANSYAH. Application Solver N-puzzle with Answer Set Programming and Iterative Deepening Search. Supervised by MUSHTHOFA.

(35)

PENDAHULUAN

Latar Belakang

N-Puzzle adalah permainan teka-teki untuk mencari langkah agar puzzle yang berisi sekumpulan angka dapat terurut (Kendall et al. 2008). Salah satu cara penyelesaian N-puzzle dilakukan dengan mencari semua kemungkinan langkah yang mencapai solusi. Gambaran yang sangat baik untuk permasalahan N-puzzle dapat direpresentasikan dengan 8-puzzle, 15-puzzle, dan 24-puzzle.

Permainan 8-puzzle mudah untuk diselesaikan sebagai ruang pencarian yang relatif kecil. Teknik *IDA adalah algoritme yang pertama kali berhasil menemukan solusi optimal untuk masalah 15-puzzle. Namun, dengan algoritme ini solusi optimal untuk

24-puzzle tidak dapat dihasilkan dalam waktu yang wajar (Kendall et al. 2008). Mencari solusi untuk N-puzzle dengan langkah paling sedikit telah terbukti NP-Complete (Ratner & Warmuth 1990).

Pencarian semua kemungkinan solusi dapat menyebabkan kompleksitas dari algoritme penyelesaiannya menjadi eksponensial. Hal tersebut bergantung pada ukuran puzzle. Permasalahan pencarian solusi seperti ini disebut Nondeterministic Polynomial-time Complete (NP-Complete) (Cormen et al.2001).

Penyelesaian N-puzzle pada komputer yang dilakukan dengan paradigma teknik pemrograman imperatif atau prosedural

menjadi cukup sulit. Hal tersebut disebabkan

programmer harus memberikan sekumpulan perintah langkah-langkah yang harus dilakukan komputer secara detail, mulai dari menerima masukan, menentukan struktur data, banyaknya looping, pemanggilan fungsi, sampai proses perhitungan dilakukan. Perintah-perintah tersebut akan dieksekusi baris per baris secara berurutan oleh komputer. Hal tersebut menyebabkan kode program menjadi panjang dan rumit.

Iterative deepening search (IDS) merupakan salah satu teknik pemrograman dengan paradigma imperatif. IDS menggabungkan optimalisasi breadth-first search (BFS) dengan depth-first search (DFS) yang beroperasi dengan batas pencarian yang diperpanjang secara berturut-turut (Reinefed & Marsland 1993).

Untuk itu, penulis mencoba membangun

N-puzzlesolver dengan menggunakan answer set programming (ASP) sebagai pendekatan yang berbeda dengan IDS. Penulis bermaksud membandingkan ASP dan IDS berdasarkan kinerja model penyelesaian yang dibangun. Hal-hal yang menjadi pertimbangan adalah tingkat kesulitan kontrol pada kode program, panjang-pendeknya kode program, waktu eksekusi, dan kemampuan menyelesaikan

puzzle (selesai atau tidak).

ASP sendiri merupakan teknik pemrogaman berorientasi deklaratif untuk pencarian solusi pada permasalahan yang sulit (Lifschitz 2008). ASP hanya menggunakan ekspresi logika untuk membuat model penyelesaian suatu permasalahan.

Tujuan Penelitian

Penelitian ini bertujuan membuat model untuk penyelesaian game N-puzzle masing-masing memanfaatkan ASP dan IDS. Selanjutnya, penelitian ini akan membandingkan kinerja dari model-model penyelesaian tersebut.

Ruang Lingkup

Ruang lingkup permasalahan pada penelitian ini adalah:

1 Model penyelesaian ASP dibuat dengan

datalog with disjunction (DLV) dan model penyelesaian IDS menggunakan C++. 2 Pembangkitan soal N-puzzle dan

antarmuka dibuat dengan PHP.

3 Soal N-puzzle yang dibangkitkan dengan bentuk n x n, di antaranya 3-puzzle,

8-puzzle, 15-puzzle, dan 24-puzzle.

4 Ukuran perbandingan yang digunakan adalah kemampuan dan kecepatan solver

dalam menemukan solusi. Kecepatan

solver dihitung berdasarkan waktu penyelesaiannya.

Manfaat

Manfaat penelitian ini adalah menunjukkan bahwa ASP bisa menyelesaikan masalah NP-Complete pada N-puzzle

sebagaimana imperative programming dapat melakukannya. Diharapkan model penyelesaian dengan ASP dapat mencari path

(36)

METODE PENELITIAN

Pembangunan Back end

Pembangunan Front end

Studi Literatur

Logika N-puzzle

Representasi

Logika Algoritme IDS

Encoding Implementasi C++

DLV Solver IDS Solver

Pembangkitan Soal N-puzzle

[image:36.595.106.300.77.784.2]

Pengujian dengan DLV Pengujian dengan IDS Analisa Hasil Pengujian Perbandingan Solusi yang dihasilkan

Gambar 1 Diagram alur langkah penelitian. Logic N-puzzle

Seperti pada Gambar 1, bagian logic N-puzzle merupakan elemen paling penting dalam penelitian ini. Bagian ini menerapkan aturan-aturan yang diizinkan pada permainan ini ke pembangkitan dan penyelesaian N-puzzle. Berikut adalah aturan-aturan logic dari

N-puzzle:

1 N-puzzle berbentuk segi n atau n x n grid, dengan N = n2 -1.

2 N-puzzle terdiri dari N kotak bernilai 1 sampai N dan 1 buah kotak bernilai 0. 3 Pada pergerakan N-puzzle, hanya kotak

bernilai 0 yang dapat bertukar dengan salah satu kotak yang adjacent

dengannya.

4 Bergantung pada posisinya, kotak bernilai 0 memiliki dua, tiga, atau empat kotak yang adjacent.

5 Pada langkah pertama, kotak bernilai 0 dapat bergerak ke salah satu dari semua kotak yang adjacent dengannya.

6 Jika waktu sekarang adalah T, pada langkah ke T+1 kotak bernilai 0 tidak boleh kembali ke posisi ketika kotak bernilai 0 berada pada waktu T-1 (tidak boleh kembali secara langsung).

7 Kondisi selesai (solve) adalah N-puzzle

sudah terurut dari 1 sampai N dan kotak bernilai 0 ada di posisi n2 (kanan bawah).

Back End

Bagian back end akan melakukan proses pembangkitan dan penyelesaian permainan N-puzzle. Secara lebih spesifik, back end akan terdiri atas empat modul, yaitu:

1 Modul generate soal: membangkitkan soal

N-puzzle dengan menspesifikasikan kondisi awal puzzle.

2 Modul logic: menangani aturan dan mekanisme berjalannya permainan N-puzzle.

3 Modul generate plan: mencari penyelesaian dari N-puzzle. Pada modul ini, akan ada strategi yang diterapkan untuk menyelesaikan N-puzzle.

4 Modul output: menuliskan ouput

penyelesaian N-puzzle untuk komunikasi ke bagian front end.

Pembangkitan Soal N-puzzle

Pembangkitan soal N-puzzle bergantung pada ukuran puzzle dan banyaknya langkah pengacakan. Soal yang akan dibangkitkan adalah puzzle yang harus bisa diselesaikan atau dijamin terdapat solusi. Langkah pengacakan puzzle harus memenuhi aturan

logic permainan N-puzzle. Berikut adalah aturan langkah pembangkitan soal N-puzzle: 1 Membuat N-puzzle yang sudah selesai

(solve) berdasarkan ukuran yang dipilih. 2 Langkah pengacakan puzzle dilakukan

dengan menukar 0 dengan salah satu kotak yang adjacent dengan posisi 0.

3 Banyaknya arah yang dituju yang tersedia bisa dua, tiga, atau empat bergantung pada posisi 0 dan adjacent yang tersedia.

4 Tujuan pergerakan 0 ke kotak yang

adjacent dengannya dilakukan dengan pengacakan terhadap arah 0 yang dapat dituju.

5 Pada langkah berikutnya, langkah kembali ke posisi sebelumnya tidak boleh dilakukan.

6 Lakukan langkah pengacakan puzzle

berdasarkan banyaknya langkah pengacakan puzzle yang dipilih.

Berikut contoh pembangkitan N-puzzle

dengan n=3 dan pengacakan puzzle sebanyak 3 langkah:

1 Mengacak dua arah yang tersedia (semua

(37)

Gambar 2 Langkah awal pengacakan puzzle. 2 Mengacak dua arah yang tersedia karena

tidak boleh kembali ke satu langkah sebelumnya. Pada Gambar 3 di bawah ini, hasil pengacakan arah adalah ke atas.

Gambar 3 Langkah pengacakan puzzle. 3 Mengacak tiga arah yang tersedia karena

tidak boleh kembali ke satu langkah sebelumnya. Pada Gambar 4 di bawah ini, hasil pengacakan arah adalah ke kanan.

Gambar 4 Langkah pengacakan puzzle. Generate Plan Penyelesaian N-puzzle

Generate plan akan menerapkan strategi untuk mencari solusi yang dapat menyelesaikan permasalahan N-puzzle. Dalam kasus ini, solusi adalah pencarian langkah menuju kondisi selesai (solve). Strategi yang diterapkan tetap harus dapat memenuhi logic

dari permainan N-puzzle. Generate plan akan mencari semua kemungkinan gerak yang diizinkan logic N-puzzle dan menghitung langkah menuju solusi. Jika satu solusi sudah ditemukan, pencarian akan dihentikan.

Pada ASP, representasi logika dan strategi pendekatan yang digunakan untuk menyelesaiakan masalah adalah guess and check (Musthofa 2010). Penerapan guess and check untuk pencarian solusi pada N-puzzle

adalah sebagai berikut:

1 Guess: ASP akan menebak semua kemungkinan path yang menjadi kandidat solusi. Penebakan dilakukan berdasarkan kemungkinan arah gerak dari nilai 0 dengan memanfaatkan disjungsi. Hal ini

akan terus dilakukan selama puzzle belum

solve.

2 Check: ASP akan memeriksa semua kandidat solusi yang ditebak dengan memanfaatkan constraint. Kandidat solusi yang tidak diinginkan akan digugurkan oleh constraint. Dalam hal ini, semua path

yang tidak mencapai solusi dieliminasi sehingga solusi yang dihasilkan adalah solusi yang benar, yaitu path yang mencapai kondisi solve.

Model penyelesaian dengan ASP dibuat pada DLV. DLV adalah tool untuk mengomputasi answer set yang mengimplementasikan pemrograman logika disjungsi dengan menggunakan semantik

answer set (Gelfond & Lifschitz 1991).

Komputasi DLV adalah sound and complete. Maksud dari sound adalah solusi yang dihasilkan oleh DLV merupakan solusi yang benar, sedangkan maksud dari complete

adalah semua solusi yang benar harus muncul. Algoritme iterative deepening search

(IDS) digunakan sebagai strategi pembanding. IDS dibuat dengan menggunakan bahasa pemrograman C++. Ide dasar algoritme IDS adalah melakukan DFS dengan batas pencarian yang diperpanjang oleh kedalaman

tree. Dengan pendekatan iterative, IDS dijamin menemukan solusi shortest path, seperti pada BFS (Reinefed & Marsland 1993). Pencarian Solusi dengan IDS adalah sebagai berikut:

1 Mendeteksi posisi 0 saat ini.

2 Mengunjungi semua node (adjacent) yang bisa dikunjungi menggunakan cara DFS dengan kedalaman tertentu.

3 Jika belum menemukan solusi (mencapai kondisi solve), lakukan kembali langkah nomor 2 dari awal dengan kedalaman ruang pencarian yang diperpanjang secara berturut-turut setiap pemanggilannya. Pembangunan Front End

Front end akan dibangun menggunakan PHP dan JavaScript. Fungsi utama bagian

front end adalah sebagai graphic user interface (GUI). Bagian front end terdiri atas tiga modul, yaitu:

(38)

2 Modul permainan untuk user akan menampilkan graphic user interface

berupa soal N-puzzle yang dapat dimainkan oleh user dan solusinya.

3 Modul untuk pengujian akan menampilkan soal yang dibangkitkan, solusi yang dihasilkan, dan waktu penyelesaiannya. Komunikasi

Bagian komunikasi akan mengodekan (encode) problem menjadi input untuk back end dan harus mengodekan kembali output

dari backend menjadi representasi N-puzzle. Modul komunikasi akan dibangun dengan PHP.

Arsitektur Sistem

Komunikasi Back end

[image:38.595.113.299.287.447.2]

logic Front end GUI Generate soal Generate plan Generate problems N-puzzle (pilih ukuran dan pengacakan) output Pengujian N-puzzle Parser

Gambar 5 Arsitektur sistem.

Arsitektur sistem pada Gambar 5 terdiri atas tiga bagian yaitu, back end, front end, dan modul komunikasi. Back end untuk pembangkitan soal dikerjakan oleh PHP. Sedangkan untuk penyelesaian akan dikerjakan oleh DLV dan C++. Berdasarkan arsitektur sistem di atas, diagram alur proses

N-puzzle sampai menghasilkan solusi dapat di lihat pada Gambar 6.

Pembangkitan soal N-puzzle

Pilih ukuran N-puzzle Pilih jumlah pengacakan Generate.php Soal.dat N-puzzle solver Npuzzle.txt (DLV) solve5.cpp (solve5.exe) solve10.cpp (solve.exe) solve15.cpp (solve15.exe) Idsgame.php (fungsi exec) N-puzzle solved GUI Parsing output

dari solver

Menampilkan hasil parsing

ke bentuk representasi

N-puzzle

Pengujian

Gambar 6 Diagram alur proses N-puzzle.

HASIL DAN PEMBAHASAN

Banyaknya arah bergerak untuk nilai 0 bergantung pada banyaknya adjacent dari nilai 0 tersebut. Selain itu, pergerakan N-puzzle tidak boleh kembali pada satu langkah tepat sebelumnya karena akan jadi gerakan yang percuma. Pemb

Gambar

Gambar 1  Diagram alur langkah penelitian.
Gambar 5  Arsitektur sistem.
Gambar 12   Path dari soal sampai solved.
Tabel 2 Waktu eksekusi dan kondisi selesai
+7

Referensi

Dokumen terkait

Proses fitoremediasi pada penelitian ini dilakukan secara batch menggunakan dua variasi kombinasi jumlah tanaman kayu apu dan papyrus serta variasi waktu

[r]

menjadi uap panas lanjut /superheated steam0 yang akan digunakan untuk memutar turbin..  Turbin uap berungsi untuk

Sangat mungkin banyak hal yang seharusnya atau dapat dipelajari siswa tetapi tidak bisa dimasukkan ke dalam kurikulum karena “ruang” yang terbatas atau kompleksitas yang tinggi

Berdasarkan hasil analisis data hasil belajar peserta didik untuk kompetensi sikap, pengetahuan, dan keterampilan, dapat ditarik kesimpulan bahwa pembelajaran dengan

Prosesor merupakan otak dari sebuah PLC, fungsi utama adalah mengatur tugas pada keseluruhan sistem PLC, mengerjakan berbagai operasi antara lain

Dengan mempelajari aspek ergonomi pada proses menajak akan menjadi dasar dalam pengembangan aspek teknik tajak sebagai alat penyiapan lahan yang tepat di lahan rawa,

Gudang Mas Indonesia (PT. GMI) sebagai induk perusahaan, bergerak di bidang trading dan tidak memproduksi. Untuk memproduksi PT. GMI biasanya bekerja sama dengan