• Tidak ada hasil yang ditemukan

Pembangkitan dan penyelesaian sliher link dengan answer set programming dan procedural programming

N/A
N/A
Protected

Academic year: 2017

Membagikan "Pembangkitan dan penyelesaian sliher link dengan answer set programming dan procedural programming"

Copied!
70
0
0

Teks penuh

(1)

ABSTRAK

SALMAN FARIZI. Application of Generator and Solver Slither Link with Answer Set Programming and Procedural Programming. Supervised by MUSHTHOFA.

Slither Link is a popular pencil-based puzzle game similar to Sudoku. This problem has been shown to be NP-Complete. The goal of the game is to link grid segments forming a loop such that the number of lines adjacent to a cell is equal to the number written on the cell. In this research, we investigate the use of Answer Set Programming as a formal representation of the game, and to prove an alternative solving method, as opposed to the procedural method. We then perform experiment to test the efficiency of Answer Set Programming compared to the procedural method in solving Slither Link. For the Anser Set Programming method, we use DLV as the solver, whereas for the procedural method we write a program in C++ to solve Slither Link in a procedural manner. The result shows that ASP performed consistently better than the procedural method we use.

(2)

PEMBANGKITAN DAN PENYELESAIAN

SLITHER LINK

DENGAN

ANSWER SET PROGRAMMIN

G DAN

PROCEDURAL PROGRAMMING

SALMAN FARIZI

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

INSTITUT PERTANIAN BOGOR

(3)

ABSTRAK

SALMAN FARIZI. Application of Generator and Solver Slither Link with Answer Set Programming and Procedural Programming. Supervised by MUSHTHOFA.

Slither Link is a popular pencil-based puzzle game similar to Sudoku. This problem has been shown to be NP-Complete. The goal of the game is to link grid segments forming a loop such that the number of lines adjacent to a cell is equal to the number written on the cell. In this research, we investigate the use of Answer Set Programming as a formal representation of the game, and to prove an alternative solving method, as opposed to the procedural method. We then perform experiment to test the efficiency of Answer Set Programming compared to the procedural method in solving Slither Link. For the Anser Set Programming method, we use DLV as the solver, whereas for the procedural method we write a program in C++ to solve Slither Link in a procedural manner. The result shows that ASP performed consistently better than the procedural method we use.

(4)

PEMBANGKITAN DAN PENYELESAIAN

SLITHER LINK

DENGAN

ANSWER SET PROGRAMMIN

G DAN

PROCEDURAL PROGRAMMING

SALMAN FARIZI

Skripsi

Sebagai salah suatu syarat untuk memperoleh gelar

Sarjana Komputer pada

Program Studi Ilmu Komputer

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

INSTITUT PERTANIAN BOGOR

(5)

Judul Skripsi : Pembangkitan dan Penyelesaian Sliher Link

dengan

Answer Set Programming dan Procedural Programming

Nama : Salman Farizi

NIM : G64086006

Menyetujui:

Pembimbing

Mushthofa, S.Kom., M.Sc. NIP. 19820325 200912 1 003

Mengetahui:

Ketua Departemen Ilmu Komputer Institut Pertanian Bogor

Dr. Ir. Sri Nurdiati, M.Sc NIP. 19601126 198601 2 001

(6)

RIWAYAT HIDUP

Penulis dilahirkan pada tanggal 10 Desember 1986 di Jakarta sebagai anak pertama dari dua bersaudara dari pasangan Hifni Machmud dan Esty Dianingsih. Penulis menyelesaikan pendidikan menengah atas pada tahun 2004 dari SMU Negeri 3 Bogor dan lulus program Diploma Manajemen Informatika Politeknik Manufaktur Astra di Jakarta pada tahun 2007. Selama tiga bulan penulis melaksanakan praktek kerja lapang di PT Gajah Tunggal tbk.

(7)

PRAKATA

Segala puji bagi Allah dan salawat serta salam atas Rasul Allah, Nabi Muhammad shalallahu alaihi wa salam serta kepada keluarga dan sahabat-sahabatnya.

Melalui lembar ini penulis ingin menyampaikan terima kasih kepada Bapak Mushthofa S.Kom., M.Sc. selaku pembimbing yang telah meluangkan waktu dan tenaganya untuk membimbing penulis, memberikan ilmu-ilmu yang sangat berharga, serta dukungan selama penelitian ini berjalan. Bapak Dr. Ir. Agus Buono M.Si, M.Kom. dan Bapak Ahmad Ridha S.Kom., MS. yang telah bersedia menjadi penguji dalam pelaksanaan seminar dan sidang.

Penulis juga mengucapkan terima kasih kepada seluruh keluarga, terutama Mama dan Bapak yang telah memberikan dukungannya, kasih sayang, pengorbanan, dan kesabarannya selama ini. Abang Sandi, Teteh Etsa, Syalfa, Uwa, Paman, serta Bibi yang selalu mengingatkan penulis untuk berdoa, berusaha, dan memberikan semangat untuk terus menyelesaikan tugas akhir.

Teguh yang selalu membantu, memberi dukungan, pendapat, dan teman satu bimbingan selama ini. Teman-teman Badminton ilkom dan teman-teman acara nonton bareng yang selalu memberi keceriaan dan wawasan baru pada penulis. Abdul Rahmat Ramdhan yang tanpa lelah selalu memberi dukungan pada seminar dan sidang, serta teman-teman Ilkom Ekstensi angkatan 3 terima kasih untuk kebersamaan selama kuliah di Ilmu Komputer IPB.

Seluruh staf pengajar yang telah memberikan ilmu yang berharga selama penulis menuntut ilmu di Departemen Ilmu Komputer. Seluruh staf administrasi dan perpustakaan Departemen Ilmu Komputer yang selalu memberikan kemudahan dalam mengurus segala macam hal berkaitan dengan perkuliahan, serta pihak lain yang tidak bisa disebutkan satu-persatu.

Sebagaimana manusia yang tidak luput dari kesalahan, penulis menyadari bahwa karya ilmiah ini jauh dari sempurna. Namun penulis berharap semoga karya ini bisa berguna untuk siapapun yang membacanya.

Bogor, Mei 2011

(8)

iv

DAFTAR ISI

Halaman

DAFTAR GAMBAR ... v

DAFTAR LAMPIRAN ... vi

PENDAHULUAN ... 1

Latar Belakang ... 1

Tujuan Penelitian ... 1

Ruang Lingkup Penelitian ... 1

Manfaat Penelitian ... 1

TINJAUAN PUSTAKA ... 1

NP-Complete... 1

Logic Programming ... 2

Answer set programming ... 2

DLV (datalog with disjunction) ... 4

Slither link ... 5

METODOLOGI ... 5

Formulasi aturan pembangkitan slither link ... 5

Formulasi aturan penyelesaian ... 6

Pembangunan front end ... 7

Arsitektur sistem ... 8

HASIL DAN PEMBAHASAN ... 8

Domain masalah dalam DLV ... 8

Encoding dengan DLV ... 9

Menjalankan model penyelesaian slither link ... 12

Implementasi dengan Procedural Programming ... 13

Struktur data... 13

Hasil Pengujian ... 14

KESIMPULAN DAN SARAN ... 15

Kesimpulan ... 15

Saran ... 15

DAFTAR PUSTAKA ... 15

(9)

v

DAFTAR GAMBAR

Halaman

1 Hubungan antara P, NP, dan NPC (Cormen et al 2001). ... 2

2 Graf tujuh kota. ... 5

3 Masalah slither link dan solusinya (Yato 2003). ... 5

4 Formulasi pembangkitan. ... 5

5 Grafik tingkat kesulitan puzzle berbanding dengan constraint puzzle. ... 6

6 Formulasi Penyelesaian. ... 6

7 Cell dengan nilai 0 (Conceptis puzzle 1997). ... 6

8 Cell bernilai 0 dan 3 yang bertetangga (Conceptis puzzle 1997). ... 7

9 Cell bernilai 0 dan 3 diagonal (Conceptis puzzle 1997). ... 7

10 Dua cell bernilai 3 yang bertetangga (Conceptis puzzle 1997). ... 7

11 Dua cell bernilai 3 dan diagonal (Conceptis puzzle 1997). ... 7

12 Angka apapun pada pojok cell (Conceptis puzzle 1997). ... 7

13 Arsitektur sistem. ... 8

14 Diagram alur proses solver slither link. ... 8

15 Representasi dari fakta slither link. ... 8

16 Representasi status garis di sekeliling cell arc(X,Y,0,0,0,1). ... 9

17 Cell dengan predikat arc(X,Y,1,0,0,0). ... 9

18 Cell dengan predikat arc(X,Y,1,0,0,0). ... 9

19 Cell dengan predikat arc(X,Y,0,0,1,0). ... 9

20 Cell dengan predikat arc(X,Y,0,0,0,1). ... 9

21 Cell dengan nilai 0. ... 9

22 Cell dengan nilai 1. ... 10

23 Cell dengan nilai 2. ... 10

24 Cell dengan nilai 3. ... 10

25 Local loop pada cell bernilai 3. ... 10

26 Constraint pada posisi pojok kiri atas. ... 11

27 Constraint pada posisi pojok kanan atas ... 11

28 Constraint pada posisi pojok kiri bawah. ... 11

29 Constraint pada posisi pojok kanan bawah. ... 11

30 Antisipasi cabang. ... 12

31 Ketersambungan dari garis. ... 12

32 Local loop dengan 2 cell bernilai 3. ... 12

33 Cell bernilai 2 yang bersebelah dengan 0. ... 12

34 Slither link hasil pembangkitan. ... 13

35 Solusi slither link. ... 13

36 Ilustrasi penomoran sisi pada grid. ... 13

(10)

vi

DAFTAR LAMPIRAN

Halaman

1 Program DLV, modul pembangkitan. ... 17

2 Program DLV, constraint cell dengan nilai 0, 1, 2, dan 3. ... 18

3 Program DLV, constraint mencegah local loop. ... 19

