Algoritma pencarian A* atau disebut juga A-star
search, merupakan format best-fist search yang banyak diketahui. A* search
mengevaluasi tiap node dengan cara mengkombinasikan g(n) dan h(n), dimana g(n)
merupakanCost yang dicapai sampai di n, dan h(n) adalah Estimasi cost untuk
sampai pd goal dari n. Evaluation function dari A* search bisa dituliskan
sebagai berikut :
f(n) = g(n) + h(n)
dimana f(n) merupakan Estimasi total cost dari path
n sampai goal.
Apabila kita ingin menemukan solusi termurah, suatu
hal layak untuk dicoba pertama kali adalah node dengan nilai g(n) yang paling
rendah + h(n). Hal ini menunjukkan bahwa strategi ini lebih dari sekedar layak
: dengan ketentuan bahwa heuristik function h(n) pada kondisi tertentu telah
sesuai, maka A* search optimal dan lengkap.
Optimalitas dari A* search adalah bisa dianalisis
secara langsung jika menggunakan Tree-Search. Dalam hal ini, A*
search adalah optimal jika h(n) adalah sebuah admissible heuristic, dengan
ketentuan bahwa h(n) tidak meng-overestimate cost untuk mencapai goal.
Fungsi Heuristic h(n) dikatakan konsisten jika
setiap node n dan setiap successor n’ dari n yang digenerate action a, maka
estimasi cost dari n sampai ke goal tidak lebih besar dari cost sampai step n’
+ estimasi cost n’ ke goal
h(n) <= c(n,a,n’) + h(n’)
Jika h(n) konsisten, maka nilai dari f(n) melalui
suatu path tidak berkurang/nondecreasing.
f(n’) = g(n’)+h(n’)
= g(n) +
c(n,a,n’) + h(n’)
>= g(n) +
h(n)
= f(n)
Pencarian jalur atau istilah kerennya adalah
pathfinding dalam deskripsi saya adalah proses pencarian rute/jalur (biasanya
rute terdekat) dari suatu arena yang pada umumnya memiliki
penghalang-penghalang dari arena tersebut. Adapun penghalang dapat berupa
tembok, sungai, dsb. Goal dari pathfinding ini pada umumnya adalah untuk
mencari jalur paling efisien dengan sebisa mungkin menghindari penghalang yang
ada.
Pathfinding dapat diterapkan misalnya dalam membuat
AI dari suatu game, misalnya agar AI tersebut dapat mengejar musuh secara
efisien dan tanpa menabrak tembok atau menghindari penghalang lain. Terdapat
beberapa metode yang dapat diterapkan dalam pathfinding ini, salah satu metode
yang sering digunakan adalah A*. Ok, tanpa berbelit-belit langsung saja kita
berkenalan dengan metode yang satu ini.
Langkah 1 : Arena
Berikut adalah contoh simple arena yang akan kita gunakan. Warna hijau adalah starting point, warna merah adalah goal/end point, dan biru adalah penghalang. Goal dari aplikasi ini adalah mencari rute dari titik hijau ke merah tanpa melewati penghalang biru
Berikut adalah contoh simple arena yang akan kita gunakan. Warna hijau adalah starting point, warna merah adalah goal/end point, dan biru adalah penghalang. Goal dari aplikasi ini adalah mencari rute dari titik hijau ke merah tanpa melewati penghalang biru
Langkah 2 : Movement Cost / Biaya Pergerakan
Kita asumsikan setiap langkah dari hijau adalah legal baik vertikal, horizontal, maupun diagonal dengan catatan tidak membentur tembok. Setiap langkah yang diizinkan kita berikan nilai G dimana G adalah cost atau biaya dalam setiap langkah. Dalam kasus ini kita akan berikan nilai 10 untuk setiap langkah vertikal maupun horizontal, dan 14 untuk diagonal. Nilai 14 kita dapatkan dari perhitungan pitagoras dimana 14,1421 = sqrt(sqr(10)+sqr(10)). Hasil data nilai G ini selanjutnya kita gambarkan sbb :
Kita asumsikan setiap langkah dari hijau adalah legal baik vertikal, horizontal, maupun diagonal dengan catatan tidak membentur tembok. Setiap langkah yang diizinkan kita berikan nilai G dimana G adalah cost atau biaya dalam setiap langkah. Dalam kasus ini kita akan berikan nilai 10 untuk setiap langkah vertikal maupun horizontal, dan 14 untuk diagonal. Nilai 14 kita dapatkan dari perhitungan pitagoras dimana 14,1421 = sqrt(sqr(10)+sqr(10)). Hasil data nilai G ini selanjutnya kita gambarkan sbb :
Selain dari perhitungan tersebut, kita dapat
mengalikan dengan konstanta tertentu untuk memanipulasi biaya, misal : ketika
melewati sungai maka G = G * 2.
Langkah 3 : Estimated Movement / Estimasi gerakan
Langkah selanjutnya kita hitung biaya estimasi pergerakan dan kita simbolkan dengan H. Nilai H ini secara singkat adalah nilai jarak / estimasi biaya dari pergerakan dari suatu titik terhadap titik finish dengan mengabaikan penghalang yang ada. Untuk lebih jelasnya silahkan lihat gambar di bawah :
Langkah selanjutnya kita hitung biaya estimasi pergerakan dan kita simbolkan dengan H. Nilai H ini secara singkat adalah nilai jarak / estimasi biaya dari pergerakan dari suatu titik terhadap titik finish dengan mengabaikan penghalang yang ada. Untuk lebih jelasnya silahkan lihat gambar di bawah :
Langkah 4 : Scoring / Penilaian
Setelah nilai G dan H kita dapatkan, maka kita berikan skor dari masing-masing titik yang akan dilalui. Skor kita lambangkan misalnya dengan F dimana nilai F = G + H. Nilai F selanjutnya kita masukkan dalam setiap titik dari setiap langkah yang akan dilalui. Untuk lebih jelasnya lihat gambar di bawah :
Setelah nilai G dan H kita dapatkan, maka kita berikan skor dari masing-masing titik yang akan dilalui. Skor kita lambangkan misalnya dengan F dimana nilai F = G + H. Nilai F selanjutnya kita masukkan dalam setiap titik dari setiap langkah yang akan dilalui. Untuk lebih jelasnya lihat gambar di bawah :
Dari setiap nilai tersebut kita ambil keputusan
dengan mengambil langkah dengan nilai F terkecil.
Langkah 5 : Looping / Perulangan
Setelah pergerakan pertama selesai selanjutnya lakukan perulangan dari dari langkah 1 sampai 4. Untuk lebih jelasnya setiap pergerakan akan digambarkan di bawah :
Setelah pergerakan pertama selesai selanjutnya lakukan perulangan dari dari langkah 1 sampai 4. Untuk lebih jelasnya setiap pergerakan akan digambarkan di bawah :
Pseudocode
function A*(start,goal)
closedset :=
the empty set // The set of nodes
already evaluated.
openset :=
{start} // The set of tentative nodes
to be evaluated, initially containing the start node
came_from :=
the empty map // The map of navigated
nodes.
g_score[start]
:= 0 // Cost from start along best
known path.
//
Estimated total cost from start to goal through y.
f_score[start]
:= g_score[start] + heuristic_cost_estimate(start, goal)
while
openset is not empty
current := the node in openset having the lowest f_score[] value
if
current = goal
return
reconstruct_path(came_from, goal)
remove
current from openset
add
current to closedset
for
each neighbor in neighbor_nodes(current)
if
neighbor in closedset
continue
tentative_g_score := g_score[current] + dist_between(current,neighbor)
if
neighbor not in openset or tentative_g_score < g_score[neighbor]
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := g_score[neighbor] + heuristic_cost_estimate(neighbor,
goal)
if neighbor not in openset
add neighbor to openset
return
failure
function reconstruct_path(came_from, current_node)
if current_node
in came_from
p :=
reconstruct_path(came_from, came_from[current_node])
return
(p + current_node)
else
return
current_node
Tidak ada komentar:
Posting Komentar