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

  • 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

  1. Open = {awal}, closed = {}.
  2. Selama open tak kosong, ambil dengan terkecil.
  3. Bila tujuan → berhenti, rekonstruksi lintasan via parent.
  4. Bukan tujuan → pindah ke closed, evaluasi semua successor.
  5. Tiap successor: hitung , . Bila belum di open, atau baru lebih kecil → perbarui , , parent, masukkan/perbarui di open.
  6. 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