4 Program DLV, constraint pada cell dengan posisi di pojok grid. ... 20

5 Program DLV, constraint untuk mengantisipasi cabang dan ketersambungan garis. ... 21

6 Program DLV, constraint dari cell bernilai 2 yang bersebelahan dengan cell bernilai 0. ... 22

7 Pseudo code program C++ untuk membaca fakta slither link. ... 23

8 Pseudo code program C++, modul basic_rule . ... 24

9 Pseudo code program C++, modul advance_rule . ... 25

10 Pseudo code program C++, modul cek_garis_cell . ... 26

11 Pseudo code program C++, modul sambung_garis dan modul cek_cabang. ... 27

(11)

1

PENDAHULUAN

Latar Belakang

Slither link adalah salah satu permainan kertas terkenal yang sulit untuk dipecahkan secara konvensional. Tujuan dari slither link adalah membentuk loop, yaitu sebuah putaran garis yang tidak bercabang dan kembali ke titik awal tetapi harus memenuhi aturan slither link yaitu jumlah garis yang mengelilingi cell harus sama dengan angka di dalam cell. Penyelesaian untuk persoalan ini harus melibatkan algoritme yang mencari kemungkinan semua solusi. Hal ini menyebabkan kompleksitas dari eksekusi algoritme ini akan menjadi eksponensial terhadap ukuran masukan yang diberikan. Permasalahan ini lebih dikenal sebagai Nondeterministic Polynomial-time Complete (NP-Complete).

Teknik pemrograman komputer mempunyai banyak paradigma atau teknik untuk menyelesaikan sebuah masalah, pemilihan teknik pemrograman yang tepat akan memberikan cara paling efektif untuk mendapatkan solusi dari masalah ini. Salah satunya adalah teknik procedural programming. Teknik ini akan memberi sekumpulan instruksi untuk komputer berupa langkah-langkah, dan perintahnya bersifat linear untuk menyelesaikan sebuah masalah dengan menggunakan loop dan percabangan.

Teknik lain yang digunakan dalam pemrograman komputer adalah logic programming yang bersifat deklaratif, teknik ini akan mengubah masalah menjadi sekumpulan fakta dan aturan. Dengan melakukan pendekatan secara logika, sebuah model penyelesaian akan menyelesaikan slither link mirip dengan logika manusia. Metode ini akan memberikan cara yang lebih efisien dalam menemukan solusi dari slither link, salah satunya adalah dengan menggunakan answer set programming.

Tujuan Penelitian

Tujuan dari penelitian ini adalah untuk membuat model penyelesaian game slither link menggunakan answer set programming dengan tool DLV (datalog with disjunction) dan procedural programming menggunakan C++ kemudian membandingkan kinerja dari kedua metode tersebut.

Ruang Lingkup Penelitian

Ruang lingkup permasalahan pada tugas ini adalah :

1 Membuat model penyelesaian game slither link. dengan menggunakan answer set programming dan procedural programming.

2 Ukuran pembanding adalah rata-rata waktu eksekusi dari setiap model solver.

3 Software yang digunakan adalah PHP sebagai front end dan DLV serta C++ sebagai back end.

Manfaat Penelitian

Penelitian ini diharapkan dapat menunjukkan bahwa answer set programming bisa menyelesaikan masalah game slither link NP-Complete sebagaimana procedural programming melakukannya.

TINJAUAN PUSTAKA

NP-Complete

Setiap masalah bisa diselesaikan dengan berbagai jenis algoritme, tapi algoritme yang disebut efisien adalah algoritme yang bisa menyelesaikan masalah dalam waktu polinomial untuk semua input. Algoritme yang disebut tidak efisien adalah algoritme yang menyelesaikan masalah dalam waktu eksponensial untuk beberapa input. Ada tiga kelas masalah yaitu P, NP, dan NPC.

Kelas P (polinomial) berisi masalah-masalah yang bisa dalam waktu polinomial, sebuah fungsi f(n) dikatakan P jika f(n) = O(nk) dengan k bernilai konstan dan n adalah ukuran dari input. Contoh masalah yang bisa diselesaikan dengan waktu polinomial adalah masalah sorting, dari semua algoritme sorting kompleksitas terbaiknya untuk kasus worst case adalah O(n2) dan O(n log n) untuk kasus best case (Cormen et al. 2001).

(12)

2 Kelas NPC atau NP-Complete (non

deterministic polynomial complete) adalah persoalan NP yang paling sulit. Sebuah masalah X dikatakan NP-Complete jika :

1 X termasuk ke dalam kelas NP.

2 Setiap persoalan di dalam NP dapat ditransformasi dalam waktu polinomial menjadi X.

Jika sebuah masalah X hanya memenuhi kondisi nomor dua, maka masalah tersebut dikatakan NP-hard. Jika salah satu masalah NP-Complete bisa diselesaikan dengan waktu polinomial, maka semua masalah NP-Complete bisa diselesaikan dalam waktu polinomial. Beberapa masalah NP-Complete yang terkenal adalah Hamiltonian Cycle Problem dan Subset Sum. Masalah NP-Complete pertama yang berhasil dipecahkan adalah SATISFIABILITY (SAT) oleh Stephen Cook yang disebut teorema Cook (Garey et al 1979).

Semua persoalan P (polinomial) juga adalah NP (non deterministic poyinomial), P adalah himpunan bagian dari NP. Namun belum ada yang bisa membuktikan apakah masalah P≠NP atau P = NPsehingga P NPC =∅. Gambar 1 adalah ilustrasi hubungan antara P, NPC, dan NP.

Gambar 1 Hubungan antara P, NP, dan NPC (Cormen et al 2001).

Logic Programming

Logic (declarative) programming muncul sebagai paradigma berbeda pada tahun 1970-an, karena logic programming mengharuskan programmer untuk mendeklarasikan tujuan (goal) dari komputasi. Goal diekspresikan sebagai kumpulan dari aturan tentang hasil dan constraint (pembatas) dari komputasi. Logic programming disebut juga sebagai rule-based programming (Tucker et al 2002).

Secara umum, logic programming merepresentasikan masalah dalam bentuk aturan dan fakta. Sebuah aturan ditulis sebagai :

h ← p1, p2, ..., pn.

Sebagai contoh, misalnya kita mendapatkan fakta bahwa Allen dan Mary berbicara bahasa Rusia, Bob berbicara bahasa Inggris. Sedangkan aturannya adalah seseorang bisa berbicara dengan orang lain yang bernilai benar ketika mereka berbicara dalam bahasa yang sama. Maka kita bisa menulisnya sebagai fakta dan aturan berikut:

speaks(allen,russian). speaks(bob,english). speaks(mary,russian).

talkswith(P1, P2) :- speaks(P1,L), speaks(P2,L), P1\=P2.

Contoh eksekusi program : ?- speaks(alen,russian). true.

?- talkswith(X,allen). returns X = mary.

Answer set programming

Answer set programming (ASP) adalah sebuah bentuk pemrograman berorientasi deklaratif untuk menyelesaikan masalah pencarian solusi yang sulit terutama masalah dengan kompleksitas tinggi (diatas ∑2�) Answer

Set Programming adalah pengembangan dari Logic Programming dan telah diaplikasikan di banyak bidang ilmu pengetahuan.

Answer set semantics adalah salah satu formalisme yang paling populer dan semantik yang paling umum diterima dalam pemrograman logika, semantik ini mendefinisikan stable model yang memperbolehkan negasi dan disjungsi dalam aturan. Kelebihan ASP dibandingkan pemrograman berbasis Prolog adalah semantik yang jelas menjamin program bisa berhenti. Pemrograman berbasis Prolog tidak murni deklaratif karena semantik yang disediakan oleh Prolog masih bergantung pada aspek prosedural dari program, seperti urutan dari bagian body pada aturan.

Penyempurnaan lain yang ditawarkan ASP adalah semantik yang jelas untuk menangani program tidak stratified yang tidak bisa dilakukan oleh Prolog. Misalnya kita mempunyai pernyataan : “jika seseorang bisa diasumsikan bukan laki-laki maka orang tersebut pasti seorang wanita”, dalam ASP pernyataan tersebut ditulis sebagai berikut :

female(X) ← person(X), not male(X). male(X) ← person(X), not female(X).

(13)

3 himpunan jawaban berisi male(a). Fitur

penting lain dari ASP adalah kemampuannya untuk menggunakan ekspresi disjungsi (“V”)

pada head dari aturan. ASP menjadi sangat deklaratif untuk berbagai masalah. Sebagai contoh, program sebelumnya bisa ditulis menggunakan satu aturan seperti berikut :

female(X) V male(X) ← person(X).

Penggunaan disjungsi pada head akan meningkatkan kekuatan ekspresif dari ASP . Syntax ASP

Pada Answer Set Programming terdefinisi penggunaan tiga buah simbol yaitu, predikat (p), konstanta (k), dan variabel (ν). Predikat adalah simbol yang diawali dengan huruf kecil sedangkan variabel adalah simbol yang diawali dengan huruf besar. Sebuah simbol konstanta bisa bernilai numerik. Sebuah term bisa berupa konstanta atau variabel. Dalam sebuah simbol predikat p, sebuah atom didefinisikan sebagai

�1,…,�� dimana untuk setiap ��, 1≤ � ≤ �

adalah sebuah term yang bisa berupa konstanta atau variabel, k disebut aritas dari p. Atom dengan aritas () disebut atom proporsional. Sebuah classical literal l bisa berupa sebuah atom p (positif), atau sebuah negasi atom ¬p (negatif).

Dua tipe negasi dalam ASP yaitu, default negation dengan bentuk “not b” yang berarti tidak ada bukti yang menunjukkan bahwa b berniali benar maupun b bernilai salah. Explicit negation dengan bentuk “¬b” yang berarti kita mempunyai bukti bahwa b bernilai salah.

Sebuah rule (r) dalam ASP mempunyai bentuk :

1 … � ← 1,…, , � +1,…, �

Himpunan dari 1 … � adalah head

dari aturan r, dinotasikan dengan (�), sedangkan himpunan dari

