You are on page 1of 58

Halaman Judul

JURNAL METODE SEARCHING


KECERDASAN BUATAN 1
Dosen Pengampu : Iwan Ady Prabowo, S.Kom, M. Kom
PAGI / MALAM
A1/A2/B/M1/M2

Oleh:
KELOMPOK X

NIM Nama
10.5.00018 Paijo
10.5.00018 Paijo
10.5.00018 Paijo
10.5.00018 Paijo

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER

STMIK SINAR NUSANTARA


SURAKARTA
2017

i
Daftar isi

Halaman Judul .................................................................................................................................. i


Daftar isi ..........................................................................................................................................ii
Daftar Gambar ............................................................................................................................... iii
Daftar Tabel .................................................................................................................................... iv
Daftar Pseudo Code ......................................................................................................................... v
1. BREAD-FIRST SEARCH (BFS) .......................................................................................... 1
2. DEPT-FIRST SEARCH (BFS) .............................................................................................. 2
3. Depth-Limited Search (DLS) ................................................................................................. 3
4. Uniform Cost Search (UCS) .................................................................................................. 4
5. Iterative-Deepening Search (IDS) .......................................................................................... 7
6. Bi-Directional Search (BDS) ............................................................................................... 10
7. Generate-and-Test (bangkitkan dan Uji) .............................................................................. 41
8. Hill Climbing (Pendakian Bukit) ......................................................................................... 42
9. Simulated Annealing (SA) ................................................................................................... 43
10. Best-First Search (Pencarian Terbaik dahulu) ..................................................................... 44
11. Greedy Best-First Search ..................................................................................................... 45
12. A* (A Bintang) ..................................................................................................................... 46
13. Iterative Deepening A* (IDA*) ........................................................................................... 47
14. Simplified Memory-Bounded A*(SMA*) ........................................................................... 48
15. Bi-Directional A*(BDA*) .................................................................................................... 49
16. Modified Bi-directional A*(MBDA*) ................................................................................. 50
17. Dynamic Weighting A*(DWA) ........................................................................................... 51
Pengesahan .................................................................................................................................... 52
Referensi ........................................................................................................................................ 53

ii
Daftar Gambar

Gambar 1 Java is Hot .................................................................... Error! Bookmark not defined.

iii
Daftar Tabel
Tabel 1 pernyataan Ekspresi ......................................................... Error! Bookmark not defined.

iv
Daftar Pseudo Code

No table of figures entries found.

v
1. BREAD-FIRST SEARCH (BFS)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

1
2. DEPT-FIRST SEARCH (BFS)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

2
3. Depth-Limited Search (DLS)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

3
4. Uniform Cost Search (UCS)
A. Sejarah ( Penemu, Arti)
Uniform Cost Search adalah algoritma terbaik untuk masalah pencarian, yang tidak
melibatkan penggunaan heuristik. Ini bisa memecahkan grafik umum untuk biaya optimal.
Uniform Cost Search karena kedengarannya pencarian di cabang-cabang yang harganya
kurang lebih sama.

B. Algoritma (Flowchart)

Start Node: A

Goal Node: G

Step 1
Frontier:

Node A

Cost 0
Explored:

Step 2:
Expand A

Frontier:

Node D B

Cost 3 5
Explored: A

Step 3:
Expand D

Frontier:

Node B E F

4
Cost 5 5 5
Explored: AD

Step 4:
Expand A

Frontier:

Node E F C

Cost 5 5 6
Explored: ADB

Step 5:
Expand E

Frontier:

Node F C

Cost 5 6
Explored: ADBE

Note: B was not added to the priority queue because it was already explored
Step 6:
Expand F

Frontier:

Node C G

Cost 6 8
Explored: ADBEF

Step 7:
Expand C

Frontier:

Node G

Cost 8
Explored: ADBEFC

Step 8:
Expand G

Found the path: A ke D ke F ke G

5
C. Pseudo-Code
procedure UniformCostSearch(Graph, root, goal)
node := root, cost = 0

frontier := empty priority queue containing node

explored := empty set

do

if frontier is empty

return failure

node := frontier.pop()
if node is goal

return solution

explored.add(node)
for each of nodes neighbors n

if n is not in explored

if n is not in frontier

frontier.add(n)
if n is in frontier with higher cost

replace existing node with n

D. Implementasi Metode ( Penerapan Metode)


hampir sama dgn BFS, bedanya adalah bahwa BFS menggunakan urutan level dari yg
paling rendah sampai yg paling tinggi. Sedangkan UCS berusaha menemukan solusi dgn total
biaya terendah yg dihitung berdasarkan biaya dari simpul asal menuju ke simpul tujuan. Biaya
dari simpul asal ke suatu simpul n dilambangkan sebagai g(n).

