Anda di halaman 1dari 14

Praktikum Week 4 Kecerdasan Buatan

Hari/ Tanggal : Selasa, 28 Februari 2017


Waktu : 2 x 50 Menit
Topik : Pengaplikasian Metode Pencarian pada 8Puzzle
Aplikasi tidak terlepas dari antar muka dan proses pengolahan data. Pada praktikum ini anda diminta
untuk memahami bagaimana sebuah agent mampu menyelesaikan persoalan eight puzzle dari initial
state ke final state/target position.

Warna orange adalah initial state sedangkan warna hijau adalah final state.

Selanjutnya angka dalam kotak disusun menjadi string sbb:

Initial state : 1,2,5,3,4,8,6,7,0

Final state : 0,1,2,3,4,5,6,7,8

Kotak kosong diganti menjadi angka 0. Maka, berdasarkan string initial dan final state dapat
dirumuskan jalur untuk mencapai target/final state sebagai berikut :

Initial state : 1,2,5,3,4,8,6,7,0

Change state : 1,2,5,3,4,0,6,7,8 (Move Up)

Change state : 1,2,0,3,4,5,6,7,8 (Move Up)

Change state : 1,0,2,3,4,5,6,7,8 (Move Left)

Kecerdasan Buatan | 1
Change state : 0,1,2,3,4,5,6,7,8 (Move Left)

Final state : 0,1,2,3,4,5,6,7,8

Untuk menyelesaikan persoalan ini, diperlukan pemahaman konsep tree / pohon keturunan.

Buatlah projek Java yang baru pada netbeans kesayangan anda dengan nama projek
EightPuzzleCore. Tambahkan package dan class-class seperti gambar dibawah ini.

Setiap kelas memiliki fungsinya masing-masing, yaitu :

- Kelas Demo berfungsi sebagai driver aplikasi / menguji aplikasi yang mengandung method main.

- Kelas Generation berfungsi untuk menurunkan setiap kemungkinan anak dari sisi kiri, kanan, atas
dan bawah dan menampung keturunan dalam bentuk pohon/tree ke dalam openList(daftar turunan
yang belum dibaca) dan closeList(daftar turunan yang sudah dibaca) dengan tipe ArrayList

- Kelas Manipulasi String berfungsi untuk menciptakan string baru berdasarkan kebutuhan kelas
Generation.

- Kelas OffSpring berfungsi untuk menyimpan semua data dan atribut dari string yang dienkapsulasi
dalam objek.

Perhatikan snippet code dari setiap setiap kelas yang diuraikan dibawah ini

1. Kelas OffSpring

Kecerdasan Buatan | 2
package ai.game.puzzle.core;