1,…, , � +1,…, � adalah body

dari r dan dinotasikan dengan � . Ada dua tipe body yaitu positive body literal yang dinotasikan sebagai + dimana

+=

1,…, , dan negative body literal

dimana =

+1,…, �

sehingga � = + � − � .

Sebuah rule r tanpa head � = 0 disebut sebagai hard constraint, sebuah rule dengan tepat satu head �= 1 disebut sebagai normal rule, sedangkan sebuah rule dengan k > 1 disebut sebagai disjunctive rule. Jika body dari rule kosong �= = 0 maka rule tersebut disebut sebagai fact atau dengan kata lain kita

tidak menggunakan tanda “←”. Sebuah rule dikatakan positif jika n = m atau dengan kata lain dalam bahasa matematika ∀� ∈ � ∶

= , dan disebut juga sebagai horn rule.

Answer Set Semantics

Semantics dari program P adalah program yang bebas dari variabel, maka kita harus mendefinisikan ground instantiation dari program yang akan mensubstitusi semua variabel dari program dengan konstanta.

Herbrand Universe dari P (Program) atau kita sebut � , adalah himpunan semua simbol yang dibentuk dari konstanta dalam P.

Herbrand Literal Base berarti untuk setiap program P, adalah himpunan dari semua ground (classical) literal yang dibangun dari simbol predikat yang muncul pada P dan konstanta dari � .

Ground Instantiation berarti untuk setiap rule r, Ground(r) menotasikan himpunan rule yang didapatkan dengan mengganti setiap variabel yang muncul di r dengan simbol konstanta dalam � . Dinotasikan dengan Ground(P) yaitu himpunan dari semua ground instances dari rule pada P.

Semantics dari program P didefinisikan dengan mencari positive ground program. Sebuah interpretasi I adalah subset dari . Sebuah himpunan dari literals S memenuhi sebuah rule r jika dan hanya jika � � ≠ ∅ kapanpun + � ⊆ � dan − � �=∅. Himpunan dari literal S memenuhi sebuah program P jika memenuhi seluruh rule pada P. Sebuah model dari program P adalah sebuah interpretasi ⊆ dimana I harus memenuhi P. Sebuah answer set dari ground program yang positif adalah model minimal dari P.

Hasil reduksi atau Gelfond-Lifschitz transform (GL-transform) adalah program ground positive yang didapatkan dari Ground(P) dengan cara :

1 Menghapus semua rule r ∈ Ground(P) sehingga − � ≠ ∅.

2 Menghapus literal body negatif dari rule yang tersisa.

(14)

4 ada minimal satu answer set A ∈ ANS(P),

dimana ∈ . Sedangkan sebuah ground classical literal a dikatakan cautiously true jika setiap answer set A ∈ ANS(P), dimana ∈ . Jika terjadi kasus spesial dimana program P definite-horn, dalam kasus ini P memiliki tepat satu answer set dan dinotasikan dengan Tp atau immediate consequence (Gelfond et al 1991).

Berdasarkan answer set semantics , maka terdefinisi reasoning task sebagai berikut : 1 Answer set existence, buktikan program P

memiliki paling sedikit satu buah answer set (selain itu maka program dikatakan tidak konsisten).

2 Brave reasoning, diberikan program P dan sebuah atom a maka buktikan apakah a benar pada minimal satu answer set P. 3 Cautious reasoning, diberikan program P

dan sebuah atom a maka buktikan apakah a benar dalam semua answer set P.

4 Generate all answer sets, diberikan program P maka hitung semua answer sets A ∈ ANS(P).

DLV (datalog with disjunction)

Untuk melakukan implementasi answer set programming para peneliti membuat ASP solver untuk mengevaluasi dan menampilkan answer set, beberapa ASP solver yang terkenal adalah DLV, clasp/claspD, SMODELS, dan ASSAT. ASP solver yang digunakan untuk menyelesaikan masalah slither link adalah DLV

(

datalog with disjunction

). DLV dikembangkan

oleh University of Calabria dan Vienna Technical University. DLV adalah alat untuk mengkomputasi answer set yang mengimplemtasikan pemrograman logika disjungsi dengan menggunakan semantik answer set (Gelfond et al 1991).

Disjunctive datalog memperbolehkan ekspresi logika OR (disjungsi) muncul didalam aturan. Kelebihan dari DLV adalah komputasinya sound and complete, sound adalah solusi yang dihasikan merupakan jawaban dari masalah dan complete adalah semua solusi harus muncul. Struktur dari DLV adalah :

Rule :

1 … ∶ −

1,…, �, � �+1,…, � .

Constraint :

:− 1,…, , � +1,…, � .  Program :

Sebuah himpunan terbatas P yang terdiri atas rules dan constraints.

Dengan mengikuti paradigma

Guess/Check/Optimize (GCO) masalah dengan kompleksitas tinggi bisa diselesaikan. GCO untuk program P akan terdiri atas tiga bagian berikut :

1 Bagian Guessing.

Bagian guessing akan mendefinisikan search space (ruang pencarian) yang merepresentasikan kandidat solusi. Pada bagian ini kita berusaha menebak semua solusi yang mungkin muncul.

2 Bagian Checking.

Bagian ini bersifat opsional yang akan memfilter kandidat solusi sedemikian rupa sehingga answer sets dari P akan merepresentasikan solusi yang bisa diterima untuk instance masalah. Pada bagian ini kita menuliskan constraint agar solusi yang muncul hanya solusi yang diinginkan. 3 Bagian optimization.

Bagian ini memungkinkan untuk mengekspresikan evaluasi bobot kuantitatif dari solusi dengan menggunakan weak constraint.

Misalnya kita akan memodelkan bahwa setiap kali seseorang memberitahu kita sebuah lelucon, maka kita tertawa. Hal ini bisa dilakukan dengan cara berikut :

joke.

laugh :- joke.

Baris pertama adalah fakta dan mengekspresikan bahwa joke adalah benar. Baris kedua adalah aturan, ini dibaca sebagai “ jika lelucon adalah benar, maka tertawa juga harus benar”. (tanda “:-“ berarti sebuah panah ke kiri, pemrograman logika mengartikannya sebagai implikasi).

Salah satu masalah NP-Complete yang terkenal adalah Graph 3-Colorability (Garey et al 1979). Diberikan (undirected) graf G

={V,E}, putuskan bagaimana memberi warna

(15)

5

Minnesota Iowa

Illinois

Michigan

Wisconsin indiana

Ohio

Gambar 2 Graf tujuh kota.

% aturan pewarnaan (guess)

col(Country, red) v col(Country,green) v col(Country, blue) :- node(Country).

% periksa warna yg incident(check) :- arc(Country1, Country2), col(Country1, CommonColor), col(Country2, CommonColor).

DLV akan menghasilkan enam solusi, dan semua solusi memenuhi ketentuan graph coloring (graf tiga warna). Berikut adalah salah satu solusi yang dihasilkan :

{col(minnesota,green),

col(wisconsin,red), col(illinois,green), col(iowa,blue), col(indiana,red), col(michigan,blue), col(ohio,green) }

Slither link

Slither link ditemukan tahun 1989 oleh perusahaan puzzle jepang Nikoli, slither link juga dikenal sebagai Fencesand Loop the Loop dan Dotty Dilemma. Slither link dimainkan dalam grid empat persegi panjang dengan beberapa nomor terisi didalam grid (tidak semua terisi). Masalah slither link telah terbukti NP-Complete (Yato 2003) sehingga bisa ditangani oleh answer set programming.

Tingkat kesulitan dari slither link didefinisikan berdasarkan luas persegi atau papan permainannya dan angka yang terisi di dalam grid. Aturan dari slither link adalah sebagai berikut :

1 Setiap masalah di representasikan dalam grid empat persegi panjang. Panjang dari persegi tersebut menunjukkan ukuran dari masalah.

2 Sebuah 1 x1 persegi dikelilingi oleh empat titik yang disebut cell. Sebuah cell bisa mempunyai nomor antara null, 0, 1, 2, atau 3.

3 Tujuan dari permainan adalah membuat loop yang tidak memotong atau bercabang dengan menghubungkan titik-titik yang bertetangga dengan garis, sehingga sebuah nomor dalam cell nilainya sama dengan jumlah garis yang mengelilingi cell tersebut.

Nomor didalam cellslither link yang belum terselesaikan dipilih sedemikian sehingga mempunyai solusi yang unik, Gambar 3 adalah contoh masalah slither link dan penyelesaiannya :

Gambar 3 Masalah slither link dan solusinya (Yato 2003).

METODOLOGI

Formulasi aturan pembangkitan slither link

Aturan-aturan yang berlaku dalam pembangkitan slither link dikumpulkan. Aturan-aturan tersebut diformulasikan ke dalam bahasa logika answer set programming. Untuk pembangkitan slither link secara acak langkah-langkah yang harus dilakukan adalah (Wan 2009) :

1 Mengisi grid dengan sembarang loop. 2 Secara acak hapus nomor di dalam cell satu

per satu.

3 Periksa apakah slither link masih bisa menghasilkan solusi yang unik.

4 Hapus semua edge.

5 Tampilkan hasil pada pengguna.

Slither link yang dibangkitkan harus secara acak. Ketika menghapus nomor di dalam cell, algoritme pembangkitan harus memastikan bahwa slither link yang dihasilkan bisa diselesaikan menggunakan aturan logika. Proses ini dikerjakan oleh modul back end dan ditunjukkan pada Gambar 4.

(16)

6 Slither link yang ingin dibangkitkan adalah

slither link yang berada di tengah pada grafik perbandingan antara tingkat kesulitan puzzle dan jumlah constraint pada puzzle seperti ditunjukkan pada Gambar 5 berikut :

Gambar 5 Grafik tingkat kesulitan puzzle berbanding dengan constraint puzzle.