E. Kesimpulan
Karena mengikuti konsep BFS, maka UCS menjamin ditemukannya solusi dan solusi yg
ditemukannya selalu yg terbaik. Dgn kata lain, UCS adalah complete dan optimal. Syarat yg
harus dipenuhi oleh pohon UCS adalah g(successor(n) >= g(n) untuk setiap simpul n. Jika syarat
ini tidak dipenuhi maka UCS menjadi tidak complete dan tidak optimal.

6
5. Iterative-Deepening Search (IDS)
A. Sejarah ( Penemu, Arti)
IDS merupakan metode yang menggabungkan kelebihan BFS (Complete dan Optimal)
dengan kelebihan DFS (space complexity rendah atau membutuhkan sedikit memori) Tetapi
konsekwensinya adalah time complexitynya menjadi tinggi. Iteratif memperdalam kedalaman-
pertama pencarian (IDS) adalah pencarian ruang strategi di mana pencarian mendalam-terbatas
dijalankan berulang kali, meningkatkan batas kedalaman dengan setiap iterasi sampai mencapai,
kedalaman negara tujuan dangkal. IDS setara dengan luas-pertama pencarian, tetapi
menggunakan memori lebih sedikit, pada setiap iterasi, ia mengunjungi node dalam pohon
pencarian dalam urutan yang sama seperti depth-first search, tapi urutan kumulatif di mana node
pertama kali mengunjungi secara efektif luasnya -pertama.
IDS menggabungkan depth-first pencari ruang-efisiensi dan kelengkapan luas-pertama
pencarian ini (ketika faktor percabangan terbatas). Ini adalah optimal ketika biaya jalan adalah
fungsi non-penurunan kedalaman node. Kompleksitas ruang IDS adalah, di mana merupakan
faktor percabangan dan kedalaman dangkal gawang. Karena berulang memperdalam kunjungan
menyatakan beberapa kali, hal itu mungkin tampak sia-sia, tapi ternyata menjadi tidak begitu
mahal, karena di pohon sebagian besar node berada di tingkat bawah, sehingga tidak terlalu
menjadi masalah jika tingkat atas yang dikunjungi beberapa kali.

B. Algoritma (Flowchart)

C. Pseudo-Code

pseudo code:
procedure IDDFS(root)

7
for depth from 0 to
found DLS(root, depth)
if found null
return found

procedure DLS(node, depth)


if depth = 0 and node is a goal
return node
else if depth > 0
foreach child of node
found DLS(child, depth1)
if found null
return found
return null

D. Implementasi Metode ( Penerapan Metode)


Implementasi algoritma iterative deepening depth-first search dalam permainan labirin.
Implementasi Algoritma Iterative Deepening Depth First Search Dalam Permainan
LabirinKecerdasan buatan atau Artificial Intelligence (AI) merupakan sub-bidang pengetahuan
komputer yang khusus ditujukan untuk membuat software dan hardware yang sepenuhnya bisa
menirukan beberapa fungsi otak manusia. Landasan pengetahuan tersebut akan membuat komputer
memberikan solusi saat kita memberitahukan permasalahan tersebut kepada komputer. Aplikasi
kecerdasan buatan yang akan diambil adalah bidang permainan yakni permainan labirin. Permainan
labirin (maze) merupakan permainan yang bertujuan untuk mencari jalan keluar. Permainan ini
terbentuk dalam 2 dimensi (2D) dan terdiri dari dinding, jalan, pintu masuk dan pintu keluar.
Permasalahan labirin akan terbentuk jika ukuran labirin yang besar disertai dengan jalur dan
percabangan yang kompleks. Algoritma iterative deepening depth first search adalah algoritma
yang akan digunakan dalam melakukan pencarian jalan keluar. Algoritma ini akan melakukan
pencarian jalur solusi berdasarkan tingkat depthlimit yang ditentukan. Penggunaan algoritma
iterative deepening depth first search pada permainan labirin dapat menemukan jalur solusi berupa
jalur menuju pintu keluar dan merupakan jalur terpendek dengan depthlimit terdekat dari depthlimit
awal. Akan tetapi untuk labirin dengan tingkat depthlimit yang besar disertai dengan percabangan
yang kompleks akan membutuhkan waktu, langkah dan depthlimit yang panjang untuk menemukan
jalur solusi.

E. Kesimpulan
Iterative deepening search juga merupakan jenis dari uninformed search, algoritma ini
merupakan gabungan dari kelebihan Breath First Search(BFS) dan Depth First Search (DFS).
Kelebihan dari BFS dimana cara ini tidak menemukan jalan buntu (complete dan optimal)
sementara kelebihan dari DFS yaitu tidak membutuhkan banyak memori. IDS ini melakukan proses
pencarian secara iterative. Dengan konsep penelusuran secara DFS dimulai dari limit 1. Saat solusi
belum ditemukan makan pencarian dilakukan lah iterasi ke-2, pencarian kini limitnya bertambah
menjadi 1 level menjadi limit 2, bila solusi masih belum ditemukan lakukan kembali iterasi ke-3

8
dengan menambah limit 1 level menjadi limit 3. Begitu seterusnya hingga ditemukan solusi yang
dicari.

9
6. Bi-Directional Search (BDS)
A. Sejarah ( Penemu, Arti)
Algoritma BiDi Search (BiDirectional Search) adalah salah satu algoritma yang
digunakan untuk pencarian jalur. Contoh yang dibahas kali ini adalah mengenai pencarian jalur
yang melalui semua titik.

B. Algoritma (Flowchart)

C. Pseudo-Code
1. Lakukan inisialisasi daftar titik sebanyak jumlah titik, dan masukkan masing-masing titik ke
dalam daftar

Dim daftarTitik() As Integer = New Integer(jumlahTitik - 1) {0, 1, 2, 3, 4}


1
Dim daftarTitik() As Integer = New Integer(jumlahTitik - 1) {0, 1, 2, 3, 4}
2. Lakukan inisialisasi daftar jalur sesuai dengan data yang tersedia
Terdapat matriks berukuran [jumlah titik x jumlah titik] untuk menyimpan jalur dari masing-
masing titik
Jika tidak ada jalur diantara 2 titik, maka nilai jalurnya adalah 0

Dim daftarBiaya(,) As Double = New Double(jumlahTitik - 1, jumlahTitik - 1) { _


{0, 10, 0, 0, 11}, _
{12, 0, 20, 6, 9}, _
{0, 15, 0, 14, 0}, _
10
{0, 7, 5, 0, 0}, _
{0, 0, 8, 13, 0} _
}
1
2
3
4
5
6
7
Dim daftarBiaya(,) As Double = New Double(jumlahTitik - 1, jumlahTitik - 1) { _
{0, 10, 0, 0, 11}, _
{12, 0, 20, 6, 9}, _
{0, 15, 0, 14, 0}, _
{0, 7, 5, 0, 0}, _
{0, 0, 8, 13, 0} _
}
3. Tentukan titik awal pencarian jalur

Console.WriteLine("Tentukan titik awal pencarian jalur antara 1 sampai dengan " & jumlahTitik
& ": ")
Dim idxTitikAwal As Integer = Integer.Parse(Console.ReadLine) - 1
1
2
Console.WriteLine("Tentukan titik awal pencarian jalur antara 1 sampai dengan " & jumlahTitik
& ": ")
Dim idxTitikAwal As Integer = Integer.Parse(Console.ReadLine) - 1
4. Tentukan titik tujuan pencarian jalur

Console.WriteLine("Tentukan titik tujuan pencarian jalur antara 1 sampai dengan " &
jumlahTitik & ": ")
Dim idxTitikTujuan As Integer = Integer.Parse(Console.ReadLine) - 1

11
1
2
Console.WriteLine("Tentukan titik tujuan pencarian jalur antara 1 sampai dengan " &
jumlahTitik & ": ")
Dim idx Titik Tujuan As Integer = Integer.Parse(Console.ReadLine) - 1
5. Lakukan perhitungan pencarian jalur melalui semua titik yang ada
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 5a 5e)

