Dalam dunia komputasi, pencarian jalur adalah salah satu masalah fundamental yang sering dihadapi. Entah itu dalam navigasi robot, permainan video, perencanaan rute, atau bahkan dalam pengolahan data, kebutuhan untuk menemukan lintasan terpendek dari satu titik ke titik lain sangatlah krusial. Salah satu algoritma yang paling populer dan efektif untuk tugas ini adalah Algoritma A* Search (dibaca A-star).
Algoritma A* Search merupakan pengembangan dari algoritma pencarian graf yang lebih sederhana seperti Dijkstra's Algorithm dan Breadth-First Search (BFS). Keunggulan utamanya terletak pada kemampuannya untuk memprioritaskan pencarian ke arah tujuan, menjadikannya lebih efisien dalam menemukan solusi optimal dibandingkan metode lain yang hanya mencari secara acak atau berurutan.
Inti dari Algoritma A* Search adalah penggunaan sebuah fungsi evaluasi, yaitu f(n), yang mendefinisikan prioritas sebuah node (titik) dalam graf. Fungsi ini menggabungkan dua komponen penting:
Jadi, fungsi keseluruhannya adalah:
f(n) = g(n) + h(n)Algoritma A* Search bekerja dengan cara menjaga dua daftar node: Open List (node yang perlu dievaluasi) dan Closed List (node yang sudah dievaluasi). Algoritma akan terus mengeluarkan node dengan nilai f(n) terendah dari Open List, menambahkannya ke Closed List, dan mengevaluasi tetangganya. Jika tetangga belum ada di Open atau Closed List, atau jika jalur baru ke tetangga tersebut lebih baik, maka tetangga akan ditambahkan atau diperbarui di Open List.
Agar Algoritma A* Search dapat menemukan jalur terpendek yang optimal, fungsi heuristik h(n) harus memenuhi sifat admissibility. Artinya, perkiraan biaya h(n) tidak boleh lebih besar dari biaya sebenarnya ke tujuan. Contoh heuristik yang umum digunakan adalah:
Selain itu, heuristik juga bisa bersifat consistent (atau monotonic), yang berarti bahwa biaya dari node A ke node B ditambah perkiraan biaya dari B ke tujuan tidak boleh lebih kecil dari perkiraan biaya dari A ke tujuan. Heuristik yang konsisten menjamin bahwa ketika sebuah node dikeluarkan dari Open List, jalur terpendek ke node tersebut telah ditemukan.
Meskipun kode implementasi lengkap bisa cukup panjang, konsep dasarnya dapat direpresentasikan sebagai berikut:
function aStar(startNode, goalNode):
openSet = new PriorityQueue() // Menggunakan priority queue berdasarkan f(n)
cameFrom = new Map() // Menyimpan jalur
gScore = new Map() // Biaya dari start ke node
fScore = new Map() // f(n) = g(n) + h(n)
// Inisialisasi
gScore.set(startNode, 0)
fScore.set(startNode, heuristic(startNode, goalNode))
openSet.add(startNode, fScore.get(startNode))
while not openSet.isEmpty():
currentNode = openSet.poll() // Node dengan f(n) terendah
if currentNode is goalNode:
return reconstructPath(cameFrom, currentNode) // Jalur ditemukan!
for neighbor in neighbors(currentNode):
tentative_gScore = gScore.get(currentNode) + distance(currentNode, neighbor)
if tentative_gScore < gScore.get(neighbor) or not gScore.has(neighbor):
// Jalur ini lebih baik atau tetangga belum pernah dikunjungi
cameFrom.set(neighbor, currentNode)
gScore.set(neighbor, tentative_gScore)
fScore.set(neighbor, tentative_gScore + heuristic(neighbor, goalNode))
if not openSet.contains(neighbor):
openSet.add(neighbor, fScore.get(neighbor))
else:
// Perbarui prioritas jika sudah ada di openSet
openSet.update(neighbor, fScore.get(neighbor))
return null // Tidak ada jalur yang ditemukan
function reconstructPath(cameFrom, currentNode):
totalPath = [currentNode]
while cameFrom.has(currentNode):
currentNode = cameFrom.get(currentNode)
totalPath.add(currentNode)
return totalPath.reverse()
function heuristic(nodeA, nodeB):
// Implementasi fungsi heuristik, contoh: Manhattan Distance
return abs(nodeA.x - nodeB.x) + abs(nodeA.y - nodeB.y)
Keunggulan utama A* Search adalah:
Namun, ada juga keterbatasan:
Secara keseluruhan, Algoritma A* Search adalah alat yang sangat ampuh dalam pencarian jalur. Dengan pemahaman yang baik tentang cara kerjanya dan pemilihan heuristik yang tepat, algoritma ini dapat diandalkan untuk menyelesaikan berbagai tantangan komputasi secara efisien.