Gambar 5 bermakna bahwa slither link yang optimal adalah yang memiliki jumlah constraint yang tidak terlalu sedikit dan tidak terlalu banyak sehingga solusi yang dihasilkan unik dan sulit ditemukan, tetapi jika constraint sedikit maka solusi dari slither link kemungkinan banyak, dan sebaliknya jika constraint terlalu banyak maka kemungkinan slither link tidak mempunyai solusi. Untuk mendapatkan slither link dengan jumlah constraint yang tepat sangat sulit.

Formulasi aturan penyelesaian

Solusi yang dihasilkan akan dimodelkan sebagai graf yang mempunyai loop di dalam grid yang memenuhi aturan slither link. Maksud dari pernyataan tersebut adalah graf yang dihasilkan adalah solusi dari slither link dimana dalam setiap cell yang terdapat angka di dalamnya maka jumlah edge yang mengelilingi cell tersebut harus sesuai dengan angka di dalam cell tersebut. Dengan paradigma Guess and Check maka :

1 Guess

Akan ditebak semua kemungkinan graf (kandidat solusi) yang akan muncul dalam slither link, semua graf yang muncul adalah graf yang mempunyai loop atau cycle. 2 Check

Kandidat solusi yang dibangkitkan oleh prosedur guess diperiksa kembali dengan constraint yang ditentukan sehingga didapatkan solusi yang memenuhi aturan slither link.

Gambar 6Formulasi Penyelesaian. Cara termudah untuk menyelesaikan slither link adalah mengeliminasi garis dimana garis tersebut tidak seharusnya berada, cara ini dilakukan dengan memberikan nilai 0 untuk garis tersebut. Misalnya sebuah cell dengan nilai 0 tidak boleh mempunyai garis di sekelilingnya, maka semua garis yang mengelilingi cell tersebut harus dieliminasi. Petunjuk-petunjuk tersebut direpresentasikan dalam bentuk rule, dan berikut adalah petunjuk atau teknik untuk membantu menyelesaikan masalah slither link :

1 Tidak boleh ada garis di sekeliling cell dengan nilai 0. Perhatikan angka 0 pada contoh berikut, angka 0 berarti sebuah cell tidak boleh dikelilingi oleh garis maka berikan tanda X pada keempat sisinya untuk menandakan bahwa tidak boleh ada garis pada posisi tersebut.

Gambar 7 Cell dengan nilai 0 (Conceptis puzzle 1997).

2 Cell dengan nilai 0 dan 3 yang bertetangga. Contoh berikut menggambarkan cell dengan angka 3 yang berada di bawah cell dengan angka 0. Garis diatas cell yang bernilai 3 diberi tanda X maka hanya ada satu cara untuk menyelesaikan garis di sekeliling cell dengan nilai 3 yaitu pada kiri, bawah, dan kanan cell tersebut.

(17)

7 Gambar 8 Cell bernilai 0 dan 3 yang

bertetangga (Conceptis puzzle 1997).

3 Cell dengan nilai 0 dan 3 dengan posisi diagonal. Pada Gambar 9 bagian kiri diilustrasikan dua buah skenario jika terjadi diagonal antara 0 dan 3 dengan garis keabuan, berdasarkan fakta tersebut maka gambar di sebelah kanan pada Gambar 9 menggambarkan petunjuk ketika terjadi skenario ini.

Gambar 9 Cell bernilai 0 dan 3 diagonal (Conceptis puzzle 1997).

4 Cell dengan nilai 3 yang bertetangga. Hanya ada dua solusi yang mungkin untuk skenario ini dan digambarkan pada Gambar 10 bagian kiri dengan garis keabuan. Berdasarkan fakta tersebut maka Gambar 10 bagian kanan menggambarkan petunjuk yang harus dilakukan jika skenario ini terjadi.

Gambar 10 Dua cell bernilai 3 yang bertetangga (Conceptis puzzle 1997).

5 Cell dengan dua nilai 3 yang diagonal. Ada dua kemungkinan solusi untuk menangani skenario ini, salah satunya ditunjukkan pada Gambar 11 bagian kiri. Berdasarkan fakta tersebut maka ada empat garis yang pasti ada jika skenario ini terjadi, dan digambarkan pada Gambar 11 bagian kanan dengan warna merah. Untuk mencegah percabangan, berikan tanda X pada empat sisi lain.

Gambar 11 Dua cell bernilai 3 dan diagonal (Conceptis puzzle 1997). 6 Angka apapun pada pojok grid. Cell yang

terletak di pojok grid memiliki karakteristik khusus untuk angka berapapun yang dimilikinya. Angka 0 sudah dijelaskan pada teknik pertama, angka 1 akan mengugurkan dua sisi pada pojok cell karena tidak mungkin sebuah garis akan terbentang pada posisi tersebut, maka berikan tanda X pada dua sisi tersebut. Angka 2 memiliki dua solusi yang mungkin tetapi kedua solusi tersebut pasti memiliki awal garis yang sama dan digambarkan pada gambar di kanan. Angka 3 pada pojok grid memiliki dua solusi yang mungkin, dan garis merah menggambarkan garis yang pasti terbentang untuk angka 3 pada pojok grid.

Gambar 12 Angka apapun pada pojok cell (Conceptis puzzle 1997). Pembangunan front end

(18)

8 Arsitektur sistem Backend Backend Identifikasi aturan-aturan pembangkitan slither link Pembangkitan slither link Identifikasi aturan-aturan penyelesaian slither link Penyelesaian Slither link Front End GUI Parser

Gambar 13 Arsitektur sistem.

Arsitektur sistem ini terdiri atas tiga bagian yaitu, modul back end, modul front end, dan modul parser. Pada bagian back end akan di kerjakan oleh DLV dan C++, bagian ini adalah bagian utama yang menangani pembangkitan dan penyelesaian slither link dengan answer set programming maupun dengan procedural programming. Kemudian bagian parser adalah bagian penghubung yang bertugas sebagai modul penerjemah. Gambar 14 menggambarkan sebuah diagram alur tentang bagaimana sebuah solver slither link bekerja menghasilkan solusi.

Gambar 14 Diagram alur proses solver slither link.

HASIL DAN PEMBAHASAN

Masalah slitherlink diselesaikan dengan metodologi pemrograman deklaratif dengan terlebih dahulu mendeskripsikan masalah, kemudian melakukan proses encoding kondisi

solusi yang diinginkan ke dalam bahasa logika DLV menggunakan paradigma GCO (guess / check / optimize) agar solver bisa menyelesaikannya. Sebagai perbandingan dibuat juga model penyelesaian slither link dengan menggunakan procedural programming dengan software C++, kedua metode ini akan dibandingkan rata-rata waktu eksekusinya. Domain masalah dalam DLV

Solusi untuk masalah slither link adalah membuat loop sedemikian sehingga loop yang dihasilkan memenuhi kondisi nilai yang terdapat pada cell dalam grid, arti kata memenuhi adalah garis jumlah garis yang mengelilingi cell harus memiliki jumlah yang sama dengan angka yang terdapat di dalam cell.

Sebuah cell dalam slither link direpresentasikan dengan predikat C(X,Y,N)

yang memiliki tiga argumen yaitu, X dan Y

yang berarti koordinat cell dalam grid (X

koordinat vertikal dan Y koordinat horizontal) , dan N yang berarti angka yang terdapat di dalam cell. N bisa bernilai 0, 1, 2, 3, atau null. Himpunan dari predikat C disebut sebagai fakta atau deskripsi dari masalah slither link yang akan diselesaikan, seperti pernyataan berikut mengilustrasikan fakta untuk slither link dengan ukuran 3x3.

C(1,1,null). C(1,2,null). C(1,3,2). C(2,1,1). C(2,2,0). C(2,3,3). C(3,1,2). C(3,2,null). C(3,3,null).

Fakta tersebut adalah representasi dari Gambar 15:

Gambar 15 Representasi dari fakta slither link.

Predikat arc(X,Y,A,B,C,D) memiliki enam argumen didalamnya yang merepresentasikan posisi cell dan status garis-garis di sekeliling cell, dimana X dan Y

merepresentasikan posisi cell (X koordinat vertikal dan Y koordinat horizontal), sedangkan

(19)

9 tersebut, dan jika bernilai 1 maka ada garis

terbentangdi posisi tersebut. A berposisi di atas cell, B berposisi di sebelah kanan cell , C berposisi di bagian bawah cell, dan D berposisi di sebelah kiri cell seperti ditunjukkan pada Gambar 16.

Gambar 16 Representasi status garis di

sekeliling cell

arc(X,Y,0,0,0,1).

Encoding dengan DLV

Sebelumnya pada bagian metodologi telah dijelaskan mengenai beberapa teknik atau petunjuk cara menyelesaikan slither link, teknik itulah yang akan diterjemahkan ke bahasa logika secara deklaratif menggunakan paradigma GC(guess, check).

Langkah pertama yang dilakukan adalah mendefinisikan ruang pencarian yaitu bagian guess pada program, pada bagian ini terdapat empat aturan disjungsi yang mendefinisikan ruang pencarian dari masalah yaitu cell dengan nilai 0, 1, 2, 3, dan null dijelaskan pada Lampiran 1. Misalnya untuk cell dengan nilai 1 maka cell tersebut mempunyai empat kemungkinan solusi untuk dibangkitkan. Kode program berikut menggambarkan bagaimana sebuah cell bernilai 1 dibangkitkan kemungkinan solusinya.

arc(X,Y,1,0,0,0) v arc(X,Y,0,1,0,0) v arc(X,Y,0,0,1,0) v arc(X,Y,0,0,0,1) :- C(X,Y,1).

Berikut adalah representasi bentuk cell dari solusi yang telah dibangkitkan :

1 arc(X,Y,1,0,0,0)

Gambar 17 Cell dengan predikat arc(X,Y,1,0,0,0).

2 arc(X,Y,0,1,0,0)

Gambar 18 Cell dengan predikat arc(X,Y,1,0,0,0).

3 arc(X,Y,0,0,1,0)

Gambar 19 Cell dengan predikat arc(X,Y,0,0,1,0).

4 arc(X,Y,0,0,0,1)

Gambar 20 Cell dengan predikat arc(X,Y,0,0,0,1).