Dim jalur As Array List = BiDi (daftar Titik, daftarBiaya, idx Titik Awal, idx Titik Tujuan, (limit
+ 1) / 2)
1
Dim jalur As ArrayList = BiDi(daftar Titik, daftarBiaya, idxTitik Awal, idx Titik Tujuan, (limit +
1) / 2)
Memasuki perhitungan pada fungsi BiDi

5a. Masukkan titik awal sebagai titik pertama yang akan dicari jalurnya
Dim daftar Induk Awal As New ArrayList()
Daftar Induk Awal. Add(idxTitikAwal)
Dim daftar Induk Tujuan As New ArrayList()
Daftar Induk Tujuan.Add(idxTitikTujuan)
1
2
3
4
5
Dim daftar Induk Awal As New ArrayList()
Daftar Induk Awal. Add(idx Titik Awal)

Dim daftarIndukTujuan As New ArrayList()


daftarIndukTujuan.Add(idxTitikTujuan)
5b. Kemudian masukkan titik-titik lain secara terurut dari titik pertama ke titik terakhir
For i As Integer = 0 To daftartitik.Length - 1
If i <> idxTitikAwal Then daftarIndukAwal.Add(i)

12
Next
For i As Integer = daftartitik.Length - 1 To 0 Step -1
If i <> idxTitikTujuan Then daftarIndukTujuan.Add(i)
Next
1
2
3
4
5
6
7
For i As Integer = 0 To daftartitik.Length - 1
If i <> idxTitikAwal Then daftarIndukAwal.Add(i)
Next

For i As Integer = daftartitik.Length - 1 To 0 Step -1


If i <> idxTitikTujuan Then daftarIndukTujuan.Add(i)
Next
5c. Inisialisasi variabel depth / kedalaman untuk mengetahui kedalaman pada saat pencarian jalur
Dim depthAwal(daftartitik.Count - 1) As Integer
Dim depthTujuan(daftartitik.Count - 1) As Integer
Dim depthNormal(daftartitik.Count - 1) As Integer
For i As Integer = 0 To depthNormal.Length - 1
depthAwal(i) = daftartitik.Count - i
depthTujuan(i) = daftartitik.Count - i
depthNormal(i) = daftartitik.Count - 1 - i
Next
1
2
3
4
5
6
13
7
8
Dim depthAwal(daftartitik.Count - 1) As Integer
Dim depthTujuan(daftartitik.Count - 1) As Integer
Dim depthNormal(daftartitik.Count - 1) As Integer
For i As Integer = 0 To depthNormal.Length - 1
depthAwal(i) = daftartitik.Count - i
depthTujuan(i) = daftartitik.Count - i
depthNormal(i) = daftartitik.Count - 1 - i
Next
5d. Masukkan titik pertama ke dalam jalur yang akan dihitung
Dan hilangkan titik tersebut dari daftar titik yang sudah dihitung
Dim jalurAwal As New ArrayList()
jalurAwal.Add(daftarIndukAwal(0))
daftarIndukAwal.RemoveAt(0)
depthAwal(jalurAwal.Count - 1) -= 1
Dim jalurTujuan As New ArrayList()
jalurTujuan.Add(daftarIndukTujuan(0))
daftarIndukTujuan.RemoveAt(0)
depthTujuan(jalurTujuan.Count - 1) -= 1
1
2
3
4
5
6
7
8
9
Dim jalurAwal As New ArrayList()
jalurAwal.Add(daftarIndukAwal(0))
daftarIndukAwal.RemoveAt(0)
depthAwal(jalurAwal.Count - 1) -= 1
14
Dim jalurTujuan As New ArrayList()
jalurTujuan.Add(daftarIndukTujuan(0))
daftarIndukTujuan.RemoveAt(0)
depthTujuan(jalurTujuan.Count - 1) -= 1
* Lakukan perhitungan selama masih ada titik yang belum dihitung (poin 5e 5f)

