Lampiran 1
Pseudo 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
pada puzzle, baris 10 sampai baris 16 digunakan untuk mencari posisi kotak bernilai 0 (blank), dan
baris 17 sampai baris 25 digunakan untuk melakukan langkah pengacakan.
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+1menunjukkan bahwa posisi
Xada di sebelah kanan
X0,
X1=X+1menunjukkan bahwa posisi
Xada di sebelah kiri
X1,
Y=Y0+1menunjukkan bahwa posisi
Yada di
atas
Y0, dan
Y1=Y+1menunjukkan bahwa posisi
Yada 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.
Baris 6 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di sisi bawah.
Baris 7 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di samping kiri.
Baris 8 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 di samping kanan.
Baris 9 adalah aturan pembangkitan kemungkinan gerak jika posisi 0 berada di tengah.
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) :-
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,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).
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.
Baris 21 sampai baris 24 adalah aturan pembangkitan kemungkinan gerak langkah ke jika
posisi 0 di tengah. Pada baris 21 nilai 0 akan bergerak ke bawah, ke atas, atau ke kiri. Pada baris
22 nilai 0 akan bergerak ke atas, ke kiri, atau ke kanan. Pada baris 23 nilai 0 akan bergerak ke
kanan, ke atas, atau ke bawah. Pada baris 24 nilai 0 akan bergerak ke kanan, ke kiri, atau ke
bawah.
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
Tnilai 0 ada di
X,Ydan bergerak ke
X1,Y, maka
pada waktu
T1,dimana
T1=T+1nilai 0 ada di
X1,Y.
Pada baris 2 menunjukkan jika pada waktu
Tnilai 0 ada di
X,Ydan bergerak ke
X,Y1, maka
pada waktu
T1,dimana
T1=T+1nilai 0 ada di
X,Y1.
Pada baris 3 menunjukkan jika pada waktu
Tnilai
Nada di
X1,Ydan nilai 0 ada di
X,Y, lalu
nilai 0 bergerak ke
X1,Y, maka pada waktu
T1,dimana
T1=T+1nilai
Nada di
X,Y.
Pada baris 4 menunjukkan jika pada waktu
Tnilai
Nada di
X,Y1dan nilai 0 ada di
X,Y, lalu
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).
Aturan diatas menunjukan jika pada waktu
Tnilai
Nada di
X,Ydan nilai 0 tidak bergerak ke
X,Y, maka pada
T1,dimana
T1=T+1nilai
Ntetap berada di
X,Y.
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
Baris 1 dan 2 pada lampiran ini untuk membaca ukuran puzzle dari
ukuran.dat. Baris 3
sampai 11 untuk membaca soal N-puzzle dari
imperatif.dat. Dengan catatan
number ofLampiran 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
N-puzzle selesai dan menemukan solusi (solve) jika nilai sudah tersusun dan teruurut
berdasarkan posisinya. Berdasarkan hal tersebut kondisi solusi bisa didapatkan dengan cara nilai
pada kotak dikurangi posisi(indeks)-nya pada array. Pengecualian terjadi pada nilai 0, nilai 0
diganti dengan banyaknya nilai pada puzzle dikurangi posisi(indeks)-nya padaarray. Contoh pada
8-puzzle untuk mengetahui apakah nilai 0 sudah pada posisinya maka 9- [indeks_array].
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