SlideShare a Scribd company logo
1 of 20
Download to read offline
Sekolah Tinggi Teknologi Telematika Telkom
Laporan Praktikum
Kecerdasan Buatan
Modul 3 – Implementasi DFS dan BFS pada
Permainan Labirin
Dosen Pengampu: Muhammad Zidny Naf’an,S.Kom., M.Kom.
Nama Mahasiswa : Deprilana Ego Prakasa
NIM : 14102055
Kelas : S1 IF B 2014
Jawaban Latihan Soal
1. Berdasarkan pohon pelacakan di atas, hasil penelusuran metode DFS adalah
: (1,1), (1,2), (2,1), (3,1), (3,2), (3,3), (3,4), (4,3)
2. Berdasarkan pohon pelacakan di atas, hasil penelusuran metode BFS adalah :
(1,1), (1,2), (2,1), (3,1), (3,2), (4,1), (3,3), (3,4), (4,3)
3. Jalankan program yang telah dibuat, hasilnya :
Node.java
package AIDFSBFS;
import java.util.ArrayList;
import java.util.List;
public class Node {
int row;
int col;
boolean wasVisited;
String label;
List<Node> adjNode;
Node(int row, int col)
{ this.row = row;
this.col = col;
this.label = "("+Integer.toString(row)+","+Integer.toString(col)+")";
this.wasVisited = false;
adjNode = new ArrayList<Node>();
}
}
MazeSolver.java
package AIDFSBFS;
import java.util.ArrayList;
import java.util.List; import
java.util.LinkedList; import
java.util.Queue; import
java.util.Stack;
public class MazeSolver
{
private int
myMaze[][]={{1,1,1,1,1},
{1,0,0,1,0}, {1,0,1,1,1},
{1,0,0,0,0}, {1,0,1,0,1}};
List<Node> nodes;
String moveOrder;
private final int MAX_ROWS=5, MAX_COLS=5;
private int newRow, newCol;
Stack<Node> stackNodes;
Queue<Node> queueNodes;
List<Node> listVisitedNodes;
Node startNode;
Node goalNode;
public MazeSolver(String moveOrder)
{
super();
nodes = new ArrayList<Node>();
stackNodes = new Stack<Node>();
queueNodes = new LinkedList<Node>();
listVisitedNodes = new
ArrayList<Node>(); this.moveOrder =
moveOrder; generateNode();
generateAdjacentNode();
}
private boolean isPossibleMove(int row, int col, char direction)
{
boolean possible = false;
switch(direction)
{
case 'N':
if(row-1>=0 && myMaze[row-1][col] == 0)
possible = true;
newRow = row-1;
newCol = col;
break;
case 'S':
if(row+1<MAX_ROWS && myMaze[row+1][col] ==
0) possible = true;
newRow = row+1;
newCol = col;
break;
case 'E':
if(col+1<MAX_COLS && myMaze[row][col+1] ==
0) possible = true;
newRow = row;
newCol = col+1;
break;
case 'W':
if(col-1>=0 && myMaze[row][col-1] == 0)
possible = true;
newRow = row;
newCol = col-1;
break;
}
return possible;
}
private void generateNode()
{
for(int i=0; i<MAX_ROWS; i++)
{
for(int j=0; j<MAX_COLS; j++)
{
if(myMaze[i][j] == 0)
{
Node node = new Node(i,
j); nodes.add(node);
}
}
}
}
private void generateAdjacentNode()
{
for(Node node: nodes)
{
int row = node.row;
int col = node.col;
for(int i=0; i<4; i++)
{
char direction = moveOrder.charAt(i);
if(isPossibleMove(row, col, direction))
{
Node tmpNode = new Node(newRow, newCol); Node
adjNode = nodes.get(getIndex(tmpNode));
node.adjNode.add(adjNode);
}
}
}
}
private int getIndex(Node tmpNode)
{
for(int i=0; i<nodes.size(); i++)
{
Node node = nodes.get(i);
if(node.row == tmpNode.row && node.col ==
tmpNode.col) return i;
}
return -1;
}
private void clearVisited()
{
for(int i=0; i<nodes.size(); i++)
{
nodes.get(i).wasVisited = false;
}
}
private void displayNode()
{
for(Node node: listVisitedNodes)
{
System.out.println(node.label);
}
}
private Node getUnvisitedAdjacentNode(Node currentNode)
{
Node adjNode = null;
for(int i=0; i<currentNode.adjNode.size(); i++)
{
if(currentNode.adjNode.get(i).wasVisited ==
false) return currentNode.adjNode.get(i);
}
return adjNode;
}
private boolean solveWithDFS(Node startNode, Node goalNode)
{
listVisitedNodes.clear();
Node currentNode = nodes.get(getIndex(startNode));
nodes.get(getIndex(startNode)).wasVisited = true;
stackNodes.push(currentNode);
listVisitedNodes.add(currentNode);
while(!stackNodes.isEmpty())
{
Node tmpNode = stackNodes.peek();
currentNode = getUnvisitedAdjacentNode(tmpNode);
if(currentNode != null)
{
nodes.get(getIndex(currentNode)).wasVisited = true;
listVisitedNodes.add(currentNode);
if(currentNode.label.contentEquals(goalNode.label))
{
clearVisited();
return true;
}
stackNodes.push(currentNode);
} else {
stackNodes.pop();
}
}
clearVisited();
return false;
}
private boolean solveWithBFS(Node startNode, Node goalNode)
{
listVisitedNodes.clear();
Node currentNode = nodes.get(getIndex(startNode));
nodes.get(getIndex(startNode)).wasVisited = true;
queueNodes.add(currentNode);
listVisitedNodes.add(currentNode);
while(!queueNodes.isEmpty())
{
Node tmpNode = queueNodes.peek();
currentNode = getUnvisitedAdjacentNode(tmpNode);
if(currentNode != null)
{
nodes.get(getIndex(currentNode)).wasVisited = true;
listVisitedNodes.add(currentNode);
if(currentNode.label.contentEquals(goalNode.label))
{
clearVisited();
return true;
}
queueNodes.add(currentNode);
} else {
queueNodes.remove();
}
}
clearVisited();
return false;
}
public static void main(String[] args) {
// TODO code application logic here
MazeSolver ms = new MazeSolver("NESW");
ms.startNode = new Node(1,1);
ms.goalNode = new Node(4,3);
for(Node node: ms.nodes)
{
System.out.print(node.label+":t");
for(Node nodeAdj: node.adjNode)
{
System.out.print(nodeAdj.label+" ");
}
System.out.println();
}
System.out.println("Solve with DFS");
if(ms.solveWithDFS(ms.startNode, ms.goalNode))
{
ms.displayNode();
System.out.println("Solving with
"+ms.listVisitedNodes.size()+" visiting node");
} else {
System.out.println("Goal State didn't find");
}
System.out.println("nnSolve with BFS : ");
if(ms.solveWithBFS(ms.startNode, ms.goalNode))
{
ms.displayNode();
System.out.println("Solving with
"+ms.listVisitedNodes.size()+" visiting node");
} else {
System.out.println("Goal State didn't find");
}
}
}
Screenshot hasil :
4. Dengan menggunakan DFS dan BFS coba ganti urutan operator menjadi NORTH-
EAST-SOUTH-WEST. Bagaimana hasilnya ?
Untuk selanjutnya menggunakan labirin berikut :
5. Deklarasi array 2-dimensi untuk labirin diatas :
6. Pohon pelacakan labirin di atas ?
(0,2)
(1,2)
(1,1) (1,3)
(1,0) (2,1) (2,3)
(0,0) (3,1) (3,3)
(4,1) (3,2) (3,4)
(4,4)
Koding untuk nomor 7 dan 8 :
Node.java
package AIDFSBFS;
import java.util.ArrayList;
import java.util.List;
public class Node {
int row;
int col;
boolean wasVisited;
String label;
List<Node> adjNode;
Node(int row, int col)
{ this.row = row;
this.col = col;
this.label = "("+Integer.toString(row)+","+Integer.toString(col)+")";
this.wasVisited = false;
adjNode = new ArrayList<Node>();
}
}
MazeSolver.java
package AIDFSBFS;
import java.util.ArrayList;
import java.util.List; import
java.util.LinkedList; import
java.util.Queue; import
java.util.Stack;
public class MazeSolver
{
private int
myMaze[][]={{0,1,0,1,1},
{0,0,0,0,1}, {1,0,1,0,1},
{1,0,0,0,0}, {1,0,1,1,0}};
List<Node> nodes;
String moveOrder;
private final int MAX_ROWS=5, MAX_COLS=5;
private int newRow, newCol;
Stack<Node> stackNodes;
Queue<Node> queueNodes;
List<Node> listVisitedNodes;
Node startNode;
Node goalNode;
public MazeSolver(String moveOrder)
{
super();
nodes = new ArrayList<Node>();
stackNodes = new Stack<Node>();
queueNodes = new LinkedList<Node>();
listVisitedNodes = new
ArrayList<Node>(); this.moveOrder =
moveOrder; generateNode();
generateAdjacentNode();
}
private boolean isPossibleMove(int row, int col, char direction)
{
boolean possible = false;
switch(direction)
{
case 'N':
if(row-1>=0 && myMaze[row-1][col] == 0)
possible = true;
newRow = row-1;
newCol = col;
break;
case 'S':
if(row+1<MAX_ROWS && myMaze[row+1][col] ==
0) possible = true;
newRow = row+1;
newCol = col;
break;
case 'E':
if(col+1<MAX_COLS && myMaze[row][col+1] ==
0) possible = true;
newRow = row;
newCol = col+1;
break;
case 'W':
if(col-1>=0 && myMaze[row][col-1] == 0)
possible = true;
newRow = row;
newCol = col-1;
break;
}
return possible;
}
private void generateNode()
{
for(int i=0; i<MAX_ROWS; i++)
{
for(int j=0; j<MAX_COLS; j++)
{
if(myMaze[i][j] == 0)
{
Node node = new Node(i,
j); nodes.add(node);
}
}
}
}
private void generateAdjacentNode()
{
for(Node node: nodes)
{
int row = node.row;
int col = node.col;
for(int i=0; i<4; i++)
{
char direction = moveOrder.charAt(i);
if(isPossibleMove(row, col, direction))
{
Node tmpNode = new Node(newRow, newCol); Node
adjNode = nodes.get(getIndex(tmpNode));
node.adjNode.add(adjNode);
}
}
}
}
private int getIndex(Node tmpNode)
{
for(int i=0; i<nodes.size(); i++)
{
Node node = nodes.get(i);
if(node.row == tmpNode.row && node.col ==
tmpNode.col) return i;
}
return -1;
}
private void clearVisited()
{
for(int i=0; i<nodes.size(); i++)
{
nodes.get(i).wasVisited = false;
}
}
private void displayNode()
{
for(Node node: listVisitedNodes)
{
System.out.println(node.label);
}
}
private Node getUnvisitedAdjacentNode(Node currentNode)
{
Node adjNode = null;
for(int i=0; i<currentNode.adjNode.size(); i++)
{
if(currentNode.adjNode.get(i).wasVisited ==
false) return currentNode.adjNode.get(i);
}
return adjNode;
}
private boolean solveWithDFS(Node startNode, Node goalNode)
{
listVisitedNodes.clear();
Node currentNode = nodes.get(getIndex(startNode));
nodes.get(getIndex(startNode)).wasVisited = true;
stackNodes.push(currentNode);
listVisitedNodes.add(currentNode);
while(!stackNodes.isEmpty())
{
Node tmpNode = stackNodes.peek();
currentNode = getUnvisitedAdjacentNode(tmpNode);
if(currentNode != null)
{
nodes.get(getIndex(currentNode)).wasVisited = true;
listVisitedNodes.add(currentNode);
if(currentNode.label.contentEquals(goalNode.label))
{
clearVisited();
return true;
}
stackNodes.push(currentNode);
} else {
stackNodes.pop();
}
}
clearVisited();
return false;
}
private boolean solveWithBFS(Node startNode, Node goalNode)
{
listVisitedNodes.clear();
Node currentNode = nodes.get(getIndex(startNode));
nodes.get(getIndex(startNode)).wasVisited = true;
queueNodes.add(currentNode);
listVisitedNodes.add(currentNode);
while(!queueNodes.isEmpty())
{
Node tmpNode = queueNodes.peek();
currentNode = getUnvisitedAdjacentNode(tmpNode);
if(currentNode != null)
{
nodes.get(getIndex(currentNode)).wasVisited = true;
listVisitedNodes.add(currentNode);
if(currentNode.label.contentEquals(goalNode.label))
{
clearVisited();
return true;
}
queueNodes.add(currentNode);
} else {
queueNodes.remove();
}
}
clearVisited();
return false;
}
public static void main(String[] args) { //
TODO code application logic here
MazeSolver ms = new MazeSolver("NSEW");
ms.startNode = new Node(0,2);
ms.goalNode = new Node(4,4);
for(Node node: ms.nodes)
{
System.out.print(node.label+":t");
for(Node nodeAdj: node.adjNode)
{
System.out.print(nodeAdj.label+" ");
}
System.out.println();
}
System.out.println("Solve with DFS");
if(ms.solveWithDFS(ms.startNode, ms.goalNode))
{
ms.displayNode();
System.out.println("Solving with
"+ms.listVisitedNodes.size()+" visiting node");
} else {
System.out.println("Goal State didn't find");
}
System.out.println("nnSolve with BFS : ");
if(ms.solveWithBFS(ms.startNode, ms.goalNode))
{
ms.displayNode();
System.out.println("Solving with
"+ms.listVisitedNodes.size()+" visiting node");
} else {
System.out.println("Goal State didn't find");
}
}
}
7. Hasil penelusuran DFS dengan urutan operator NORTH-SOUTH-EAST-WEST :
(0,2), (1,2), (1,3), (2,3), (3,3), (3,4), (4,4)
8. Hasil penelusuran BFS dengan urutan operator NORTH-SOUTH-EAST-WEST : (0,2),
(1,2), (1,3), (1,1), (2,3), (2,1), (1,0), (3,3), (3,1), (0,0), (3,4), (3,2), (4,1), (4,4)
9. Kesimpulan anda ?
- Pada metode DFS, program akan menelusuri suatu node sampai ke child yang paling
ujung sebelum melanjutkan ke node selanjutnya yang levelnya lebih tinggi.
- Pada metode BFS, program akan melakukan pencarian dimulai dari node-node
dengan level paling tinggi sebelum menuju ke node dengan level yang lebih rendah
Laporan ai modul 3-if b 2014-14102055-deprilana ego prakasa

More Related Content

What's hot

Hyrje openmp
Hyrje openmpHyrje openmp
Hyrje openmpL Dr
 
Шаблоны проектирования 2
Шаблоны проектирования 2Шаблоны проектирования 2
Шаблоны проектирования 2Constantin Kichinsky
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17Sergey Platonov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Bài tập tuần 2
Bài tập tuần 2Bài tập tuần 2
Bài tập tuần 2Cong Nguyen
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеPlatonov Sergey
 
Java лаб13
Java лаб13Java лаб13
Java лаб13Enkhee99
 
Bai tap tham khao CSPE
Bai tap tham khao CSPEBai tap tham khao CSPE
Bai tap tham khao CSPEmrcoffee282
 
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30Chris Ohk
 
Sakhtoman dadeha 90-91 - nimsal 2 -F1notes.ir
Sakhtoman dadeha   90-91 - nimsal 2 -F1notes.irSakhtoman dadeha   90-91 - nimsal 2 -F1notes.ir
Sakhtoman dadeha 90-91 - nimsal 2 -F1notes.irehsangh100
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSDarwin Durand
 
The core of javascript
The core of javascriptThe core of javascript
The core of javascriptspringuper
 

What's hot (20)

Hyrje openmp
Hyrje openmpHyrje openmp
Hyrje openmp
 
Java
Java Java
Java
 
Шаблоны проектирования 2
Шаблоны проектирования 2Шаблоны проектирования 2
Шаблоны проектирования 2
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Bài tập tuần 2
Bài tập tuần 2Bài tập tuần 2
Bài tập tuần 2
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
 
Java
JavaJava
Java
 
JQuery
JQueryJQuery
JQuery
 
Taller de string(java)
Taller de string(java)Taller de string(java)
Taller de string(java)
 
Bai tap tham khao CSPE
Bai tap tham khao CSPEBai tap tham khao CSPE
Bai tap tham khao CSPE
 
MUDA
MUDAMUDA
MUDA
 
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
 
Sakhtoman dadeha 90-91 - nimsal 2 -F1notes.ir
Sakhtoman dadeha   90-91 - nimsal 2 -F1notes.irSakhtoman dadeha   90-91 - nimsal 2 -F1notes.ir
Sakhtoman dadeha 90-91 - nimsal 2 -F1notes.ir
 
All set1
All set1All set1
All set1
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 
Programs
ProgramsPrograms
Programs
 
Programs
ProgramsPrograms
Programs
 
The core of javascript
The core of javascriptThe core of javascript
The core of javascript
 

Viewers also liked

Pertemuan 4-metode-pencarian-dan-pelacakan
Pertemuan 4-metode-pencarian-dan-pelacakanPertemuan 4-metode-pencarian-dan-pelacakan
Pertemuan 4-metode-pencarian-dan-pelacakanwillyhayon
 
Robots As Cooperative Partners
Robots As Cooperative PartnersRobots As Cooperative Partners
Robots As Cooperative PartnersBurhanus Shidqy
 
Analisis Sistem Informasi [Materi VII]
Analisis Sistem Informasi [Materi VII]Analisis Sistem Informasi [Materi VII]
Analisis Sistem Informasi [Materi VII]Erikson Hutabarat
 
Analisis Sistem Informasi [Materi VI]
Analisis Sistem Informasi [Materi VI]Analisis Sistem Informasi [Materi VI]
Analisis Sistem Informasi [Materi VI]Erikson Hutabarat
 
Analisis Sistem Informasi [Materi III]
Analisis Sistem Informasi [Materi III]Analisis Sistem Informasi [Materi III]
Analisis Sistem Informasi [Materi III]Erikson Hutabarat
 
Stmik angkatan 18 dan poltek 13 VA (n-s)
Stmik angkatan 18 dan poltek 13 VA  (n-s)Stmik angkatan 18 dan poltek 13 VA  (n-s)
Stmik angkatan 18 dan poltek 13 VA (n-s)PalComTech
 
Analisis Sistem Informasi [Materi IV]
Analisis Sistem Informasi [Materi IV]Analisis Sistem Informasi [Materi IV]
Analisis Sistem Informasi [Materi IV]Erikson Hutabarat
 
MIS BAB 6 Sistem Pakar
MIS BAB 6 Sistem PakarMIS BAB 6 Sistem Pakar
MIS BAB 6 Sistem PakarRiza Nurman
 
Analisis Sistem Informasi [Materi V]
Analisis Sistem Informasi [Materi V]Analisis Sistem Informasi [Materi V]
Analisis Sistem Informasi [Materi V]Erikson Hutabarat
 
Analisis Sistem Informasi [Materi I]
Analisis Sistem Informasi [Materi I]Analisis Sistem Informasi [Materi I]
Analisis Sistem Informasi [Materi I]Erikson Hutabarat
 
Jurnal analisis dan perancangan sistem informasi akademik
Jurnal   analisis dan perancangan sistem informasi akademikJurnal   analisis dan perancangan sistem informasi akademik
Jurnal analisis dan perancangan sistem informasi akademikRatzman III
 
Kecerdasan buatan
Kecerdasan buatanKecerdasan buatan
Kecerdasan buatanzhu ma
 

Viewers also liked (14)

Pertemuan 4-metode-pencarian-dan-pelacakan
Pertemuan 4-metode-pencarian-dan-pelacakanPertemuan 4-metode-pencarian-dan-pelacakan
Pertemuan 4-metode-pencarian-dan-pelacakan
 
Robots As Cooperative Partners
Robots As Cooperative PartnersRobots As Cooperative Partners
Robots As Cooperative Partners
 
Tugas sistem pakar
Tugas sistem pakarTugas sistem pakar
Tugas sistem pakar
 
Analisis Sistem Informasi [Materi VII]
Analisis Sistem Informasi [Materi VII]Analisis Sistem Informasi [Materi VII]
Analisis Sistem Informasi [Materi VII]
 
Analisis Sistem Informasi [Materi VI]
Analisis Sistem Informasi [Materi VI]Analisis Sistem Informasi [Materi VI]
Analisis Sistem Informasi [Materi VI]
 
Analisis Sistem Informasi [Materi III]
Analisis Sistem Informasi [Materi III]Analisis Sistem Informasi [Materi III]
Analisis Sistem Informasi [Materi III]
 
Stmik angkatan 18 dan poltek 13 VA (n-s)
Stmik angkatan 18 dan poltek 13 VA  (n-s)Stmik angkatan 18 dan poltek 13 VA  (n-s)
Stmik angkatan 18 dan poltek 13 VA (n-s)
 
Analisis Sistem Informasi [Materi IV]
Analisis Sistem Informasi [Materi IV]Analisis Sistem Informasi [Materi IV]
Analisis Sistem Informasi [Materi IV]
 
MIS BAB 6 Sistem Pakar
MIS BAB 6 Sistem PakarMIS BAB 6 Sistem Pakar
MIS BAB 6 Sistem Pakar
 
Analisis Sistem Informasi [Materi V]
Analisis Sistem Informasi [Materi V]Analisis Sistem Informasi [Materi V]
Analisis Sistem Informasi [Materi V]
 
Jaringan komputer
Jaringan komputerJaringan komputer
Jaringan komputer
 
Analisis Sistem Informasi [Materi I]
Analisis Sistem Informasi [Materi I]Analisis Sistem Informasi [Materi I]
Analisis Sistem Informasi [Materi I]
 
Jurnal analisis dan perancangan sistem informasi akademik
Jurnal   analisis dan perancangan sistem informasi akademikJurnal   analisis dan perancangan sistem informasi akademik
Jurnal analisis dan perancangan sistem informasi akademik
 
Kecerdasan buatan
Kecerdasan buatanKecerdasan buatan
Kecerdasan buatan
 

More from Deprilana Ego Prakasa

Modul5 deprilana ego-prakasa-14102055_IF-B
Modul5 deprilana ego-prakasa-14102055_IF-BModul5 deprilana ego-prakasa-14102055_IF-B
Modul5 deprilana ego-prakasa-14102055_IF-BDeprilana Ego Prakasa
 
Modul4 deprilana ego-prakasa-14102055_IF-B
Modul4 deprilana ego-prakasa-14102055_IF-BModul4 deprilana ego-prakasa-14102055_IF-B
Modul4 deprilana ego-prakasa-14102055_IF-BDeprilana Ego Prakasa
 
Modul3 deprilana ego-prakasa-14102055_IF-b
Modul3 deprilana ego-prakasa-14102055_IF-bModul3 deprilana ego-prakasa-14102055_IF-b
Modul3 deprilana ego-prakasa-14102055_IF-bDeprilana Ego Prakasa
 
14102055 deprilana ego prakasa-modul-4
14102055 deprilana ego prakasa-modul-414102055 deprilana ego prakasa-modul-4
14102055 deprilana ego prakasa-modul-4Deprilana Ego Prakasa
 
Laporan ai modul 2-if b 2014-14102055-deprilana ego prakasa
Laporan ai modul 2-if b 2014-14102055-deprilana ego prakasaLaporan ai modul 2-if b 2014-14102055-deprilana ego prakasa
Laporan ai modul 2-if b 2014-14102055-deprilana ego prakasaDeprilana Ego Prakasa
 
Modul2 deprilana ego-prakasa-14102055_if-b
Modul2 deprilana ego-prakasa-14102055_if-bModul2 deprilana ego-prakasa-14102055_if-b
Modul2 deprilana ego-prakasa-14102055_if-bDeprilana Ego Prakasa
 
[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4
[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4
[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4Deprilana Ego Prakasa
 

More from Deprilana Ego Prakasa (20)

Dokumentasi rpl
Dokumentasi rplDokumentasi rpl
Dokumentasi rpl
 
Proposal multimedia-bab-i-ii-iii
Proposal multimedia-bab-i-ii-iiiProposal multimedia-bab-i-ii-iii
Proposal multimedia-bab-i-ii-iii
 
Tugas dsm kelompok11
Tugas dsm kelompok11Tugas dsm kelompok11
Tugas dsm kelompok11
 
Modul5 deprilana ego-prakasa-14102055_IF-B
Modul5 deprilana ego-prakasa-14102055_IF-BModul5 deprilana ego-prakasa-14102055_IF-B
Modul5 deprilana ego-prakasa-14102055_IF-B
 
Modul4 deprilana ego-prakasa-14102055_IF-B
Modul4 deprilana ego-prakasa-14102055_IF-BModul4 deprilana ego-prakasa-14102055_IF-B
Modul4 deprilana ego-prakasa-14102055_IF-B
 
Modul3 deprilana ego-prakasa-14102055_IF-b
Modul3 deprilana ego-prakasa-14102055_IF-bModul3 deprilana ego-prakasa-14102055_IF-b
Modul3 deprilana ego-prakasa-14102055_IF-b
 
14102055 deprilana ego prakasa-modul-4
14102055 deprilana ego prakasa-modul-414102055 deprilana ego prakasa-modul-4
14102055 deprilana ego prakasa-modul-4
 
Laporan ai modul 2-if b 2014-14102055-deprilana ego prakasa
Laporan ai modul 2-if b 2014-14102055-deprilana ego prakasaLaporan ai modul 2-if b 2014-14102055-deprilana ego prakasa
Laporan ai modul 2-if b 2014-14102055-deprilana ego prakasa
 
Modul2 deprilana ego-prakasa-14102055_if-b
Modul2 deprilana ego-prakasa-14102055_if-bModul2 deprilana ego-prakasa-14102055_if-b
Modul2 deprilana ego-prakasa-14102055_if-b
 
14102055
1410205514102055
14102055
 
[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4
[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4
[Laporan ai kelas b] 14102055 deprilana ego prakasa_modul 4
 
Laporan praktikum multimedia 5 5
Laporan praktikum multimedia 5 5Laporan praktikum multimedia 5 5
Laporan praktikum multimedia 5 5
 
Laporan praktikum jarkom_4
Laporan praktikum jarkom_4Laporan praktikum jarkom_4
Laporan praktikum jarkom_4
 
Laporan praktikum jarkom_3
Laporan praktikum jarkom_3Laporan praktikum jarkom_3
Laporan praktikum jarkom_3
 
Laporan praktikum jarkom_2
Laporan praktikum jarkom_2Laporan praktikum jarkom_2
Laporan praktikum jarkom_2
 
Laporan praktikum jarkom
Laporan praktikum jarkomLaporan praktikum jarkom
Laporan praktikum jarkom
 
Laporan praktikum multimedia_4-4
Laporan praktikum multimedia_4-4Laporan praktikum multimedia_4-4
Laporan praktikum multimedia_4-4
 
Laporan praktikum multimedia_3-3
Laporan praktikum multimedia_3-3Laporan praktikum multimedia_3-3
Laporan praktikum multimedia_3-3
 
Resume praktikum 7__queue
Resume praktikum 7__queueResume praktikum 7__queue
Resume praktikum 7__queue
 
Resume praktikum 5__linked_list
Resume praktikum 5__linked_listResume praktikum 5__linked_list
Resume praktikum 5__linked_list
 

Recently uploaded

TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...Nguyen Thanh Tu Collection
 
French Revolution (फ्रेंच राज्यक्रांती)
French Revolution  (फ्रेंच राज्यक्रांती)French Revolution  (फ्रेंच राज्यक्रांती)
French Revolution (फ्रेंच राज्यक्रांती)Shankar Aware
 
Seth-Godin-–-Tribus-PDFDrive-.pdf en espaoñ
Seth-Godin-–-Tribus-PDFDrive-.pdf en espaoñSeth-Godin-–-Tribus-PDFDrive-.pdf en espaoñ
Seth-Godin-–-Tribus-PDFDrive-.pdf en espaoñcarrenoelio8
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...Nguyen Thanh Tu Collection
 

Recently uploaded (6)

TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
 
LAR MARIA MÃE DE ÁFRICA .
LAR MARIA MÃE DE ÁFRICA                 .LAR MARIA MÃE DE ÁFRICA                 .
LAR MARIA MÃE DE ÁFRICA .
 
French Revolution (फ्रेंच राज्यक्रांती)
French Revolution  (फ्रेंच राज्यक्रांती)French Revolution  (फ्रेंच राज्यक्रांती)
French Revolution (फ्रेंच राज्यक्रांती)
 
Seth-Godin-–-Tribus-PDFDrive-.pdf en espaoñ
Seth-Godin-–-Tribus-PDFDrive-.pdf en espaoñSeth-Godin-–-Tribus-PDFDrive-.pdf en espaoñ
Seth-Godin-–-Tribus-PDFDrive-.pdf en espaoñ
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
 

Laporan ai modul 3-if b 2014-14102055-deprilana ego prakasa

  • 1. Sekolah Tinggi Teknologi Telematika Telkom Laporan Praktikum Kecerdasan Buatan Modul 3 – Implementasi DFS dan BFS pada Permainan Labirin Dosen Pengampu: Muhammad Zidny Naf’an,S.Kom., M.Kom. Nama Mahasiswa : Deprilana Ego Prakasa NIM : 14102055 Kelas : S1 IF B 2014
  • 2. Jawaban Latihan Soal 1. Berdasarkan pohon pelacakan di atas, hasil penelusuran metode DFS adalah : (1,1), (1,2), (2,1), (3,1), (3,2), (3,3), (3,4), (4,3) 2. Berdasarkan pohon pelacakan di atas, hasil penelusuran metode BFS adalah : (1,1), (1,2), (2,1), (3,1), (3,2), (4,1), (3,3), (3,4), (4,3) 3. Jalankan program yang telah dibuat, hasilnya : Node.java package AIDFSBFS; import java.util.ArrayList; import java.util.List; public class Node { int row; int col;
  • 3. boolean wasVisited; String label; List<Node> adjNode; Node(int row, int col) { this.row = row; this.col = col; this.label = "("+Integer.toString(row)+","+Integer.toString(col)+")"; this.wasVisited = false; adjNode = new ArrayList<Node>(); } } MazeSolver.java package AIDFSBFS; import java.util.ArrayList; import java.util.List; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class MazeSolver { private int myMaze[][]={{1,1,1,1,1}, {1,0,0,1,0}, {1,0,1,1,1}, {1,0,0,0,0}, {1,0,1,0,1}}; List<Node> nodes; String moveOrder; private final int MAX_ROWS=5, MAX_COLS=5; private int newRow, newCol; Stack<Node> stackNodes; Queue<Node> queueNodes; List<Node> listVisitedNodes; Node startNode; Node goalNode; public MazeSolver(String moveOrder)
  • 4. { super(); nodes = new ArrayList<Node>(); stackNodes = new Stack<Node>(); queueNodes = new LinkedList<Node>(); listVisitedNodes = new ArrayList<Node>(); this.moveOrder = moveOrder; generateNode(); generateAdjacentNode(); } private boolean isPossibleMove(int row, int col, char direction) { boolean possible = false; switch(direction) { case 'N': if(row-1>=0 && myMaze[row-1][col] == 0) possible = true; newRow = row-1; newCol = col; break; case 'S': if(row+1<MAX_ROWS && myMaze[row+1][col] == 0) possible = true; newRow = row+1; newCol = col; break; case 'E': if(col+1<MAX_COLS && myMaze[row][col+1] == 0) possible = true; newRow = row; newCol = col+1; break; case 'W': if(col-1>=0 && myMaze[row][col-1] == 0) possible = true; newRow = row; newCol = col-1; break; } return possible; } private void generateNode() { for(int i=0; i<MAX_ROWS; i++) { for(int j=0; j<MAX_COLS; j++)
  • 5. { if(myMaze[i][j] == 0) { Node node = new Node(i, j); nodes.add(node); } } } } private void generateAdjacentNode() { for(Node node: nodes) { int row = node.row; int col = node.col; for(int i=0; i<4; i++) { char direction = moveOrder.charAt(i); if(isPossibleMove(row, col, direction)) { Node tmpNode = new Node(newRow, newCol); Node adjNode = nodes.get(getIndex(tmpNode)); node.adjNode.add(adjNode); } } } } private int getIndex(Node tmpNode) { for(int i=0; i<nodes.size(); i++) { Node node = nodes.get(i); if(node.row == tmpNode.row && node.col == tmpNode.col) return i; } return -1; } private void clearVisited() { for(int i=0; i<nodes.size(); i++) { nodes.get(i).wasVisited = false; } } private void displayNode()
  • 6. { for(Node node: listVisitedNodes) { System.out.println(node.label); } } private Node getUnvisitedAdjacentNode(Node currentNode) { Node adjNode = null; for(int i=0; i<currentNode.adjNode.size(); i++) { if(currentNode.adjNode.get(i).wasVisited == false) return currentNode.adjNode.get(i); } return adjNode; } private boolean solveWithDFS(Node startNode, Node goalNode) { listVisitedNodes.clear(); Node currentNode = nodes.get(getIndex(startNode)); nodes.get(getIndex(startNode)).wasVisited = true; stackNodes.push(currentNode); listVisitedNodes.add(currentNode); while(!stackNodes.isEmpty()) { Node tmpNode = stackNodes.peek(); currentNode = getUnvisitedAdjacentNode(tmpNode); if(currentNode != null) { nodes.get(getIndex(currentNode)).wasVisited = true; listVisitedNodes.add(currentNode); if(currentNode.label.contentEquals(goalNode.label)) { clearVisited(); return true; } stackNodes.push(currentNode); } else { stackNodes.pop();
  • 7. } } clearVisited(); return false; } private boolean solveWithBFS(Node startNode, Node goalNode) { listVisitedNodes.clear(); Node currentNode = nodes.get(getIndex(startNode)); nodes.get(getIndex(startNode)).wasVisited = true; queueNodes.add(currentNode); listVisitedNodes.add(currentNode); while(!queueNodes.isEmpty()) { Node tmpNode = queueNodes.peek(); currentNode = getUnvisitedAdjacentNode(tmpNode); if(currentNode != null) { nodes.get(getIndex(currentNode)).wasVisited = true; listVisitedNodes.add(currentNode); if(currentNode.label.contentEquals(goalNode.label)) { clearVisited(); return true; } queueNodes.add(currentNode); } else { queueNodes.remove(); } } clearVisited(); return false; } public static void main(String[] args) { // TODO code application logic here
  • 8. MazeSolver ms = new MazeSolver("NESW"); ms.startNode = new Node(1,1); ms.goalNode = new Node(4,3); for(Node node: ms.nodes) { System.out.print(node.label+":t"); for(Node nodeAdj: node.adjNode) { System.out.print(nodeAdj.label+" "); } System.out.println(); } System.out.println("Solve with DFS"); if(ms.solveWithDFS(ms.startNode, ms.goalNode)) { ms.displayNode(); System.out.println("Solving with "+ms.listVisitedNodes.size()+" visiting node"); } else { System.out.println("Goal State didn't find"); } System.out.println("nnSolve with BFS : "); if(ms.solveWithBFS(ms.startNode, ms.goalNode)) { ms.displayNode(); System.out.println("Solving with "+ms.listVisitedNodes.size()+" visiting node"); } else { System.out.println("Goal State didn't find"); } } }
  • 9. Screenshot hasil : 4. Dengan menggunakan DFS dan BFS coba ganti urutan operator menjadi NORTH- EAST-SOUTH-WEST. Bagaimana hasilnya ?
  • 10. Untuk selanjutnya menggunakan labirin berikut : 5. Deklarasi array 2-dimensi untuk labirin diatas :
  • 11. 6. Pohon pelacakan labirin di atas ? (0,2) (1,2) (1,1) (1,3) (1,0) (2,1) (2,3) (0,0) (3,1) (3,3) (4,1) (3,2) (3,4) (4,4)
  • 12. Koding untuk nomor 7 dan 8 : Node.java package AIDFSBFS; import java.util.ArrayList; import java.util.List; public class Node { int row; int col; boolean wasVisited; String label; List<Node> adjNode; Node(int row, int col) { this.row = row; this.col = col; this.label = "("+Integer.toString(row)+","+Integer.toString(col)+")"; this.wasVisited = false; adjNode = new ArrayList<Node>(); } } MazeSolver.java package AIDFSBFS; import java.util.ArrayList; import java.util.List; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class MazeSolver { private int myMaze[][]={{0,1,0,1,1}, {0,0,0,0,1}, {1,0,1,0,1}, {1,0,0,0,0}, {1,0,1,1,0}};
  • 13. List<Node> nodes; String moveOrder; private final int MAX_ROWS=5, MAX_COLS=5; private int newRow, newCol; Stack<Node> stackNodes; Queue<Node> queueNodes; List<Node> listVisitedNodes; Node startNode; Node goalNode; public MazeSolver(String moveOrder) { super(); nodes = new ArrayList<Node>(); stackNodes = new Stack<Node>(); queueNodes = new LinkedList<Node>(); listVisitedNodes = new ArrayList<Node>(); this.moveOrder = moveOrder; generateNode(); generateAdjacentNode(); } private boolean isPossibleMove(int row, int col, char direction) { boolean possible = false; switch(direction) { case 'N': if(row-1>=0 && myMaze[row-1][col] == 0) possible = true; newRow = row-1; newCol = col; break; case 'S': if(row+1<MAX_ROWS && myMaze[row+1][col] == 0) possible = true; newRow = row+1; newCol = col; break; case 'E': if(col+1<MAX_COLS && myMaze[row][col+1] == 0) possible = true; newRow = row; newCol = col+1; break;
  • 14. case 'W': if(col-1>=0 && myMaze[row][col-1] == 0) possible = true; newRow = row; newCol = col-1; break; } return possible; } private void generateNode() { for(int i=0; i<MAX_ROWS; i++) { for(int j=0; j<MAX_COLS; j++) { if(myMaze[i][j] == 0) { Node node = new Node(i, j); nodes.add(node); } } } } private void generateAdjacentNode() { for(Node node: nodes) { int row = node.row; int col = node.col; for(int i=0; i<4; i++) { char direction = moveOrder.charAt(i); if(isPossibleMove(row, col, direction)) { Node tmpNode = new Node(newRow, newCol); Node adjNode = nodes.get(getIndex(tmpNode)); node.adjNode.add(adjNode); } } } } private int getIndex(Node tmpNode) { for(int i=0; i<nodes.size(); i++) { Node node = nodes.get(i);
  • 15. if(node.row == tmpNode.row && node.col == tmpNode.col) return i; } return -1; } private void clearVisited() { for(int i=0; i<nodes.size(); i++) { nodes.get(i).wasVisited = false; } } private void displayNode() { for(Node node: listVisitedNodes) { System.out.println(node.label); } } private Node getUnvisitedAdjacentNode(Node currentNode) { Node adjNode = null; for(int i=0; i<currentNode.adjNode.size(); i++) { if(currentNode.adjNode.get(i).wasVisited == false) return currentNode.adjNode.get(i); } return adjNode; } private boolean solveWithDFS(Node startNode, Node goalNode) { listVisitedNodes.clear(); Node currentNode = nodes.get(getIndex(startNode)); nodes.get(getIndex(startNode)).wasVisited = true; stackNodes.push(currentNode); listVisitedNodes.add(currentNode); while(!stackNodes.isEmpty()) { Node tmpNode = stackNodes.peek();
  • 16. currentNode = getUnvisitedAdjacentNode(tmpNode); if(currentNode != null) { nodes.get(getIndex(currentNode)).wasVisited = true; listVisitedNodes.add(currentNode); if(currentNode.label.contentEquals(goalNode.label)) { clearVisited(); return true; } stackNodes.push(currentNode); } else { stackNodes.pop(); } } clearVisited(); return false; } private boolean solveWithBFS(Node startNode, Node goalNode) { listVisitedNodes.clear(); Node currentNode = nodes.get(getIndex(startNode)); nodes.get(getIndex(startNode)).wasVisited = true; queueNodes.add(currentNode); listVisitedNodes.add(currentNode); while(!queueNodes.isEmpty()) { Node tmpNode = queueNodes.peek(); currentNode = getUnvisitedAdjacentNode(tmpNode); if(currentNode != null) { nodes.get(getIndex(currentNode)).wasVisited = true; listVisitedNodes.add(currentNode); if(currentNode.label.contentEquals(goalNode.label)) { clearVisited(); return true;
  • 17. } queueNodes.add(currentNode); } else { queueNodes.remove(); } } clearVisited(); return false; } public static void main(String[] args) { // TODO code application logic here MazeSolver ms = new MazeSolver("NSEW"); ms.startNode = new Node(0,2); ms.goalNode = new Node(4,4); for(Node node: ms.nodes) { System.out.print(node.label+":t"); for(Node nodeAdj: node.adjNode) { System.out.print(nodeAdj.label+" "); } System.out.println(); } System.out.println("Solve with DFS"); if(ms.solveWithDFS(ms.startNode, ms.goalNode)) { ms.displayNode(); System.out.println("Solving with "+ms.listVisitedNodes.size()+" visiting node"); } else { System.out.println("Goal State didn't find"); } System.out.println("nnSolve with BFS : "); if(ms.solveWithBFS(ms.startNode, ms.goalNode)) { ms.displayNode(); System.out.println("Solving with "+ms.listVisitedNodes.size()+" visiting node"); } else { System.out.println("Goal State didn't find"); }
  • 18. } } 7. Hasil penelusuran DFS dengan urutan operator NORTH-SOUTH-EAST-WEST :
  • 19. (0,2), (1,2), (1,3), (2,3), (3,3), (3,4), (4,4) 8. Hasil penelusuran BFS dengan urutan operator NORTH-SOUTH-EAST-WEST : (0,2), (1,2), (1,3), (1,1), (2,3), (2,1), (1,0), (3,3), (3,1), (0,0), (3,4), (3,2), (4,1), (4,4) 9. Kesimpulan anda ? - Pada metode DFS, program akan menelusuri suatu node sampai ke child yang paling ujung sebelum melanjutkan ke node selanjutnya yang levelnya lebih tinggi. - Pada metode BFS, program akan melakukan pencarian dimulai dari node-node dengan level paling tinggi sebelum menuju ke node dengan level yang lebih rendah