5e. Lakukan perhitungan pada titik awal berurutan dari titik pertama ke titik terakhir
Metode yang digunakan adalah BFS (Breadth First Search)
5e1. Masukkan titik berikutnya ke dalam jalur yang sedang dihitung
Dan hilangkan titik tersebut dari daftar titik yang sudah dihitung
jalurAwal.Add(titikBerikutnya)
daftarIndukAwal.RemoveAt(0)
1
2
jalurAwal.Add(titikBerikutnya)
daftarIndukAwal.RemoveAt(0)
5e2. Hitung kedalaman pada titik yang sedang dihitung
Apabila nilai kedalaman adalah 0, maka beri nilai awal kedalaman
Selain itu kurangkan nilai kedalamannya dengan 1
If depthAwal(jalurAwal.Count - 1) <= 0 Then
depthAwal(jalurAwal.Count - 1) = depthNormal(jalurAwal.Count - 1)
Else
depthAwal(jalurAwal.Count - 1) -= 1
End If
1
2
3
4
5
If depthAwal(jalurAwal.Count - 1) <= 0 Then
depthAwal(jalurAwal.Count - 1) = depthNormal(jalurAwal.Count - 1)
Else
15
depthAwal(jalurAwal.Count - 1) -= 1
End If
5e3. Jika terdapat jalur antara titik sebelumnya dan titik berikutnya,
dan semua titik sudah dihitung semua atau jumlah titik yang sedang dihitung belum melebihi
limit / batas maksimal kedalaman,
Lakukan pengecekan apakah semua titik sudah dihitung semua
Jika kondisi tersebut benar, maka hentikan perhitungan
If daftarBiaya(titikSebelumnya, titikBerikutnya) <> 0 _
AndAlso (jalurAwal.Count = daftartitik.Count Or jalurAwal.Count < limit) Then

If jalurAwal.Count = daftartitik.Count Then


Console.WriteLine("Titik Awal -> Jalur sudah ditemukan")
Console.Write("Titik Awal -> Jalur yang terbentuk = ")

For i As Integer = 0 To jalurAwal.Count - 1


Dim titik As Integer = jalurAwal(i)
Console.Write(IIf(i = 0, "", "-") & Chr(titik + 65))
Next
Console.WriteLine("")
End If
...
1
2
3
4
5
6
7
8
9
10
11
12

16
13
14
If daftarBiaya(titikSebelumnya, titikBerikutnya) <> 0 _
AndAlso (jalurAwal.Count = daftartitik.Count Or jalurAwal.Count < limit) Then

If jalurAwal.Count = daftartitik.Count Then


Console.WriteLine("Titik Awal -> Jalur sudah ditemukan")
Console.Write("Titik Awal -> Jalur yang terbentuk = ")

For i As Integer = 0 To jalurAwal.Count - 1


Dim titik As Integer = jalurAwal(i)
Console.Write(IIf(i = 0, "", "-") & Chr(titik + 65))
Next
Console.WriteLine("")
End If
...
5e4. Jika kondisi diatas tidak terpenuhi,
maka lakukan perhitungan berikut (poin 5e4a 5e4f)
Else
...
1
2
Else
...
5e4a. Lakukan perhitungan berikut apabila terdapat jalur antara titik sebelumnya dan titik
berikutnya (poin 5e4a1 5e4a3)
If daftarBiaya(titikSebelumnya, titikBerikutnya) <> 0 Then
...
1
2
If daftarBiaya(titikSebelumnya, titikBerikutnya) <> 0 Then
...
5e4a1. Catat jalur sementara yang sudah terbentuk

17
dan simpan status titik yang sudah dikunjungi

Dim calonJalurAwal(jalurAwal.Count - 1) As Integer


Dim stNormal(daftartitik.Count - 1) As Boolean
Dim st(daftartitik.Count - 1) As Boolean
For i As Integer = 0 To jalurAwal.Count - 1
Dim titik As Integer = jalurAwal(i)

calonJalurAwal(i) = titik
stNormal(titik) = True
st(titik) = True

Console.Write(IIf(i = 0, "", "-") & Chr(titik + 65))


Next
1
2
3
4
5
6
7
8
9
10
11
12
Dim calonJalurAwal(jalurAwal.Count - 1) As Integer
Dim stNormal(daftartitik.Count - 1) As Boolean
Dim st(daftartitik.Count - 1) As Boolean
For i As Integer = 0 To jalurAwal.Count - 1
Dim titik As Integer = jalurAwal(i)

18
calonJalurAwal(i) = titik
stNormal(titik) = True
st(titik) = True

Console.Write(IIf(i = 0, "", "-") & Chr(titik + 65))


Next
5e4a2. Tambahkan jalur sementara tersebut ke dalam daftar jalur awal

daftarJalurAwal.Add(calonJalurAwal)
1
daftarJalurAwal.Add(calonJalurAwal)
5e4a3. Lakukan perhitungan pada semua daftar jalur tujuan yang sudah ditemukan (poin 5e4a3a
5e4a3c)

5e4a3a. Lakukan perhitungan pada jalur antar titik dan status titik
Jika tidak terdapat jalur antar 2 titik bersebelahan, maka lanjutkan ke perhitungan jalur sementara
berikutnya
Jika status titik tujuan ternyata sudah dikunjungi, maka lanjutkan ke perhitungan jalur sementara
berikutnya

If calonJalurAwal(jalurAwal.Count - 1) = JalurTerpilih(0) Then

ElseIf daftarBiaya(calonJalurAwal(jalurAwal.Count - 1), JalurTerpilih(0)) <> 0 Then


