PUZZLE-8
10111454
10112664
AI - 5
KATA PENGANTAR
Penyusun
DAFTAR ISI
Latar Belakang..................................................................................................... ii
1.2
1.3
BAB II................................................................................................................................. 1
PENGENALAN SISTEM .................................................................................................. 1
2.1
2.2
2.3
Analisis ................................................................................................................ 5
3.2
Implementasi ...................................................................................................... 6
BAB IV ............................................................................................................................. 17
PENUTUP ........................................................................................................................ 17
4.1.
Simpulan ........................................................................................................... 17
4.2.
Saran ................................................................................................................. 17
BAB I
PENDAHULUAN
1.1 Latar Belakang
Puzzle-8 adalah representasi permainan teka-teki yang dapat diselesaikan
dengan mengurutkan atau menyusun komponen-komponen pembentuknya
sesuai dengan kondisi yang berurut. Komponen pada Puzzle-8 adalah berupa
kotak-kotak bernomor yang dapat diacak sedemikian hingga menjadi suatu
pola random yang dapat dicari jalan penyelesaiannya .
Sesuai namanya,
Puzzle-8 terdiri atas 8 kotak dan 1 tempat kosong yang dapat digerakkan
dengan aturan tertentu. Aturan pergerakannya hanya berupa empat arah
pergerakan, yaitu atas, bawah, kanan, dan kiri. Pada Puzzle-8, batasannya
adalah ukuran 33. Sehingga, 8 kotak yang dimiliki hanya dapat bergerak
dalam lingkup ukuran tersebut.
Aplikasi permainan merupakan salah satu implementasi dari ilmu di
bidang komputer. Inti dari sebuah aplikasi permainan adalah mengembangkan
kemampuan otak untuk mengatur strategi, kecepatan, dan ketepatan dalam
mencapai tujuan akhir. Salah satu contoh permainan adalah puzzle. Puzzle
terdiri dari beberapa jenis, ada yang menggunakan angka, huruf, dan gambar.
Dalam permainan puzzle, pemain diharapkan dapat mencapai tujuan akhir
untuk membentuk sebuah puzzle menjadi sebuah gambar atau pola yang benar
dengan waktu yang cepat.
Algoritma A Star adalah algoritma pencarian graf yang menemukan jalur
dari status awal ke status akhir. Algoritma ini menggunakan fungsi heuristic
(biasanya didenotasikan dengan A*) untuk menentukan urutan dimana
pencarian
dilakukan
dengan
mengunjungi
node
dalam
pohon.
heuristic distance plus cost sedang untuk memecahkan kasus Puzzle-8, maka
digunakan fungsi heuristic city block distance atau sering juga disebut dengan
istilah manhattan distance.
Dalam program Puzzle-8 ini, Initial state di tentukan secara acak, dan
dengan Final state yang sudah ditentukan. Untuk memenangkan permainan,
pemain harus mencapai Final state yang sudah ditentukan sebelumnya, selain
itu program juga akan memberikan solusi yang tepat dan cepat untuk
menyelesaikan Puzzle-8 jika pemain menginginkannya.
1.2 Rumusan Masalah
Menganalisis, memodelkan, serta mengimplementasikan algoritma A Star
sebagai problem solving pada kasus game Puzzle-8.
1.3 Tujuan Penulisan
Mengetahui cara memodelkan dan mengimplementasikan algoritma A
Star pada kasus puzzle.
iii
BAB II
PENGENALAN SISTEM
Algoritma A Star merupakan salah satu algoritma yang menggunakan fungsi
biaya. Algoritma A Star memeriksa kelayakan biaya yang diperlukan untuk
mencapai suatu simpul dari sebuah simpul lain. Dalam kasus puzzle 8 ini,
algoritma A Star membandingkan 2 posisi puzzle yaitu posisi puzzleawal (state
awal) dengan posisi puzzle yang terurut dengan benar (state akhir). Berikut ini
adalah algoritma A Star secara umum.
method
random
yang
telah
disediakan
oleh
bahasa
Berikut ini adalah mekanisme sistem yang dibuat secara umum yang
disajikan dalam bentuk flowchart.
BAB III
Nilai heuristic susunan diatas yaitu h(n)= 2 karena kotak-8 dan kotak
kotak-B (blank) membutuhkan satu kali pergerakan untuk mencapai final
state. Berikut ini adalah ilustrasi penyelesaian game Puzzle-8 menggunakan
algoritma A*.
3.2 Implementasi
Inisialisasi variabel yang berkaitan
public class Node {
// deklarasi 9 kotak ke dalam node
// state
private int[][] state = new int[3][3];
private int h; // deklarasi fungsi heuristic Manhattan
private int g;
private int id;
return id;
}
public int getParentID() {
return parentID;
}
public int getG() {
return g;
}
public int getH() {
return h;
}
public int getEmptyX() {
return emptyX;
}
public int getEmptyY() {
return emptyY;
}
public int getF() {
return g + h;
}
// menghitung h
public void calculateH() {
int tempH = 0;
int FinalStateX = 0, FinalStateY = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
switch (state[i][j]) {
case 1:
FinalStateX = 0;
FinalStateY = 0;
break;
case 2:
FinalStateX = 0;
FinalStateY = 1;
break;
case 3:
FinalStateX = 0;
FinalStateY = 2;
break;
case 4:
FinalStateX = 1;
FinalStateY = 0;
break;
case 5:
FinalStateX = 1;
FinalStateY = 1;
break;
case 6:
FinalStateX = 1;
FinalStateY = 2;
break;
case 7:
FinalStateX = 2;
FinalStateY = 0;
break;
case 8:
FinalStateX = 2;
FinalStateY = 1;
break;
case 9:
FinalStateX = 2;
FinalStateY = 2;
break;
}
tempH += Math.abs(FinalStateX - i) +
Math.abs(FinalStateY - j);
}
this.h = tempH;
}
}
public class ListNode {
// node
private Node node;
// node berikutnya
public ListNode nextNode;
// node sebelumnya
public ListNode previousNode;
// list node baru
public ListNode() {
node = new Node();
}
// list node baru
public ListNode(Node node) {
this(node, null, null);
}
// list node baru
public ListNode(Node node, ListNode previous, ListNode next)
{
this.node = node;
previousNode = previous;
nextNode = next;
}
public Node getNode() {
return node;
}
public ListNode getNext() {
return nextNode;
}
public ListNode getPrevious() {
return previousNode;
}
}
public class LinkList {
// node
private
// node
private
pertama
ListNode firstNode;
terakhir
ListNode lastNode;
public LinkList() {
firstNode = lastNode = null;
}
public void insertAtBack(Node node) {
if (isEmpty())
firstNode = lastNode = new ListNode(node);
else {
ListNode newNode = new ListNode(node);
lastNode.nextNode = newNode;
newNode.previousNode = lastNode;
lastNode = newNode;
}
}
public void insertAtFront(Node node) {
if (isEmpty())
firstNode = lastNode = new ListNode(node);
else {
ListNode newNode = new ListNode(node);
newNode.nextNode = firstNode;
firstNode.previousNode = newNode;
firstNode = newNode;
}
}
public Node getSmallestNode() {
Node minimumNode = firstNode.getNode();
ListNode current = firstNode.getNext();
while (current != null) {
if (current.getNode().getF() < minimumNode.getF())
minimumNode = current.getNode();
current = current.getNext();
}
return minimumNode;
}
public void removeNode(Node node) {
10
if (isEmpty())
return;
else if (isSameState(node, firstNode.getNode()) &&
firstNode == lastNode) {
firstNode = lastNode = null;
return;
} else if (isSameState(node, firstNode.getNode())) {
firstNode = firstNode.getNext();
firstNode.previousNode = null;
return;
} else if (isSameState(node, lastNode.getNode())) {
lastNode = lastNode.getPrevious();
lastNode.nextNode = null;
} else {
ListNode current = firstNode;
while (current.getNext() != null) {
if (isSameState(current.getNext().getNode(),
node)) {
current.nextNode.nextNode.previousNode
= current;
current.nextNode =
current.getNext().getNext();
return; // break
} else
current = current.nextNode;
}
}
}
// cek apakah kosong
public boolean isEmpty() {
return firstNode == null;
}
// cek apakah isi
public boolean alreadyExists(Node node) {
if (!isEmpty()) {
ListNode current = firstNode;
while (current != null) {
if (isSameState(current.getNode(), node))
return true;
else
current = current.getNext();
}
return false;
}
return false;
}
// cek apakah state sama
public boolean isSameState(Node A, Node B) {
int[][] stateA = A.getState();
int[][] stateB = B.getState();
11
Skema pengkodean
12
}
// case 1
else if (smallestNode.getEmptyX() == 0 &&
smallestNode.getEmptyY() == 1) {
branchNode = blankLeft(smallestNode);
checkBranchNodeInLists();
branchNode = blankDown(smallestNode);
checkBranchNodeInLists();
branchNode = blankRight(smallestNode);
checkBranchNodeInLists();
}
// case 2
else if (smallestNode.getEmptyX() == 0 &&
smallestNode.getEmptyY() == 2) {
branchNode = blankLeft(smallestNode);
checkBranchNodeInLists();
branchNode = blankDown(smallestNode);
checkBranchNodeInLists();
}
// case 3
else if (smallestNode.getEmptyX() == 1 &&
smallestNode.getEmptyY() == 0) {
branchNode = blankUp(smallestNode);
checkBranchNodeInLists();
branchNode = blankRight(smallestNode);
checkBranchNodeInLists();
branchNode = blankDown(smallestNode);
checkBranchNodeInLists();
}
// case 4
else if (smallestNode.getEmptyX() == 1 &&
smallestNode.getEmptyY() == 1) {
branchNode = blankUp(smallestNode);
checkBranchNodeInLists();
branchNode = blankRight(smallestNode);
checkBranchNodeInLists();
branchNode = blankDown(smallestNode);
checkBranchNodeInLists();
branchNode = blankLeft(smallestNode);
checkBranchNodeInLists();
}
// case 5
else if (smallestNode.getEmptyX() == 1 &&
smallestNode.getEmptyY() == 2) {
branchNode = blankUp(smallestNode);
checkBranchNodeInLists();
branchNode = blankLeft(smallestNode);
checkBranchNodeInLists();
branchNode = blankDown(smallestNode);
13
checkBranchNodeInLists();
}
// case 6
else if (smallestNode.getEmptyX() == 2 &&
smallestNode.getEmptyY() == 0) {
branchNode = blankUp(smallestNode);
checkBranchNodeInLists();
branchNode = blankRight(smallestNode);
checkBranchNodeInLists();
}
// case 7
else if (smallestNode.getEmptyX() == 2 &&
smallestNode.getEmptyY() == 1) {
branchNode = blankLeft(smallestNode);
checkBranchNodeInLists();
branchNode = blankUp(smallestNode);
checkBranchNodeInLists();
branchNode = blankRight(smallestNode);
checkBranchNodeInLists();
}
// case 8
else if (smallestNode.getEmptyX() == 2 &&
smallestNode.getEmptyY() == 2) {
branchNode = blankUp(smallestNode);
checkBranchNodeInLists();
branchNode = blankLeft(smallestNode);
checkBranchNodeInLists();
}
}
}
backTrackNodes();
currentListNode = finalState.getFirstNode();
timer1.start();
resetTilesMatrix();
}
14
case
case
case
case
case
case
case
FinalStateX
FinalStateY
break;
3:
FinalStateX
FinalStateY
break;
4:
FinalStateX
FinalStateY
break;
5:
FinalStateX
FinalStateY
break;
6:
FinalStateX
FinalStateY
break;
7:
FinalStateX
FinalStateY
break;
8:
FinalStateX
FinalStateY
break;
9:
FinalStateX
FinalStateY
break;
= 0;
= 1;
= 0;
= 2;
= 1;
= 0;
= 1;
= 1;
= 1;
= 2;
= 2;
= 0;
= 2;
= 1;
= 2;
= 2;
}
tempH += Math.abs(FinalStateX - i) +
Math.abs(FinalStateY - j);
}
this.h = tempH;
}
15
16
BAB IV
PENUTUP
4.1.Simpulan
Algoritma A Star menghasilkan output yang baik karena algoritma
tersebut pada game puzzle ini khusunya, memilih langkah perpindahan state
berdasarkan cost sehingga pertimbangannya cukup baik. Dalam kondisi state
yang acak
dan rumit
serta memiliki
banyak
kemungkinan solusi
saran
yang
dapat
diberikan
untuk
membantu
dalam
pengembangan aplikasi ini lebih lanjut yaitu game dapat disajikan dalam
bentuk gambar. Selain itu, apabila makalah ini dijadika referensi penerapan A
Star dalam kasus lain, diperlukan analisis dan perancangan ulang karena akan
berbeda parameter cost-nya.
17
DAFTAR PUSTAKA
18
LAMPIRAN
1. Screenshoot antar muka
2. Screenshoot proses
3. Screenshoot hasil
19