Kemudian langkah selanjutnya adalah mendefinisikan constraint atau aturan yang akan menghapus calon answer set yang tidak memenuhi syarat, bagian ini masuk ke dalam metode check. Constraint dari program adalah : 1 Cell dengan nilai 0 (lihat Lampiran 2). Sebuah cell dengan nilai 0 tidak boleh memiliki garis yang mengelilinginya, dan hal tersebut berakibat juga pada cell disebelah kiri atau kanan maupun pada atas dan bawah cell dengan nilai 0 tersebut. Dengan bahasa logika aturan ini diterjemahkan menjadi :

:- arc(X,Y,0,0,0,0), arc(A,Y,_,_,1,_), X=A+1.

Answer set yang tidak akan tereliminasi adalah sebagai berikut :

Gambar 21 Cell dengan nilai 0. 2 Cell dengan nilai 1 (lihat Lampiran 2).

(20)

10 di posisi D selain itu maka hapus kandidat

tersebut. Aturan ini diterjemahkan menjadi :

:- arc(X,Y,0,1,0,0), arc(X,B,_,_,_,0), B=Y+1.

Tanda “_” adalah anonymous variable yang

bermakna bahwa argumen ini bisa dihiraukan atau berapapun nilainya tidak mempengaruhi rule. Answer set yang tidak akan tereliminasi adalah sebagai berikut :

Gambar 22 Cell dengan nilai 1. 3 Cell dengan nilai 2 (lihat Lampiran 2).

Serupa dengan aturan sebelumnya dimana aturan ini akan mempengaruhi jumlah garis yang mengelilingi tetangganya, karena nilai dari cell ini adalah 2 maka ada dua garis yang harus bernilai 1 dan dua garis lainnya bernilai 0, begitu juga pada dua buah cell tetangga dari cell ini. Misalnya cell yang bernilai 2 memiliki garis pada posisi A dan B

maka tetangga yang berada di atas harus memiliki nilai 1 pada sisi di posisi C dan tetangga di sebelah kanan harus memiliki nilai 1 pada sisi di posisi D, jika menyalahi aturan ini maka eliminasi answer set tersebut. Aturan ini diterjemahkan menjadi .

:- arc(X,Y,1,1,0,0), arc(X,B,_,_,_,0), B=Y+1. :- arc(X,Y,1,1,0,0), arc(A,Y,_,_,0,_), X=A+1.

Constraint pertama merepresentasikan cell di sebelah kanan cell yang bernilai 2, dan constraint kedua merepresentasikan cell di atas cell bernilai 2. Answer set yang tidak akan tereliminasi adalah sebagai berikut :

Gambar 23 Cell dengan nilai 2. 4 Cell dengan nilai 3 (lihat Lampiran 2). Cell

dengan tipe seperti ini adalah kebalikan dari cell dengan nilai 1, jika pada cell dengan nilai 1 memiliki tiga garis dengan nilai 0 maka cell dengan nilai 3 memiliki tiga garis dengan nilai 1 dan satu garis lainnya bernilai 0. Cell dengan tipe ini mengharuskan tiga tetangganya memiliki nilai 1 pada sis yang bertetangga, dan satu tetangganya memiliki nilai 0 pada sisi yang bertetangga. Misalnya sebuah cell dengan nilai 3 memiliki garis

pada posisi A, B, dan C maka tetangga yang berada di atas cell tersebut harus memiliki nilai 1 pada sisi di posisi C, begitu juga dengan tetangga yang berada di sebelah kanan yang harus memiliki nilai 1 pada sisi di posisi D, dan tetangga yang berada di bawah harus memiliki nilai 1 pada sisi di posisi A. Skenario tersebut digambarkan oleh constraint berikut :

:- arc(X,Y,1,1,1,0), arc(X,B,_,_,_,0), B=Y+1. :- arc(X,Y,1,1,1,0), arc(A,Y,_,_,0,_), X=A+1. :- arc(X,Y,1,1,1,0), arc(A,Y,0,_,_,_), A=X+1.

Answer set yang tidak akan tereliminasi adalah sebagai berikut :

Gambar 24 Cell dengan nilai 3. 5 Mencegah local loop (lihat Lampiran 3).

Untuk mencegah local loop yaitu loop yang terjadi pada satu buah cell

atau dengan kata

lain cell tersebut mempunyai nilai 4 yang tidak diperbolehkan dalam aturan slither link maka eliminasi answer set dimana sebuah cell yang sudah memiliki tiga sisi bernilai 1 dan sisi lainnya bernilai 0 tetapi sisi bernilai 0 tersebut ternyata bernilai 1 pada tetangganya sehingga mengakibatkan local loop. Local loop hanya mungkin terjadi pada cell yang mempunyai tiga sisi yang bernilai 1, untuk mencegah hal ini maka definisikan constraint berikut :

:- arc(X,Y,1,1,1,0), arc(X,B,_,1,_,_), Y = B+1. :- arc(X,Y,0,1,1,1),

arc(A,Y,_,_,1,_), X = A+1. :- arc(X,Y,1,0,1,1),

arc(X,B,_,_,_,1), B = Y+1. :- arc(X,Y,1,1,0,1),

arc(A,Y,1,_,_,_), A = X+1.

Gambar 25 mengilustrasikan salah satu answer set yang akan dieliminasi oleh constraint di atas.

(21)

11 6 Constraint pada cell

dengan posisi

X = 1 dan

Y =1 (1,1). Constraint ini akan sangat membantu menyelesaikan slither link, karena kesalahan menempatkan garis pada cell di posisi ini akan mengakibatkan jalan buntu pada solusi dan akan langsung terlihat tanpa perlu menunggu cell lain terbuka garisnya (lihat Lampiran 4). Sebagai contoh jika cell memiliki nilai 1 maka kandidat solusi yang akan gugur adalah jika cell tersebut memiliki sisi yang bernilai 1 pada posisi A atau D karena hal tersebut akan mengakibatkan jalan buntu atau garis berhenti pada posisi itu, untuk mencegah hal ini maka didefinisikan constraint berikut :

:- arc(1,1,1,0,0,0). :- arc(1,1,0,0,0,1).

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 26 Constraint pada posisi pojok kiri atas.