If st(JalurTerpilih(0)) = True Then Continue For
st(JalurTerpilih(0)) = True
Else
Continue For
End If

Dim isSelesai As Boolean = False


For j As Integer = 0 To JalurTerpilih.Length - 2
If daftarBiaya(JalurTerpilih(j), JalurTerpilih(j + 1)) <> 0 Then

19
If st(JalurTerpilih(j + 1)) = True Then
isSelesai = True
Exit For
End If

st(JalurTerpilih(j + 1)) = True


End If
Next
If isSelesai Then Continue For
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
If calonJalurAwal(jalurAwal.Count - 1) = JalurTerpilih(0) Then

ElseIf daftarBiaya(calonJalurAwal(jalurAwal.Count - 1), JalurTerpilih(0)) <> 0 Then


20
If st(JalurTerpilih(0)) = True Then Continue For
st(JalurTerpilih(0)) = True
Else
Continue For
End If

Dim isSelesai As Boolean = False


For j As Integer = 0 To JalurTerpilih.Length - 2
If daftarBiaya(JalurTerpilih(j), JalurTerpilih(j + 1)) <> 0 Then
If st(JalurTerpilih(j + 1)) = True Then
isSelesai = True
Exit For
End If

st(JalurTerpilih(j + 1)) = True


End If
Next
If isSelesai Then Continue For
5e4a3b. Lakukan pengecekan apabila status semua titik bernilai true / benar

Dim isSemuaTrue As Boolean = True


For j As Integer = 0 To st.Length - 1
If st(j) <> True Then
isSemuaTrue = False
Exit For
End If
Next
1
2
3
4
5
21
6
7
Dim isSemuaTrue As Boolean = True
For j As Integer = 0 To st.Length - 1
If st(j) <> True Then
isSemuaTrue = False
Exit For
End If
Next
5e4a3c. Apabila status semua titik bernilai true / benar,
maka hentikan perhitungan karena jalur gabungan sudah ditemukan

If isSemuaTrue Then
Console.WriteLine("")
Console.WriteLine("Jalur Gabungan sudah ditemukan")
Console.Write("Jalur yang terbentuk = ")

Dim jalurGabungan As New ArrayList()

...

Return jalurGabungan
End If
1
2
3
4
5
6
7
8
9
22
10
11
If isSemuaTrue Then
Console.WriteLine("")
Console.WriteLine("Jalur Gabungan sudah ditemukan")
Console.Write("Jalur yang terbentuk = ")

Dim jalurGabungan As New ArrayList()

...

Return jalurGabungan
End If
5e4b. Kurangi kedalaman pada posisi titik terhitung untuk masing-masing sisa titik yang tidak
terhitung

For i As Integer = 0 To daftarIndukAwal.Count - 1


depthAwal(jalurAwal.Count - 1) -= 1
Next
1
2
3
For i As Integer = 0 To daftarIndukAwal.Count - 1
depthAwal(jalurAwal.Count - 1) -= 1
Next
5e4c. Dan untuk sisa titik tersebut, beri nilai kedalaman dengan angka 0

For i As Integer = jalurAwal.Count To depthAwal.Count - 1


depthAwal(i) = 0
Next
1

23
2
3
For i As Integer = jalurAwal.Count To depthAwal.Count - 1
depthAwal(i) = 0
Next
5e4d. Untuk semua titik dengan nilai kedalaman 0,
Hilangkan titik-titik tersebut dari jalur yang sedang dihitung
dan masukkan kembali titik-titik tersebut kedalam daftar titik yang sudah dihitung

While depth Awal(jalurAwal.Count - 1) <= 0


Dim titikTerakhir As Integer = jalur Awal (jalurAwal.Count - 1)

Daftar IndukAwal.Add(titik Terakhir)


Jalur Awal.Remove(titik Terakhir)
If jalur Awal.Count = 0 Then
Console.WriteLine("Titik Awal -> Jalur Tidak Ditemukan")
Console.WriteLine("")
isSemuaTitikAwalTerhitung = True
Exit While
End If

Depth Awal(jalurAwal.Count - 1) -= 1
End While
1
2
3
4
5
6
7
8
9
24
10
11
12
13
14
15
While depthAwal(jalurAwal.Count - 1) <= 0
Dim titikTerakhir As Integer = jalurAwal(jalurAwal.Count - 1)

daftarIndukAwal.Add(titikTerakhir)
jalurAwal.Remove(titikTerakhir)

If jalurAwal.Count = 0 Then
Console.WriteLine("Titik Awal -> Jalur Tidak Ditemukan")
Console.WriteLine("")
isSemuaTitikAwalTerhitung = True
Exit While
End If

depthAwal(jalurAwal.Count - 1) -= 1
End While
5e4e. Tentukan titik berikutnya dengan urutan terdekat setelah titik yang terakhir dihitung
Yaitu titik dengan selisih indeks positif terendah

Dim minSelisihPositif As Integer = Integer.MaxValue


For i As Integer = 0 To daftarIndukAwal.Count - 2
If daftarIndukAwal(i) - titikTujuan > 0 AndAlso minSelisihPositif > daftarIndukAwal(i) -
titikTujuan Then
minSelisihPositif = daftarIndukAwal(i) - titikTujuan
titikTerdekat = daftarIndukAwal(i)
idxtitikTerdekat = i
End If

