best-first search (tsz. best-first searches)
A Best-First Search (BFS) egy heurisztikus gráfkereső algoritmus, amely minden lépésben az éppen legígéretesebb csomópontot vizsgálja tovább. A döntés alapja egy heurisztikus érték – az algoritmus mindig azt a csomópontot bővíti, amelyről a leginkább valószínű, hogy elvezet a célhoz.
Ez a stratégia egy általános keretrendszer, amely olyan ismert algoritmusokat is magába foglal, mint:
A keresés során a csomópontokhoz hozzárendelünk egy értéket (f(n)), amely megmondja, hogy mennyire „jó” az adott állapot a célhoz vezető úton.
Az algoritmus mindig azt a csomópontot választja ki, amelynek a legalacsonyabb f(n) értéke van.
Tulajdonság | Best-First Search |
---|---|
Stratégia | Heurisztikus |
Adatszerkezet | Prioritási sor (pl. min-heap) |
Visszalépés | Nem garantált (nem mindig teljes) |
Optimalitás | Nem garantált, hacsak nem A*-ként használjuk |
Heurisztika | A célhoz való távolság becslése |
Itt:
A h(n) érték a célhoz való becsült távolság. Ez gyors, de nem optimális (mert nem veszi figyelembe az eddigi út költségét).
Az A* algoritmus is a Best-First Search egyik esete:
Az A* garantáltan optimális és teljes, ha a optimista (admissible).
Képzeljük el, hogy az alábbi gráfból akarunk eljutni A-ból G-be.
A / \ B C | | D E \ / F | G
Heurisztikus értékek (h):
Csúcs | h(n) |
---|---|
A | 6 |
B | 5 |
C | 4 |
D | 3 |
E | 2 |
F | 1 |
G | 0 |
Greedy BFS útvonala: A → C → E → F → G
open_list = PriorityQueue()
open_list.put(start_node, f(start_node))
closed_list = set()
while not open_list.empty():
current = open_list.get()
if current == goal:
return reconstruct_path(current)
closed_list.add(current)
for neighbor in successors(current):
if neighbor in closed_list:
continue
open_list.put(neighbor, f(neighbor))
A Best-First Search egy heurisztika-alapú kereső algoritmus, amely mindig azt a csomópontot vizsgálja, amelyről a legígéretesebbnek tűnik, hogy elvezet a célhoz. Egyszerű, gyors, de nem mindig ad optimális megoldást – kivéve, ha A*-ként használjuk.