7 Constraint pada cell dengan posisi (1, #maxint), #maxint adalah ukuran dari slither link sehingga cell tersebut terletak pada pojok kanan atas (lihat Lampiran 4). Sebagai ilustrasi jika cell pada posisi ini memiliki nilai 1, maka kandidat solusi yang akan gugur adalah jika cell tersebut memiliki sisi di posisi A atau B yang bernilai 1. Hal tersebut akan mengakibatkan terjadinya jalan buntu, atau garis tidak bisa menyambung dengan garis selanjutnya. Hal tersebut dicegah oleh constraint berikut :

:- arc(1,#maxint,1,0,0,0). :- arc(1,#maxint,0,1,0,0).

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 27 Constraint pada posisi pojok kanan atas

8 Constraint pada cell dengan posisi (#maxint ,1), #maxint adalah ukuran dari slither link. Cell dengan posisi ini terletak pada pojok kiri bawah dari grid (lihat Lampiran 4). Sebagai ilustrasi jika cell ini

mempunyai nilai 1 maka kandidat solusi yang akan gugur adalah yang mempunyai sisi bernilai 1 pada posisi D atau C. Constraint berikut mendefinisikan aturan tersebut dalam bahasa logika.

:- arc(#maxint,1,0,0,0,1). :- arc(#maxint,1,0,0,1,0).

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 28 Constraint pada posisi pojok kiri bawah.

9 Constraint pada cell dengan posisi (#maxint, #maxint), #maxint adalah ukuran dari slither link sehingga cell tersebut terletak pada pojok kanan bawah dari grid (lihat Lampiran 4). Sebagai ilustrasi jika cell pada posisi ini memiliki nilai 1, maka kandidat solusi yang akan tereliminasi adalah jika cell tersebut memiliki sisi yang berposisi di B atau C

yang bernilai 1. Untuk mengeliminasi kondisi tersebut maka constraint berikut harus didefinisikan :

:- arc(#maxint,#maxint,0,1,0,0). :- arc(#maxint,#maxint,0,0,1,0).

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 29 Constraint pada posisi pojok kanan bawah.

10 Antisipasi cabang (lihat Lampiran 5). Cabang akan mengacaukan loop yang dihasilkan, solusi dari slither link adalah sebuah loop maka solusi tersebut tidak boleh mempunyai cabang. Constraint ini akan mengeliminasi kandidat solusi yang mengakibatkan cabang, seperti jika sebuah cell mempunyai nilai 2 dan sisi yang bernilai 1 adalah A dan B maka cell di kanan atas dari cell tersebut tidak boleh memiliki nilai 1 pada sisi yang berposisi di D atau nilai 1 pada sisi yang berposisi di C. Hal seperti ini ditangani oleh constraint berikut :

:- arc(X,Y,1,1,_,_),

(22)

12

:- arc(X,Y,1,1,_,_),

arc(A,B,_,_,_,1), X=A+1, B=Y+1.

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 30 Antisipasi cabang. 11 Ketersambungan dari garis (lihat Lampiran

5). Himpunan garis penyusun loop tidak boleh terputus, maka sangat penting untuk memeriksa apakah antar himpunan garis penyusun loop merupakan sebuah rangkaian yang tersambung. Ilustrasi dari skenario ini adalah jika sebuah cell di sembarang posisi memiliki nilai 1 pada sisi di posisi A dan nilai 0 pada posisi D tanpa memperhatikan nilai dari posisi B dan C, maka ke arah kiri satu-satunya cara agar garis tersambung adalah dengan memperhatikan tetangga sebelah kiri atas apakah cell tersebut memiliki nilai 1 pada salah satu sisi dari B

atau C. Jika tidak memenuhi kondisi ini maka eliminasi kandidat solusi tersebut, skenario tersebut digambarkan dalam constraint berikut :

:- arc(X,Y,1,_,_,0),

arc(A,B,_,M,N,_), M=N, X=A+1, Y=B+1.

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 31 Ketersambungan dari garis. 12 Local loop dari cell dengan nilai 3 yang

bersebelahan (lihat Lampiran 3). Jika terdapat dua buah cell dengan nilai 3 yang bersebelahan baik di kiri dan kanan maupun pada atas dan bawah, ada kemungkinan konfigurasi keduanya membentuk local loop sehingga menyalahi aturan dari slither link. Yang dimaksud local loop pada skenario ini adalah loop yang terjadi antara dua cell yang memiliki nilai 3 tersebut, salah satu constraint yang digunakan adalah sebagai berikut :

:- arc(X,Y,1,1,0,1), arc(A,Y,0,1,1,1), A=X+1.

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 32 Local loop dengan 2 cell bernilai 3.

13 Cell bernilai 2 yang bersebelahan dengan cell bernilai 0 pada bagian atas, bawah, kiri, serta kanan dari grid (lihat Lampiran 6). Terdapat dua tipe kandidat solusi yang akan gugur jika skenario ini terjadi yaitu cell yang memiliki nilai 1 pada sisi A dan C serta cell yang memiliki nilai 1 pada sisi B dan D

karena pada salah satu sisi akan terjadi jalan buntu atau garis tidak bisa melanjutkan sehingga loop tidak terjadi. salah satu constraint yang digunakan adalah sebagai berikut :

:- arc(#maxint,Y,1,0,1,0), arc(#maxint,B,0,0,0,0), Y=B+1.

Constraint tersebut akan mengeliminasi calon answer set berikut :

Gambar 33 Cell bernilai 2 yang bersebelah dengan 0.

Bagian constraint yang telah dijelaskan sebelumnya akan mengeliminasi kandidat solusi yang tidak memenuhi aturan slither link sehingga answer set yang didapatkan merupakan solusi yang diharapkan.

Menjalankan model penyelesaian slither link

Fakta dari slither link yang telah dibangkitkan disimpan dalam file bernama

soal.dat dan program DLV untuk

penyelesaian slither link disimpan dalam file bernama slither.txt. Pemisahan file antara fakta dan program disebabkan karena fakta yang akan selalu berubah seiring dengan slither link yang dibangkitkan. Berikut akan diberikan ilustrasi bagaimana sebuah slither link diselesaikan menggunakan program DLV.

(23)

13 Gambar 34 Slither link hasil pembangkitan.

C(1,1,null). C(1,2,1). C(1,3,null). C(2,1,null). C(2,2,null). C(2,3,1). C(3,1,1). C(3,2,null). C(3,3,2).

Kemudian fakta ini akan diproses bersama dengan model penyelesaian slither link oleh DLV, sehingga menghasilkan answer set yang merupakan solusi.

D:\DLV>dlv.mingw.exe -nofacts -silent soal.dat slither.txt -N=3

{arc(1,2,1,0,0,0), arc(2,3,0,1,0,0), arc(3,1,0,1,0,0), arc(3,3,0,1,1,0), arc(1,1 ,1,0,1,1), arc(1,3,1,1,0,0), arc(2,1,1,1,0,0), arc(2,2,0,0,0,1), arc(3,2,0,0,1,1 )}

Solusi tersebut harus diterjemahkan kembali menjadi sebuah slither link kembali, maka jika answer set tersebut diterjemahkan menjadi sebuah slither link seperti ditunjukkan Gambar 35.

Gambar 35 Solusi slither link.

Implementasi dengan Procedural

Programming

Pada bagian metodologi telah ditunjukkan bahwa slither link mempunyai petunjuk-petunjuk yang bisa digunakan untuk menyelesaikan masalah. Petunjuk-petunjuk ini yang akan digunakan dalam membuat program ini. Program penyelesaian slither link menggunakan C++ ini terdiri atas enam modul dan satu fungsi.

Struktur data

Fakta tentang ukuran slither link dan nilai– nilai dalam cell yang dibangkitkan disimpan

dalam file ukuran.dat dan data.dat dengan format sebagai berikut :

/// ** data.dat **//

�1

�2 ...

��

Dimana � adalah nilai di dalam cell, dan k adalah jumlah cell dalam grid atau sebanyak ukuran grid dikuadratkan. Kemudian fakta ini akan dibaca oleh program sebagai array yang berukuran k.Kemudian setiap sisi pada grid diberi nilai default 3 yang berarti statusnya belum diketahui (lihat Lampiran 7), jika bernilai 0 berarti tidak boleh ada garis pada sisi tersebut dan jika bernilai 1 maka ada garis pada sisi tersebut. Representasi posisi garis pada slither link digambarkan pada Gambar 36 :

Gambar 36 Ilustrasi penomoran sisi pada grid.

Modul pertama bernama basic_rule, modul ini akan mengaplikasian teknik-teknik dasar penyelesaian slither link salah satunya adalah jika terdapat cell dengan angka 0 maka sisi-sisi yang yang dipengaruhi akan diberi nilai 0 dan beberapa teknik lain seperti telah dijelaskan sebelumnya pada bagian metodologi. Pseudo code modul dapat dilihat pada Lampiran 8.

Modul kedua bernama advance_rule, modul ini akan mencari kemungkinan terbukanya nilai dari sisi-sisi pada cell di posisi samping kiri, kanan, atas, dan bawah dengan melihat tetangganya. Misalnya pada cell dengan posisi di atas (i ≤ ukuran) dan cell tersebut bernilai 3 maka dengan melihat cell di sebelah kirinya diketahui bahwa sisi atas dari cell tersebut bernilai 0, kemudian program langsung memberi nilai 1 pada sisi atas dan kiri di cell yang bernilai 3. Pseudo code modul dapat dilihat pada Lampiran 9.

(24)

14 Modul keempat bernama sambung_garis,

modul ini akan menyambungkan sisi dari cell yang tidak mungkin bercabang lagi, dan tersisa satu kemungkinan arah menuju garis selanjutnya. Misalnya pada sisi atas cell ke arah kanan mempunyai tiga kemungkinan cabang yaitu ke atas, ke samping, dan ke bawah. Jika dua dari cabang tersebut bernilai 0 maka bisa dipastikan garis tersebut mengarah ke cabang yg tidak bernilai 0. Pseudo code modul dapat dilihat pada Lampiran 11.

Modul kelima bernama cek_cabang , modul ini akan memberi tanda berupa nilai 0 pada sisi yang berpotensi menjadi cabang, dan mengembalikan status dari setiap sisi pada grid. modul ini hanya mengubah nilai dari sisi yang masih bernilai 3 dan berpotensi menjadi cabang. Pseudo code modul dapat dilihat pada Lampiran 11.

Modul keenam bernama cek_logic, modul ini akan memeriksa cell yang mempunyai nilai null dan sudah bisa ditebak kemungkinan solusinya dengan memeriksa tetangganya. Cell yang diperiksa hanya yang berada pada posisi tertentu yang bisa ditebak secara pasti kemungkinan solusinya. Pseudo code modul dapat dilihat pada Lampiran 12.

Program ini memiliki satu buah fungsi dengan nama sambung. Fungsi ini akan melakukan perjalanan dari sisi yang pertama kali ditemui dan bernilai 1 dan kembali ke sisi tersebut sehingga perjalanan tersebut berupa sebuah loop yang memenuhi aturan slither link yaitu jumlah garis yang mengelilingi sebuah cell sesuai dengan nilai di dalam cell. Perjalanan akan terhenti jika menemui jalan buntu, kemudian cabang yang menyebabkan jalan buntu tersebut akan ditandai untuk ditutup kemudian fungsi akan mencoba cabang baru (backtracking) sampai solusi ditemukan. Status dari sisi yang bernilai 1 berguna sebagai petunjuk, karena jika masih bernilai 3 maka fungsi akan mendahului garis yang bernilai 1 dan kebalikannya jika sisi tersebut bernilai 0 maka fungsi tidak akan melaluinya. Pseudo code modul dapat dilihat pada Lampiran 12.

Hasil Pengujian

Pengujian dilakukan dengan

membangkitkan 30 soal slither link secara acak pada setiap ukuran puzzle, mulai dari ukuran puzzle 3x3 sampai dengan 20x20 kemudian dihitung waktu penyelesaian atau waktu eksekusi sampai dengan sebuah solusi didapatkan dari kedua metode yaitu answer set programming (ASP) dan procedural

programming (PP). Waktu yang digunakan sebagai perbandingan adalah rata-rata waktu eksekusi dari tiap ukuran, sistem memberi batas waktu (time out) yaitu 300 detik untuk menyelesaikan slither link jika sistem melewatinya maka ditandai. Waktu eksekusi tersebut dituliskan pada Tabel 1.

Tabel 1. Waktu eksekusi (detik) dari teknik Answer Set Programming (ASP) dan procedural programming (PP) dan waktu pembangkitan (detik).

Ukuran ASP PP

Pem bangkit

an

Jumlah Timeout

ASP PP

3 0,21 0,15 0,60

4 0,24 0,16 0,59

5 0,27 0,15 0,80

6 0,33 0,29 0,87

7 0,39 0,26 1,06

8 0,45 1,15 1,34

9 0,54 0,37 1,81

10 0,59 0,43 2,13

11 0,63 0,87 1,88

12 0,70 1,23 2,20

13 0,79 5,25 3,99 1

14 0,93 7,00 4,36

15 1,17 4,64 5,27

16 1,14 12,61 5,59

17 1,38 12,11 6,45 1

18 1,68 5,80 12,69 5

19 1,94 14,09 7,86 3

20 2,06 18,74 11,42 5

(25)

15 Gambar 37 Grafik perbandingan waktu eksekusi

dan ukuran slither link.

KESIMPULAN DAN SARAN

Kesimpulan

Tujuan utama dari penelitian ini adalah membuat model penyelesaian slither link dengan menggunakan paradigma answer set programming, paradigma ini akan menyelesaikan slither link seperti cara berpikir manusia dengan mengkodekan program ke dalam bahasa logika, berbeda dengan paradigma procedural programming dimana programmer menuliskan urutan instruksi untuk dikerjakan oleh komputer berupa operasi yang akan dilakukan dan nilai yang akan disimpan dalam variabel.

Paradigma answer set programming yang diaplikasikan pada masalah slither link terbukti efisien dan efektif dalam rata-rata waktu eksekusi dibandingkan menggunakan procedural programming dan dalam hal kualitas kode program yang dihasilkan meskipun procedural programming mendukung penggunaan fungsi tetapi karena ukuran kode program yang besar akan sulit ketika dilakukan pengembangan atau perubahan sistem. Model penyelesaian slither link telah sukses diaplikasikan ke bentuk web based sehingga berbentuk game interactive dengan menggunakan antar muka sehingga pengguna bisa memainkan slither link dan meminta penyelesaiannya.

Saran

Penelitian selanjutnya diharapkan bisa menerapkan answer set programming untuk membangkitkan soal slither link yang dijamin sulit, karena saat ini pembangkitnya menggunakan procedural programming yang tidak dijamin sulit solusinya. Memperbaiki kinerja dari penyelesaian slither link yang menggunakan procedural programming dengan menggunakan teknik lain.

DAFTAR PUSTAKA

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

Conceptis Puzzle. 1997. Slither link Technique.

[terhubung berkala].

http://www.conceptispuzzles.com/index.as px?uri=puzzle/slitherlink/techniques [12 januari 2011].

Eiter T, Gottlob G. 1993. Complexity Results for Disjunctive Logic Programming and Application to Nonmonotonic Logics. Technical University of Vienna. http://www.kr.tuwien.ac.at/staff/eiter/et-archive/ilps93.ps.gz .

Garey MR, Johnson DS. 1979. Computers and Intractability : a guide to the theory of NP-Completeness. United States of America : Bell Telephone Laboratories.

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

http://citeseerx.ist.psu.edu/viewdoc/downl oad?doi=10.1.1.49.9332&rep=rep1&type= pdf .

Leone N et al. 2006. The DLV System for Knowledge Representation and Reasoning. ACM Trans. Comput. Log.

Lifschitz V. 2008. What is Answer Set Programming. Department of Computer Sciences – University of Texas at Austin. http://userweb.cs.utexas.edu/users/vl/paper s/wiasp.pdf

Tucker AB, Noonan R. 2002. Programming Languanges : Principles and Paradigms. England : McGraw-Hill.

Wan J. 2009. Logical Slither link. Computer Science and Mathematics – School of

Computer Science.

http://intranet.cs.man.ac.uk/Intranet_subw eb/library/3yrep/2009/7035254.pdf .

(26)
(27)

17 Lampiran 1 Program DLV, modul pembangkitan.

1 arc(X,Y,1,0,0,0) v arc(X,Y,0,1,0,0) v arc(X,Y,0,0,1,0) v arc(X,Y,0,0,0,1) :- C(X,Y,1).

2 arc(X,Y,1,1,0,0) v arc(X,Y,0,1,1,0) v arc(X,Y,0,0,1,1) v arc(X,Y,1,0,0,1) v arc(X,Y,1,0,1,0) v arc(X,Y,0,1,0,1) :- C(X,Y,2).

3 arc(X,Y,1,1,1,0) v arc(X,Y,0,1,1,1) v arc(X,Y,1,0,1,1) v arc(X,Y,1,1,0,1) :- C(X,Y,3).

4 arc(X,Y,0,0,0,0) :- C(X,Y,0).

5 arc(X,Y,1,0,0,0) v arc(X,Y,0,1,0,0) v arc(X,Y,0,0,1,0) v arc(X,Y,0,0,0,1) v arc(X,Y,1,1,0,0) v arc(X,Y,0,1,1,0) v arc(X,Y,0,0,1,1) v arc(X,Y,1,0,0,1) v arc(X,Y,1,0,1,0) v arc(X,Y,0,1,0,1) v arc(X,Y,1,1,1,0) v arc(X,Y,0,1,1,1) v arc(X,Y,1,0,1,1) v arc(X,Y,1,1,0,1) v arc(X,Y,0,0,0,0) :- C(X,Y,null).

Modul ini akan membangkitkan kemungkinan solusi dengan melihat angka di dalam cell slither link, baris pertama akan membangkitkan kandidat solusi untuk cell yang memiliki nilai 1 ditunjukkan oleh predikat C(X,Y,1), baris kedua akan membangkitkan kandidat solusi untuk cell dengan nilai 2, baris

(28)

18 Lampiran 2 Program DLV, constraint cell dengan nilai 0, 1, 2, dan 3.

1 :- arc(X,Y,1,0,0,0), arc(A,Y,_,_,0,_), X=A+1. 2 :- arc(X,Y,0,1,0,0), arc(X,B,_,_,_,0), B=Y+1. 3 :- arc(X,Y,0,0,1,0), arc(A,Y,0,_,_,_), A=X+1. 4 :- arc(X,Y,0,0,0,1), arc(X,B,_,0,_,_), Y=B+1.

5 :- arc(X,Y,1,1,0,0), arc(X,B,_,_,_,0), B=Y+1. 6 :- arc(X,Y,1,1,0,0), arc(A,Y,_,_,0,_), X=A+1. 7 :- arc(X,Y,0,1,1,0), arc(X,B,_,_,_,0), B=Y+1. 8 :- arc(X,Y,0,1,1,0), arc(A,Y,0,_,_,_), A=X+1. 9 :- arc(X,Y,0,0,1,1), arc(X,B,_,0,_,_), Y=B+1. 10 :- arc(X,Y,0,0,1,1), arc(A,Y,0,_,_,_), A=X+1. 11 :- arc(X,Y,1,0,0,1), arc(X,B,_,0,_,_), Y=B+1. 12 :- arc(X,Y,1,0,0,1), arc(A,Y,_,_,0,_), X=A+1. 13 :- arc(X,Y,1,0,1,0), arc(A,Y,_,_,0,_), X=A+1. 14 :- arc(X,Y,1,0,1,0), arc(A,Y,0,_,_,_), A=X+1. 15 :- arc(X,Y,0,1,0,1), arc(X,B,_,0,_,_), Y=B+1. 16 :- arc(X,Y,0,1,0,1), arc(X,B,_,_,_,0), B=Y+1.

17 :- arc(X,Y,1,1,1,0), arc(X,B,_,_,_,0), B=Y+1. 18 :- arc(X,Y,1,1,1,0), arc(A,Y,_,_,0,_), X=A+1. 19 :- arc(X,Y,1,1,1,0), arc(A,Y,0,_,_,_), A=X+1. 20 :- arc(X,Y,0,1,1,1), arc(X,B,_,_,_,0), B=Y+1. 21 :- arc(X,Y,0,1,1,1), arc(X,B,_,0,_,_), Y=B+1. 22 :- arc(X,Y,0,1,1,1), arc(A,Y,0,_,_,_), A=X+1. 23 :- arc(X,Y,1,0,1,1), arc(A,Y,_,_,0,_), X=A+1. 24 :- arc(X,Y,1,0,1,1), arc(A,Y,0,_,_,_), A=X+1. 25 :- arc(X,Y,1,0,1,1), arc(X,B,_,0,_,_), Y=B+1. 26 :- arc(X,Y,1,1,0,1), arc(X,B,_,0,_,_), Y=B+1. 27 :- arc(X,Y,1,1,0,1), arc(X,B,_,_,_,0), B=Y+1. 28 :- arc(X,Y,1,1,0,1), arc(A,Y,_,_,0,_), X=A+1.

29 :- arc(X,Y,0,0,0,0), arc(X,B,_,_,_,1), B=Y+1. 30 :- arc(X,Y,0,0,0,0), arc(X,B,_,1,_,_), Y=B+1. 31 :- arc(X,Y,0,0,0,0), arc(A,Y,_,_,1,_), X=A+1. 32 :- arc(X,Y,0,0,0,0), arc(A,Y,1,_,_,_), A=X+1.

(29)

19 Lampiran 3 Program DLV, constraint mencegah local loop.

1 :- arc(X,Y,1,1,0,1), arc(A,Y,0,1,1,1), A=X+1. 2 :- arc(X,Y,0,1,1,1), arc(A,Y,1,0,1,1), X=A+1. 3 :- arc(X,Y,1,1,1,0), arc(X,B,1,0,1,1), Y=B+1. 4 :- arc(X,Y,1,0,1,1), arc(X,A,1,1,1,0), A=Y+1.

5 :- arc(X,Y,1,1,1,0), arc(X,B,_,1,_,_), Y = B+1. 6 :- arc(X,Y,0,1,1,1), arc(A,Y,_,_,1,_), X = A+1. 7 :- arc(X,Y,1,0,1,1), arc(X,B,_,_,_,1), B = Y+1. 8 :- arc(X,Y,1,1,0,1), arc(A,Y,1,_,_,_), A = X+1.

(30)

20 Lampiran 4 Program DLV, constraint pada cell dengan posisi di pojok grid.

1 :- arc(1,1,1,0,0,0). 2 :- arc(1,1,0,0,0,1). 3 :- arc(1,1,0,0,1,1). 4 :- arc(1,1,1,1,0,0). 5 :- arc(1,1,1,1,1,0). 6 :- arc(1,1,0,1,1,1). 7 :- arc(1,1,0,1,0,1). 8 :- arc(1,1,1,0,1,0).

9 :- arc(1,#maxint,1,0,0,0). 10 :- arc(1,#maxint,0,1,0,0). 11 :- arc(1,#maxint,1,0,0,1). 12 :- arc(1,#maxint,1,0,1,1). 13 :- arc(1,#maxint,0,1,1,1). 14 :- arc(1,#maxint,0,1,0,1). 15 :- arc(1,#maxint,1,0,1,0). 16 :- arc(1,#maxint,0,1,1,0).

17 :- arc(#maxint,1,0,0,0,1). 18 :- arc(#maxint,1,0,0,1,0). 19 :- arc(#maxint,1,0,1,1,0). 20 :- arc(#maxint,1,1,0,0,1). 21 :- arc(#maxint,1,1,1,1,0). 22 :- arc(#maxint,1,1,1,0,1). 23 :- arc(#maxint,1,0,1,0,1). 24 :- arc(#maxint,1,1,0,1,0).

25 :- arc(#maxint,#maxint,0,1,0,0). 26 :- arc(#maxint,#maxint,0,0,1,0). 27 :- arc(#maxint,#maxint,0,0,1,1). 28 :- arc(#maxint,#maxint,1,1,0,0). 29 :- arc(#maxint,#maxint,1,0,1,1). 30 :- arc(#maxint,#maxint,1,1,0,1). 31 :- arc(#maxint,#maxint,0,1,0,1). 32 :- arc(#maxint,#maxint,1,0,1,0).

(31)

21 Lampiran 5 Program DLV, constraint untuk mengantisipasi cabang dan ketersambungan garis.

1 :- arc(X,Y,1,1,_,_), arc(A,B,_,_,1,_), X=A+1, B=Y+1. 2 :- arc(X,Y,1,1,_,_), arc(A,B,_,_,_,1), X=A+1, B=Y+1. 3 :- arc(X,Y,1,1,_,_), arc(X,B,1,_,_,_), B=Y+1.

4 :- arc(X,#maxint,1,1,_,_), arc(A,#maxint,_,1,_,_), X=A+1. 5 :- arc(X,Y,_,1,1,_), arc(A,B,1,_,_,_), A=X+1, B=Y+1. 6 :- arc(X,Y,_,1,1,_), arc(A,B,_,_,_,1), A=X+1, B=Y+1. 7 :- arc(X,Y,_,1,1,_), arc(X,B,_,_,1,_), B=Y+1.

8 :- arc(X,#maxint,_,1,1,_), arc(A,#maxint,_,1,_,_), A=X+1. 9 :- arc(X,Y,_,_,1,1), arc(A,B,1,_,_,_), A=X+1, Y=B+1. 10 :- arc(X,1,_,_,1,1), arc(A,1,_,_,_,1), A=X+1.

11 :- arc(X,Y,_,_,1,1), arc(A,B,_,1,_,_), A=X+1, Y=B+1. 12 :- arc(X,Y,_,_,1,1), arc(X,B,_,_,1,_), Y=B+1.

13 :- arc(X,Y,1,_,_,1), arc(A,B,_,1,_,_), X=A+1, Y=B+1. 14 :- arc(X,Y,1,_,_,1), arc(A,B,_,_,1,_), X=A+1, Y=B+1. 15 :- arc(X,Y,1,_,_,1), arc(X,B,1,_,_,_), Y=B+1.

16 :- arc(X,1,1,_,_,1), arc(A,1,_,_,_,1), X=A+1.

17 :- arc(X,Y,1,_,_,0), arc(A,B,_,M,N,_), M=N, X=A+1, Y=B+1. %kiri atas 18 :- arc(X,Y,1,0,_,_), arc(A,B,_,_,M,N), M=N, X=A+1, B=Y+1. %kanan atas 19 :- arc(1,Y,1,0,_,_), arc(1,B,0,_,_,_), B=Y+1. %atas -- kanan

20 :- arc(1,Y,1,_,_,0), arc(1,B,0,_,_,_), Y=B+1. %atas -- kiri

21 :- arc(X,#maxint,1,0,_,_), arc(A,#maxint,_,0,_,_), X=A+1. %bagian kanan -- atas 22 :- arc(X,Y,0,1,_,_), arc(A,B,_,_,M,N), M=N, X=A+1, B=Y+1. %kanan atas

23 :- arc(X,#maxint,_,1,0,_), arc(A,#maxint,_,0,_,_), A=X+1. %bagian kanan -- bawah 24 :- arc(#maxint,Y,_,1,0,_), arc(#maxint,B,_,_,0,_), B=Y+1. %bagian bawah -- kanan 25 :- arc(X,#maxint,0,1,_,_), arc(A,#maxint,_,0,_,_), X=A+1. %bagian kanan -- atas 26 :- arc(1,Y,0,1,_,_), arc(1,B,0,_,_,_), B=Y+1. %bagian atas -- kiri

27 :- arc(X,Y,_,_,1,0), arc(A,B,M,N,_,_), M=N, A=X+1, Y=B+1. %kiri bawah 28 :- arc(X,Y,_,0,1,_), arc(A,B,M,_,_,N), M=N, A=X+1, B=Y+1. %kanan bawah 29 :- arc(#maxint,Y,_,0,1,_), arc(#maxint,B,_,_,0,_), B=Y+1. %bawah -- kanan 30 :- arc(#maxint,Y,_,_,1,0), arc(#maxint,B,_,_,0,_), Y=B+1. %bawah -- kiri 31 :- arc(X,Y,0,_,_,1), arc(A,B,_,M,N,_), M=N, X=A+1, Y=B+1. %atas -- kiri 32 :- arc(X,Y,_,_,0,1), arc(A,B,M,N,_,_), M=N, A=X+1, Y=B+1. %bawah -- kiri 33 :- arc(X,1,_,_,0,1), arc(A,1,_,_,_,0), A=X+1. %samping kiri -- bawah 34 :- arc(X,1,0,_,_,1), arc(A,1,_,_,_,0), X=A+1. %samping kiri - atas 35 :- arc(X,1,1,_,_,0), arc(A,1,_,_,_,0), X=A+1. %samping kiri -- atas 36 :- arc(X,1,_,_,1,0), arc(A,1,_,_,_,0), A=X+1. %samping kiri -- bawah

37 :- arc(X,#maxint,1,0,1,0), arc(A,#maxint,_,0,_,_), arc(C,#maxint,_,0,_,_), A=X+1, X=C+1. %samping kanan -- bawah -- atas

38 :- arc(X,1,1,0,1,0), arc(A,1,_,_,_,0), arc(C,1,_,_,_,0), A=X+1, X=C+1. %samping kiri -- bawah -- atas

39 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,_,_,0,_), B=Y+1. %bagian bawah -- kanan 40 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,_,_,0,_), Y=B+1. %bagian bawah -- kiri 41 :- arc(1,Y,0,1,0,1), arc(1,B,0,_,_,_), B=Y+1. %bagian atas -- kanan

42 :- arc(1,Y,0,1,0,1), arc(1,B,0,_,_,_), Y=B+1. %bagian atas – kiri

(32)

22 Lampiran 6 Program DLV, constraint dari cell bernilai 2 yang bersebelahan dengan cell bernilai 0.

1 :- arc(#maxint,Y,1,0,1,0), arc(#maxint,B,0,0,0,0), Y=B+1. %bagian bawah -- kiri 2 :- arc(#maxint,Y,1,0,1,0), arc(#maxint,B,0,0,0,0), B=Y+1. %bagian bawah -- kanan 3 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,0,0,0,0), Y=B+1. %bagian bawah -- kiri 4 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,0,0,0,0), B=Y+1. %bagian bawah -- kanan

5 :- arc(1,Y,1,0,1,0), arc(1,B,0,0,0,0), Y=B+1. %bagian atas -- kiri 6 :- arc(1,Y,1,0,1,0), arc(1,B,0,0,0,0), B=Y+1. %bagian atas -- kanan 7 :- arc(1,Y,0,1,0,1), arc(1,B,0,0,0,0), Y=B+1. %bagian atas -- kiri 8 :- arc(1,Y,0,1,0,1), arc(1,B,0,0,0,0), B=Y+1. %bagian atas – kanan

(33)

23 Lampiran 7 Pseudo code program C++ untuk membaca fakta slither link.

1 Set count to 1

2 FOR each string on data.dat 3 Set titik[count] to string 4 Increment count

5 END FOR

6 Set k to 1

7 FOR each side on slither_link 8 Set line_value[k] to 3 9 END FOR

(34)

24 Lampiran 8 Pseudo code program C++, modul basic_rule .

1 //basic rule

2 FOR each cell in slither_link 3 IF cell_value is 0 THEN

4 Set no_line on cell is TRUE 5 ELSE IF cell_value is 1 THEN 6 IF cell_positi

Gambar

Gambar 1 adalah ilustrasi hubungan antara P,
Gambar 2 Graf tujuh kota.
Gambar 6 Formulasi Penyelesaian.
Gambar 15 Representasi dari fakta slither link.
+7

Referensi

Dokumen terkait

Faktor jenis perlakuan pendahuluan dan konsentrasi tepung gembolo yang digunakan, keduanya berpengaruh sangat nyata terhadap warna, elastisitas, daya kembang, daya

Berdasarkan hasil analisis data dan pembahasan yang berkaitan dengan pengaruh Return On Asset (ROA),Return On Equity (ROE) dan Earning Per Share (EPS) terhadap return

Pengguna hak pilih dalam Daftar Pemilih Tambahan-2 (DPTb-2)/pengguna KTP atau identitas kependudukan lainnya4. Jumlah seluruh pengguna Hak Pilih

Alur dalam novel Ibuku Tak Menyimpan Surga di Telapak Kakinya adalah alur mundur atau regresif ( flashback ). Penokohan terdiri dari tokoh utama yaitu Amelia,

Ohh, saya hanya pernah mendapatkan email bertuliskan “Around Indonesia” tetapi saya pernah membacanya karena tidak tertarik dan tidak mengerti sebelumnya apa

PEJABAT PENGADAAN BARANG/JASA BADAN LINGKUNGAN HIDUP KABUPATEN KLATEN. Sekretariat : Badan Lingkungan Hidup

Panitia Pembangunan Sarana Pengelolaan Taman Hutan Raya (Pembangunan Menara Pengawas Kebakaran, Pembangunan Shelter, Pembangunan Deliniator dan Site Drain Jalan Masuk

Pengaruh Model Pembelajaran Kooperatif Tipe TGT Terhadap Hasil Belajar IPA Pada Siswa Kelas V Gugus XV Kecamatan Buleleng Tahun Ajaran 2013/2014, PGSD, Vo. Hafizah