25
Next
1
2
3
4
5
6
7
8
Dim minSelisihPositif As Integer = Integer.MaxValue
For i As Integer = 0 To daftarIndukAwal.Count - 2
If daftarIndukAwal(i) - titikTujuan > 0 AndAlso minSelisihPositif > daftarIndukAwal(i) -
titikTujuan Then
minSelisihPositif = daftarIndukAwal(i) - titikTujuan
titikTerdekat = daftarIndukAwal(i)
idxtitikTerdekat = i
End If
Next
5e4f. Setelah menemukan titik terdekat,
Urutkan semua titik yang belum dihitung selain titik terdekat
Kemudian masukkan titik terdekat ini pada urutan pertama sebelum urutan tersebut

daftarIndukAwal.RemoveAt(idxtitikTerdekat)
daftarIndukAwal.Sort()
daftarIndukAwal.Insert(0, titikTerdekat)
1
2
3
daftarIndukAwal.RemoveAt(idxtitikTerdekat)
daftarIndukAwal.Sort()
daftarIndukAwal.Insert(0, titikTerdekat)
5f. Lakukan perhitungan pada titik tujuan berurutan dari titik terakhir ke titik pertama

26
Metode yang digunakan adalah DFS (Depth First Search) (poin 5f1 5f4)

5f1. Masukkan titik berikutnya ke dalam jalur yang sedang dihitung


Dan hilangkan titik tersebut dari daftar titik yang sudah dihitung

jalurTujuan.Add(titikBerikutnya)
daftarIndukTujuan.RemoveAt(0)
1
2
jalurTujuan.Add(titikBerikutnya)
daftarIndukTujuan.RemoveAt(0)
5f2. Hitung kedalaman pada titik yang sedang dihitung
Apabila nilai kedalaman adalah 0, maka beri nilai awal kedalaman
Selain itu kurangkan nilai kedalamannya dengan 1

If depthTujuan(jalurTujuan.Count - 1) <= 0 Then


depthTujuan(jalurTujuan.Count - 1) = depthNormal(jalurTujuan.Count - 1)
Else
depthTujuan(jalurTujuan.Count - 1) -= 1
End If
1
2
3
4
5
If depthTujuan(jalurTujuan.Count - 1) <= 0 Then
depthTujuan(jalurTujuan.Count - 1) = depthNormal(jalurTujuan.Count - 1)
Else
depthTujuan(jalurTujuan.Count - 1) -= 1
End If
5f3. Jika terdapat jalur antara titik sebelumnya dan titik berikutnya,
27
dan semua titik sudah dihitung semua atau jumlah titik yang sedang dihitung belum melebihi
limit / batas maksimal kedalaman,
Lakukan pengecekan apakah semua titik sudah dihitung semua
Jika kondisi tersebut benar, maka hentikan perhitungan

If daftarBiaya(titikBerikutnya, titikSebelumnya) <> 0 _


AndAlso (jalurTujuan.Count = daftartitik.Count Or jalurTujuan.Count < limit) Then

If jalurTujuan.Count = daftartitik.Count Then


Console.WriteLine("Titik Tujuan -> Jalur sudah ditemukan")
Console.Write("Titik Tujuan -> Jalur yang terbentuk = ")

For i As Integer = jalurTujuan.Count - 1 To 0 Step -1


Dim titik As Integer = jalurTujuan(i)
Console.Write(IIf(i = jalurTujuan.Count - 1, "", "-") & Chr(titik + 65))
Next
Console.WriteLine("")
End If
...
1
2
3
4
5
6
7
8
9
10
11
12
13

28
14
If daftarBiaya(titikBerikutnya, titikSebelumnya) <> 0 _
AndAlso (jalurTujuan.Count = daftartitik.Count Or jalurTujuan.Count < limit) Then

If jalurTujuan.Count = daftartitik.Count Then


Console.WriteLine("Titik Tujuan -> Jalur sudah ditemukan")
Console.Write("Titik Tujuan -> Jalur yang terbentuk = ")

For i As Integer = jalurTujuan.Count - 1 To 0 Step -1


Dim titik As Integer = jalurTujuan(i)
Console.Write(IIf(i = jalurTujuan.Count - 1, "", "-") & Chr(titik + 65))
Next
Console.WriteLine("")
End If
...
5f4. Jika kondisi diatas tidak terpenuhi,
maka lakukan perhitungan berikut (poin 5f4a 5f4f)

Else
...
1
2
Else
...
5f4a. Lakukan perhitungan berikut apabila terdapat jalur antara titik sebelumnya dan titik
berikutnya (poin 5f4a1 5f4a3)

If daftarBiaya(titikBerikutnya, titikSebelumnya) <> 0 Then


...
1
2

29
If daftarBiaya(titikBerikutnya, titikSebelumnya) <> 0 Then
...
5e4a1. Catat jalur sementara yang sudah terbentuk
dan simpan status titik yang sudah dikunjungi

Dim calonJalurTujuan(jalurTujuan.Count - 1) As Integer


Dim stNormal(daftartitik.Count - 1) As Boolean
Dim st(daftartitik.Count - 1) As Boolean
For i As Integer = jalurTujuan.Count - 1 To 0 Step -1
Dim titik As Integer = jalurTujuan(i)

calonJalurTujuan(jalurTujuan.Count - 1 - i) = titik
stNormal(titik) = True
st(titik) = True

Console.Write(IIf(i = jalurTujuan.Count - 1, "", "-") & Chr(titik + 65))


Next
1
2
3
4
5
6
7
8
9
10
11
12
Dim calonJalurTujuan(jalurTujuan.Count - 1) As Integer
Dim stNormal(daftartitik.Count - 1) As Boolean
Dim st(daftartitik.Count - 1) As Boolean
30
For i As Integer = jalurTujuan.Count - 1 To 0 Step -1
Dim titik As Integer = jalurTujuan(i)

