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
Pendekatan guess and check pada ASP diterapkan untuk penyelesaian menggunakan
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 Soal yang dibangkitkan akan dibuat dalam bentuk fakta dan kondisi solve dari N-puzzle. Setiap soal baru dibangkitkan, fakta dan kondisi solve dari soal tersebut akan ditulis ulang dalam file soal.dat, sedangkan model penyelesaian dengan program DLV akan disimpan dalam file Npuzzle.txt. Misalnya, telah dibangkitkan sebuah soal N-puzzle dengan ukuran 3 x 3 seperti pada Gambar 7. Berikut adalah representasi fakta
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
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.
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
(35-puzzle). Banyaknya langkah pengacakan didapatkan secara random. Tool DLV sendiri masih dalam tahap pengembangan. Hal ini menyebabkan program DLV yang dibangun belum dapat mengakomodasi penyelesaian untuk puzzle dengan ukuran lebih besar dari 6 x 6 (35-puzzle) walaupun teknik answer set programming yang digunakan untuk
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
Dari 10 soal 24-puzzle yang dibangkitkan, seluruhnya dapat diselesaikan dengan DLV dan IDS15. Beberapa solusi pertama yang dimunculkan model DLV dapat menyelesaikan soal-soal tersebut dengan jumlah langkah menuju solved yang lebih besar dari 15 langkah. Hal ini disebabkan pada model DLV tidak perlu menentukan batas maksimal kedalaman pencarian yang bisa dicapai. Model IDS15 menyelesaikan soal tersebut dengan jumlah langkah yang lebih kecil atau sama dengan batas maksimal kedalaman pencarian yang ditentukan, yaitu
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.