Pencarian A-Star
Ringkasan
Ruang keadaan besar bikin blind search (BFS/DFS) boros karena telusuri hampir semua simpul. A* gabung jaminan optimal Dijkstra/UCS (biaya nyata) + efisiensi Greedy (arahan heuristik). Fungsi evaluasi ; tiap iterasi ekspansi terkecil di open list. Heuristik admissible (tak overestimate) jamin optimal, simpul dieksplorasi lebih sedikit. Tugas: hitung manual + verifikasi Python.
Konsep Kunci
1. Blind vs heuristic search
- Blind (BFS/DFS): tanpa info kedekatan ke tujuan; telusuri buta, mahal di state space besar.
- Heuristic: pakai = estimasi biaya/jarak simpul ke tujuan; dahulukan simpul menjanjikan. Contoh : jarak garis lurus (Euclidean) ke tujuan.
2. Fungsi evaluasi A*
biaya nyata awal → ; estimasi → tujuan; estimasi total lintasan terbaik lewat , penentu ekspansi. UCS/Dijkstra = kasus khusus ; Greedy = kasus khusus .
3. Admissible
admissible bila tak pernah overestimate biaya sebenarnya ke tujuan (). Jarak garis lurus admissible untuk rute jalan. Admissible → A* optimal.
4. Langkah open/closed list
- Open = {awal}, closed = {}.
- Selama open tak kosong, ambil dengan terkecil.
- Bila tujuan → berhenti, rekonstruksi lintasan via parent.
- Bukan tujuan → pindah ke closed, evaluasi semua successor.
- Tiap successor: hitung , . Bila belum di open, atau baru lebih kecil → perbarui , , parent, masukkan/perbarui di open.
- Ulangi sampai tujuan ketemu atau open kosong (tak ada solusi).
Contoh (dengan perhitungan)
SF ke Boston pakai A*
Graf penerbangan sama seperti Dijkstra + garis lurus ke Boston (admissible). A* evaluasi tiap simpul dikunjungi, selalu ekspansi terkecil. Hasil rute + total sama seperti Dijkstra: SF – Chicago – Boston = 2715, tapi simpul dieksplorasi lebih sedikit karena arahkan pencarian ke timur.
Mini-hitungan
Simpul X: , → . Simpul Y: , → . Ekspansi Y dulu ().
Verifikasi Python (tugas)
import heapq
graph = {
'SF': [('LA', 349), ('Chicago', 1855)],
'LA': [('Denver', 834)],
'Denver': [('Chicago', 908)],
'Chicago': [('Atlanta', 606), ('Boston', 860)],
'Atlanta': [('Boston', 1000)],
}
h = {'SF': 2700, 'LA': 2500, 'Denver': 1800, 'Chicago': 860, 'Atlanta': 700, 'Boston': 0}
def astar(start, goal):
open = [(h[start], 0, start, [start])]
best = {}
while open:
f, g, n, path = heapq.heappop(open)
if n == goal:
return path, g
if best.get(n, float('inf')) <= g:
continue
best[n] = g
for m, w in graph.get(n, []):
heapq.heappush(open, (g + w + h[m], g + w, m, path + [m]))
print(astar('SF', 'Boston')) # (['SF', 'Chicago', 'Boston'], 2715)Cocokkan output (2715) dengan hitungan manual tiap iterasi . Syarat tugas: graf berbobot sendiri + admissible, hitung manual tiap iterasi, implementasi Python, kumpul via LMS.
Keterkaitan
- Prasyarat: Representasi Pengetahuan, Graf dan Dijkstra
- Lanjutan: Pencarian Blind dan Heuristic