calonJalurTujuan(jalurTujuan.Count - 1 - i) = titik
stNormal(titik) = True
st(titik) = True

Console.Write(IIf(i = jalurTujuan.Count - 1, "", "-") & Chr(titik + 65))


Next
5f4a2. Tambahkan jalur sementara tersebut ke dalam daftar jalur awal

daftarJalurTujuan.Add(calonJalurTujuan)
1
daftarJalurTujuan.Add(calonJalurTujuan)
5f4a3. Lakukan perhitungan pada semua daftar jalur tujuan yang sudah ditemukan (poin 5f4a3a
5f4a3c)

5f4a3a. Lakukan perhitungan pada jalur antar titik dan status titik
Jika tidak terdapat jalur antar 2 titik bersebelahan, maka lanjutkan ke perhitungan jalur sementara
berikutnya
Jika status titik tujuan ternyata sudah dikunjungi, maka lanjutkan ke perhitungan jalur sementara
berikutnya

If JalurTerpilih(jalurTujuan.Count - 1) = calonJalurTujuan(0) Then

ElseIf daftarBiaya(JalurTerpilih(jalurTujuan.Count - 1), calonJalurTujuan(0)) <> 0 Then


If st(JalurTerpilih(jalurTujuan.Count - 1)) = True Then Continue For
st(JalurTerpilih(jalurTujuan.Count - 1)) = True
Else
Continue For
End If

31
Dim isSelesai As Boolean = False
For j As Integer = JalurTerpilih.Length - 2 To 0 Step -1
If daftarBiaya(JalurTerpilih(j), JalurTerpilih(j + 1)) <> 0 Then
If st(JalurTerpilih(j)) = True Then
isSelesai = True
Exit For
End If

st(JalurTerpilih(j)) = True
End If
Next
If isSelesai Then Continue For
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
32
If JalurTerpilih(jalurTujuan.Count - 1) = calonJalurTujuan(0) Then

ElseIf daftarBiaya(JalurTerpilih(jalurTujuan.Count - 1), calonJalurTujuan(0)) <> 0 Then


If st(JalurTerpilih(jalurTujuan.Count - 1)) = True Then Continue For
st(JalurTerpilih(jalurTujuan.Count - 1)) = True
Else
Continue For
End If

Dim isSelesai As Boolean = False


For j As Integer = JalurTerpilih.Length - 2 To 0 Step -1
If daftarBiaya(JalurTerpilih(j), JalurTerpilih(j + 1)) <> 0 Then
If st(JalurTerpilih(j)) = True Then
isSelesai = True
Exit For
End If

st(JalurTerpilih(j)) = True
End If
Next
If isSelesai Then Continue For
5f4a3b. Lakukan pengecekan apabila status semua titik bernilai true / benar

Dim isSemuaTrue As Boolean = True


For j As Integer = 0 To st.Length - 1
If st(j) <> True Then
isSemuaTrue = False
Exit For
End If
Next
1
2
33
3
4
5
6
7
Dim isSemuaTrue As Boolean = True
For j As Integer = 0 To st.Length - 1
If st(j) <> True Then
isSemuaTrue = False
Exit For
End If
Next
5f4a3c. Apabila status semua titik bernilai true / benar,
maka hentikan perhitungan karena jalur gabungan sudah ditemukan

If isSemuaTrue Then
Console.WriteLine("")
Console.WriteLine("Jalur Gabungan sudah ditemukan")
Console.Write("Jalur yang terbentuk = ")

Dim jalurGabungan As New ArrayList()

...

Return jalurGabungan
End If
1
2
3
4
5
6
34
7
8
9
10
11
If isSemuaTrue Then
Console.WriteLine("")
Console.WriteLine("Jalur Gabungan sudah ditemukan")
Console.Write("Jalur yang terbentuk = ")

Dim jalurGabungan As New ArrayList()

...

Return jalurGabungan
End If
5f4b. Kurangi kedalaman pada posisi titik terhitung untuk masing-masing sisa titik yang tidak
terhitung

For i As Integer = 0 To daftarIndukTujuan.Count - 1


depthTujuan(jalurTujuan.Count - 1) -= 1
Next
1
2
3
For i As Integer = 0 To daftarIndukTujuan.Count - 1
depthTujuan(jalurTujuan.Count - 1) -= 1
Next
5f4c. Dan untuk sisa titik tersebut, beri nilai kedalaman dengan angka 0

For i As Integer = jalurTujuan.Count To depthTujuan.Count - 1

35
depthTujuan(i) = 0
Next
1
2
3
For i As Integer = jalurTujuan.Count To depthTujuan.Count - 1
depthTujuan(i) = 0
Next
5f4d. Untuk semua titik dengan nilai kedalaman 0,
Hilangkan titik-titik tersebut dari jalur yang sedang dihitung
dan masukkan kembali titik-titik tersebut kedalam daftar titik yang sudah dihitung

While depthTujuan(jalurTujuan.Count - 1) <= 0


Dim titikTerakhir As Integer = jalurTujuan(jalurTujuan.Count - 1)

daftarIndukTujuan.Add(titikTerakhir)
jalurTujuan.Remove(titikTerakhir)

If jalurTujuan.Count = 0 Then
Console.WriteLine("Titik Tujuan -> Jalur Tidak Ditemukan")
Console.WriteLine("")
isSemuaTitikTujuanTerhitung = True
Exit While
End If