/**
*
* @author Perdana Situmorang
*/
public class OffSpring implements Comparable {

private String data;


private String movement;
private int parent;
private int id;
private int heuristicValue;
private int level;

public OffSpring() {
}

public OffSpring(String data, String movement, int parent, int


heuristicValue, int id, int level) {
this.data = data;
this.movement = movement;
this.parent = parent;
this.id = id;
this.level = level;
this.heuristicValue = heuristicValue;
}

public void setId(int id) {


this.id = id;
}

public int getLevel() {


return level;
}

public void setLevel(int level) {


this.level = level;
}

public void setData(String data) {


this.data = data;
}

public void setMovement(String movement) {


this.movement = movement;
}

public void setParent(int parent) {


this.parent = parent;
}

public void setHeuristicValue(int heuristicValue) {


this.heuristicValue = heuristicValue;
}

public int getId() {


return id;
}

public String getData() {

Kecerdasan Buatan | 3
return data;
}

public String getMovement() {


return movement;
}

public int getParent() {


return parent;
}

public int getHeuristicValue() {


return heuristicValue;
}

@Override
public String toString() {
return this.id + "-" + this.movement + "-" + this.parent + "-" +
this.getLevel() + "-" + this.data;
}

Kelas OffSpring tidak memiliki special method selain setter and getter. Kelas ini hanya digunakan
untuk menciptakan objek dari suatu keturan yang mengandung atribut-atribut yang diperlukan
untuk mendukung pohon keturunan / tree generation.

2. Kelas Manipulasi String


package ai.game.puzzle.core;

/**
*
* @author Perdana Situmorang
*/
public class ManipulasiString {

private String[] data;


private int baris;
private int kolom;
private int position;

ManipulasiString(String data) {
this.data = data.split(",");
this.setPosition();
this.setBaris();
this.setKolom();
}

public String[] getData() {


return this.data;
}

public void setPosition() {


for (int i = 0; i < data.length; i++) {
if (data[i].matches("0")) {
this.position = i;

Kecerdasan Buatan | 4
break;
}
}
}

public int getPosition() {


return this.position;
}

public void setBaris() {


this.baris = (int) (this.getPosition() / Math.sqrt(data.length));
}

public int getBaris() {


return baris;
}

public void setKolom() {


this.kolom = (int) (this.getPosition() % Math.sqrt(data.length));
}

public int getKolom() {


return this.kolom;
}

public String getLeftSide() {


if (this.getKolom() - 1 >= 0) {
return this.data[this.getPosition() - 1];
}
return null;
}

public String getRightSide() {


if (this.getKolom() + 1 < Math.sqrt(this.data.length)) {
return this.data[this.getPosition() + 1];
}
return null;
}

public String getUpSide() {


if (this.getBaris() - 1 >= 0) {
return this.data[this.getPosition() - (int)
Math.sqrt(this.data.length)];
}
return null;
}

public String getBotSide() {


if (this.getBaris() + 1 < (int) Math.sqrt(this.data.length)) {
return this.data[this.getPosition() + (int)
Math.sqrt(this.data.length)];
}
return null;
}
}

Pada kelas Manipulasi String terdapat 4 method utama beserta penjelasannya, yaitu :
1. Get Left Side
Berfungsi untuk return angka yang ada disebelah kiri 0, return null jika tidak ada

Kecerdasan Buatan | 5
2. Get Right Side
Berfungsi untuk return angka yang ada disebelah kanan 0, return null jika tidak ada
3. Get Up Side
Berfungsi untuk return angka yang ada diatas 0, return null jika tidak ada
4. Get Bot Side
Berfungsi untuk return angka yang ada dibawah 0, return null jika tidak ada

Selain method utama, terdapat beberapa method pendukung beserta penjelasannya, yaitu :
1. Get Data
Berfungsi untuk mengembalikan data dalam format array string dari satu node.
2. Get Position
Berfungsi untuk return nilai posisi dari 0 (empty box) dihitung dari 0.
3. Set Position
Berfungsi untuk set nilai posisi dari 0 (empty box)
4. Get Kolom
Berfungsi untuk return nilai kolom dari 0 (empty box) pada kotak 8
5. Set Kolom
Berfungsi untuk set nilai kolom dari 0 (empty box) pada kotak 8
6. Get Baris
Berfungsi untuk return nilai baris dari 0 (empty box) pada kotak 8
7. Set Baris
Berfungsi untuk set nilai baris dari 0 (empty box) pada kotak 8

3. Kelas Generation
package ai.game.puzzle.core;

import java.util.ArrayList;

/**
*
* @author Perdana Situmorang
*/
public class Generation {

private String target;


private String data;
private String tempResult;
private ArrayList<OffSpring> openList;
private ArrayList<OffSpring> closeList;
private ArrayList<OffSpring> routeList;
private ManipulasiString manipulasiString;
private OffSpring offSpring;
private OffSpring gOS;
private int parent;
private int prevParent;
private String parentMovement;
private int currentId;
private int level;
private String route;
private int countIteration;

Generation(String data, String target) {


this.tempResult = "";

Kecerdasan Buatan | 6
this.target = target;
this.data = data;
openList = new ArrayList<>();
closeList = new ArrayList<>();
prevParent = 0;
route = "";
}

public ArrayList<OffSpring> getOpenList() {


return openList;
}

private int addCurrentId() {


this.currentId += 1;
return this.currentId;
}

private void addLevel() {


this.level += 1;
}

private int getLevel() {


return this.level;
}

private int defineLevel(int parent) {


int countLevel = 0;
int curParent = parent;
OffSpring temp=null;
if(curParent == 0){
countLevel++;
if(getLevel()<countLevel){
this.level = countLevel;
}
return countLevel;
}
else{
for(OffSpring offSpring : closeList){
if(offSpring.getId()==parent){
temp=offSpring;
}
}
countLevel=temp.getLevel()+1;
if(getLevel()<countLevel){
this.level = countLevel;
}
}
return countLevel;
}

private void setParent(int parent) {


this.parent = parent;
}

private int getParent() {


return this.parent;
}

public void printOpenList() {


System.out.println("Hasil OpenList : ");
for (OffSpring s : openList) {

Kecerdasan Buatan | 7
System.out.println(s.getData() + " - " + s.getId() + "" +
s.getMovement() + "-" + s.getParent() + "-" + s.getLevel() + "-" +
s.getHeuristicValue());
}
}

public void printCloseList() {


System.out.println("Hasil CloseList: ");
for (OffSpring s : closeList) {
System.out.println(s.getData() + " - " + s.getId() + "" +
s.getMovement() + "-" + s.getParent() + "-" + s.getLevel() + "-" +
s.getHeuristicValue());
}
}

public int getHeuristic(String data) {


//lengkapi method ini
return 0; //hapus line ini jika tidak diperlukan setelah code
diubah
}

public boolean matchTarget() {


for (OffSpring s : openList) {
if (s.getData().matches(this.target)) {
this.gOS = s;
return true;
}
}
return false;
}

public void createChildren() {


while (this.level < 20) {
createLeftChild();
createRightChild();
createUpChild();
createBotChild();

countIteration++;
if (this.matchTarget()) {
break;
} else {
this.data = openList.get(0).getData();
this.setParent(openList.get(0).getId());
this.closeList.add(openList.get(0));
this.openList.remove(0);
}
}
this.printOpenList();
this.printCloseList();
this.setRoute();
this.displayRoute();

System.out.println("Jumlah level : "+this.level);


System.out.println("Jumlah Iterasi sebanyak : "+countIteration);
System.out.println("Jumlah node anak : "+this.countNodeChild());

public void createLeftChild() {


String temp[] = null;

Kecerdasan Buatan | 8
manipulasiString = new ManipulasiString(this.data);
if (manipulasiString.getLeftSide() != null &&
!this.isCreated(manipulasiString.getLeftSide())) {
temp = this.manipulasiString.getData();
temp[this.manipulasiString.getPosition()] =
manipulasiString.getLeftSide();
temp[this.manipulasiString.getPosition() - 1] = "0";
for (int i = 0; i < temp.length; i++) {
tempResult = tempResult.concat(temp[i]);
if (i + 1 < temp.length) {
tempResult = tempResult.concat(",");
}
}
this.offSpring = new OffSpring(this.tempResult, "Left",
this.getParent(), getHeuristic(this.tempResult), this.addCurrentId(),
this.defineLevel(this.getParent()));
openList.add(this.offSpring);
this.tempResult = "";
}
}

public void createRightChild() {


String temp[] = null;
manipulasiString = new ManipulasiString(this.data);
if (manipulasiString.getRightSide() != null &&
!this.isCreated(manipulasiString.getRightSide())) {
temp = this.manipulasiString.getData();
temp[this.manipulasiString.getPosition()] =
manipulasiString.getRightSide();
temp[this.manipulasiString.getPosition() + 1] = "0";
for (int i = 0; i < temp.length; i++) {
tempResult = tempResult.concat(temp[i]);
if (i + 1 < temp.length) {
tempResult = tempResult.concat(",");
}
}
this.offSpring = new OffSpring(this.tempResult, "Right",
this.getParent(), getHeuristic(this.tempResult), this.addCurrentId(),
this.defineLevel(this.getParent()));
openList.add(this.offSpring);
this.tempResult = "";
}
}

public void createUpChild() {


String temp[] = null;
manipulasiString = new ManipulasiString(this.data);
if (manipulasiString.getUpSide() != null &&
!this.isCreated(manipulasiString.getUpSide())) {
temp = this.manipulasiString.getData();
temp[this.manipulasiString.getPosition()] =
manipulasiString.getUpSide();
temp[this.manipulasiString.getPosition() - (int)
Math.sqrt(temp.length)] = "0";
for (int i = 0; i < temp.length; i++) {
tempResult = tempResult.concat(temp[i]);
if (i + 1 < temp.length) {
tempResult = tempResult.concat(",");
}
}
this.offSpring = new OffSpring(this.tempResult, "Up",

Kecerdasan Buatan | 9
this.getParent(), getHeuristic(this.tempResult), this.addCurrentId(),
this.defineLevel(this.getParent()));
openList.add(this.offSpring);
this.tempResult = "";
}
}

public void createBotChild() {


String temp[] = null;
manipulasiString = new ManipulasiString(this.data);
if (manipulasiString.getBotSide() != null &&
!this.isCreated(manipulasiString.getBotSide())) {
temp = this.manipulasiString.getData();
temp[this.manipulasiString.getPosition()] =
manipulasiString.getBotSide();
temp[this.manipulasiString.getPosition() + (int)
Math.sqrt(temp.length)] = "0";
for (int i = 0; i < temp.length; i++) {
tempResult = tempResult.concat(temp[i]);
if (i + 1 < temp.length) {
tempResult = tempResult.concat(",");
}
}
this.offSpring = new OffSpring(this.tempResult, "Bottom",
this.getParent(), getHeuristic(this.tempResult), this.addCurrentId(),
this.defineLevel(this.getParent()));
openList.add(this.offSpring);
this.tempResult = "";
}
}

public boolean isCreated(String os) {


for (OffSpring s : openList) {
if (s.getData().matches(os)) {
return true;
}
}
for (OffSpring s : closeList) {
if (s.getData().matches(os)) {
return true;
}
}
return false;
}

public void displayRoute() {


System.out.println("Route : ");
for (int i = route.length() - 1; i >= 0; i--) {
System.out.println(route.charAt(i));
}
}

public void setRoute() {


//lengkapi method ini nanti
}

public int countNodeChild(){


int count=0;

return 0;

Kecerdasan Buatan | 10
}
}

Pada kelas Generation terdapat 8 method utama beserta penjelasannya, yaitu :

1. Create Left Child


Berfungsi untuk menciptakan anak/node (data string) baru apabila posisi 0 (empty box)
bergeser ke sebelah kiri
2. Create Right Child
Berfungsi untuk menciptakan anak/node (data string) baru apabila posisi 0 (empty box)
bergeser ke sebelah kanan
3. Create Up Child
Berfungsi untuk menciptakan anak/node (data string) baru apabila posisi 0 (empty box)
bergeser ke atas
4. Create Bot Child
Berfungsi untuk menciptakan anak/node (data string) baru apabila posisi 0 (empty box)
bergeser ke bawah
5. Set Route
Berfungsi untuk menentukan rute dari initial state ke final state setelah final state ditemukan
6. Match Target
Berfungsi untuk menentukan apakah current node adalah final state atau tidak
7. Get Heuristic
Berfungsi untuk melakukan kalkulasi perbedaan dari setiap node yang diciptakan ke final
state
8. Define Level
Berfungsi untuk menentukan level/kedalaman dari node pada tree/pohon keturunan

Selain method utama, terdapat beberapa method pendukung beserta penjelasannya.

1. Add Current Id
Berfungsi untuk menambahkan current id node dengan 1, setiap node akan memiliki id yang
berbeda-beda dimana id node akan bertambah 1 setiap kali menciptakan node.
2. Add Level
Berfungsi untuk menambahkan level dari node apabila node/anak yang diciptakan sudah
berbeda level/kedalaman dengan node sebelumnya.
3. Get Level
Berfungsi untuk return current level / last level
4. Set Parent
Berfungsi untuk set parent dari node/anak yang akan diciptakan
5. Get Parent
Berfungsi untuk return parent dari node/anak yang akan diciptakan
6. Print Open List
Berfungsi untuk menampilkan daftar node/anak yang terdapat pada open list (list yang
belum dibaca).
7. Print Close List
Berfungsi untuk menampilkan daftar node/anak yang terdapat pada close list (list yang
sudah dibaca).
8. Create Children

Kecerdasan Buatan | 11
Berfungsi untuk menciptakan satu keturunan (maksimum 4 node) yaitu left, right, up, bot
9. Is Created
Berfungsi untuk melakukan validasi apakah anak yang akan diciptakan sudah diciptakan
sebelumnya. Apabila sudah ada, maka anak tersebut tidak akan diciptakan berulang.
10. Display Route
Berfungsi untuk menampilkan rute dari initial state ke final state
11. Count Node Child
Berfungsi untuk menghitung seluruh jumlah node anak yang telah dibuat sebelumnya.

4. Kelas Demo
package ai.game.puzzle.core;

/**
*
* @author Perdana Situmorang
*/
public class Demo {

public static void main(String[] args) {


Generation g;
String goal = "0,1,2,3,4,5,6,7,8";
String current = "1,2,5,3,4,8,6,7,0";
g = new Generation(current, goal);
g.createChildren();
}
}

Pastikan tidak ada error pada setiap line kode, kemudian jalankan aplikasi maka akan muncul hasil
sebagai berikut :

Kecerdasan Buatan | 12
Kecerdasan Buatan | 13
Tugas

1. Pada sesi praktikum ini, teknik pengumpulan data dan pencarian data yang digunakan
adalah metode BFS. Buatlah teknik pengumpulan dan pencarian data menggunakan DFS.
2. Seteah melakukan pengubahan menjadi DFS, bandingkan hasil iterasi dan level maksimum.
Tuliskan hasilnya pada laporan anda.
Contohnya: Kedalaman 5, 7, 10, dan lain- lain.
3. Pada class Generation, ubahlah prioritas openList:
a. Up, Bottom, Left, Right
b. Right, Left, Bottom, Up
c. Bottom, Up, Left, Right. (Tuliskan hasil analisis anda pada laporan).
4. Silahkan eksplorasi kode program dengan mengubah data string initial state sesuai keinginan
anda. Tuliskan laporan anda sesuai dengan hasil eksplorasi yang anda lakukan dalam word.

Selamat mengerjakan & have fun 

Kecerdasan Buatan | 14