depthTujuan(jalurTujuan.Count - 1) -= 1
End While
1
2
3
4
5
36
6
7
8
9
10
11
12
13
14
15
While depthTujuan(jalurTujuan.Count - 1) <= 0
Dim titikTerakhir As Integer = jalurTujuan(jalurTujuan.Count - 1)

daftarIndukTujuan.Add(titikTerakhir)
jalurTujuan.Remove(titikTerakhir)

If jalurTujuan.Count = 0 Then
Console.WriteLine("Titik Tujuan -> Jalur Tidak Ditemukan")
Console.WriteLine("")
isSemuaTitikTujuanTerhitung = True
Exit While
End If

depthTujuan(jalurTujuan.Count - 1) -= 1
End While
5f4e. Tentukan titik berikutnya dengan urutan terdekat setelah titik yang terakhir dihitung
Yaitu titik dengan selisih indeks negatif terendah

Dim minSelisihNegatif As Integer = Integer.MinValue


For i As Integer = 0 To daftarIndukTujuan.Count - 2
If daftarIndukTujuan(i) - titikTujuan < 0 AndAlso minSelisihNegatif <
daftarIndukTujuan(i) - titikTujuan Then

37
minSelisihNegatif = daftarIndukTujuan(i) - titikTujuan
titikTerdekat = daftarIndukTujuan(i)
idxtitikTerdekat = i
End If
Next
1
2
3
4
5
6
7
8
Dim minSelisihNegatif As Integer = Integer.MinValue
For i As Integer = 0 To daftarIndukTujuan.Count - 2
If daftarIndukTujuan(i) - titikTujuan < 0 AndAlso minSelisihNegatif < daftarIndukTujuan(i) -
titikTujuan Then
minSelisihNegatif = daftarIndukTujuan(i) - titikTujuan
titikTerdekat = daftarIndukTujuan(i)
idxtitikTerdekat = i
End If
Next
5f4f. Setelah menemukan titik terdekat,
Urutkan semua titik yang belum dihitung selain titik terdekat dari titik terakhir ke titik pertama
Kemudian masukkan titik terdekat ini pada urutan pertama sebelum urutan tersebut

daftarIndukTujuan.RemoveAt(idxtitikTerdekat)
daftarIndukTujuan.Sort()
daftarIndukTujuan.Reverse()
daftarIndukTujuan.Insert(0, titikTerdekat)
1
2

38
3
4
daftarIndukTujuan.RemoveAt(idxtitikTerdekat)
daftarIndukTujuan.Sort()
daftarIndukTujuan.Reverse()
daftarIndukTujuan.Insert(0, titikTerdekat)
6. Setelah menemukan jalur, maka hitung biaya untuk jalur tersebut

Dim biaya As Double = 0


For i As Integer = 0 To jalur.Count - 2
Dim titikAwal As Integer = jalur(i)
Dim titikTujuan As Integer = jalur(i + 1)

biaya += daftarBiaya(titikAwal, titikTujuan)


Next
1
2
3
4
5
6
7
Dim biaya As Double = 0
For i As Integer = 0 To jalur.Count - 2
Dim titikAwal As Integer = jalur(i)
Dim titikTujuan As Integer = jalur(i + 1)

biaya += daftarBiaya(titikAwal, titikTujuan)


Next

39
D. Implementasi Metode ( Penerapan Metode)
Salah satu contoh yang termasuk Uninformed search yaitu bi-directional search. Dari
namanya bisa ditebak yaitu pencarian yang dilakukan secara 2 arah, yaitu dari state awal
menuju solusi(goal) dan satu lagi dari solusi (goal) ke state awal. Pencarian ini bertujuan
menemukan solusi atau jalan terbaik dimana nantinya 2 pencarian yang berlangsung simultan
ini akan bertemu di sebuah titik potong. Algoritma ini membutuhkan informasi lengkap tentang
solusi atau goal yang dituju. Kesulitan dari algoritma ini bila terjadi banyak kemungkinan
dimana cabangnya banyak sehingga proses pencarian menjadi lebih lambat Kompleksitas
= O(bd/2)

E. Kesimpulan
Secara singkat, Algoritma ini adalah penggabungan dari 3 buah algoritma yang sudah
dijelaskan sebelumnya, yaitu Algoritma BFS (Breadth First Search), Algoritma DFS (Depth
First Search), dan Algoritma DLS (Depth Limited Search). Pencarian solusi dilakukan dari
titik awal dan titik tujuan secara bersamaan, sampai akhirnya bertemu di sebuah titik tengah.
Setelah menemukan titik tengah dan hasil jalur dari masing-masing perhitungan sudah tepat,
maka jawaban sudah ditemukan

40
7. Generate-and-Test (bangkitkan dan Uji)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

41
8. Hill Climbing (Pendakian Bukit)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

42
9. Simulated Annealing (SA)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

43
10.Best-First Search (Pencarian Terbaik dahulu)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

44
11.Greedy Best-First Search
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

45
12.A* (A Bintang)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

46
13.Iterative Deepening A* (IDA*)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

47
14.Simplified Memory-Bounded A*(SMA*)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

48
15.Bi-Directional A*(BDA*)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

49
16.Modified Bi-directional A*(MBDA*)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

50
17.Dynamic Weighting A*(DWA)
A. Sejarah ( Penemu, Arti)

B. Algoritma (Flowchart)

C. Pseudo-Code

D. Implementasi Metode ( Penerapan Metode)

E. Kesimpulan

51
Pengesahan

Nama :
NIM :

(jangan lupa dikasih foto anda yang bisa dikenali )

52
Referensi

bejo. (2011, maret). Retrieved from bejo.com: http://www.bejo paijo.com

53