bidirectional search (tsz. bidirectional searches)
A kétirányú keresés különlegessége, hogy egyszerre két irányból indul el a keresés:
Az algoritmus akkor fejeződik be, amikor a két irányból induló keresés találkozik, vagyis az egyik irányban megtalált csúcsot a másik irányban is elértük. Ekkor a teljes út rekonstruálható.
A kétirányú keresés legnagyobb előnye a keresési tér drasztikus csökkentése.
Vegyünk egy példát: ha egy gráfban a csúcsok száma , és a keresés kiterjedése (search depth) , akkor egy sima BFS (Breadth-First Search) O(b^d) idő- és memóriaigényű, ahol az ágak száma (branching factor).
Viszont kétirányú keresés esetén mindkét irányban csak mélységig kell keresni:
Ez különösen nagy méretű gráfokban látványos:
A kétirányú keresés alapesetben BFS-t alkalmaz mindkét irányban:
def bidirectional_search(graph, start, goal):
from collections import deque
# frontier = queue of nodes to visit
forward_frontier = deque()
backward_frontier = deque()
# visited sets to record explored nodes
visited_forward = {start: None}
visited_backward = {goal: None}
while forward_frontier and backward_frontier:
# Expand forward
current_forward = forward_frontier.popleft()
for neighbor in graph:
if neighbor not in visited_forward:
visited_forward = current_forward
forward_frontier.append(neighbor)
if neighbor in visited_backward:
return reconstruct_path(visited_forward, visited_backward, neighbor)
# Expand backward
current_backward = backward_frontier.popleft()
for neighbor in graph:
if neighbor not in visited_backward:
visited_backward = current_backward
backward_frontier.append(neighbor)
if neighbor in visited_forward:
return reconstruct_path(visited_forward, visited_backward, neighbor)
return None # No path found
def reconstruct_path(visited_forward, visited_backward, meeting_point):
# Reconstruct path from start to goal
path =
node = meeting_point
while node is not None:
path.append(node)
node = visited_forward
path.reverse()
node = visited_backward
while node is not None:
path.append(node)
node = visited_backward
return path
A kétirányú keresés számos területen hasznos:
A fenti algoritmus alap BFS volt.
Lehet heurisztikus verziókat is készíteni:
→ Ez még hatékonyabbá teszi a keresést.
Előny | Hátrány |
---|---|
Sokkal kevesebb állapotot vizsgál | Nem minden probléma alkalmas rá |
Nagy gráfokban gyors | Célállapotot is ismerni kell |
Egyszerű implementáció BFS alapokon | Hátrafelé keresés nem mindig könnyű |
A kétirányú keresés hatékony útkereső algoritmus, ami két irányból (start és goal) egyszerre keres, így a keresési tér méretét jelentősen csökkenti. Elsősorban gráfokban, útvonaltervezésre és AI feladatokban használják. Hátránya, hogy célállapot ismerete szükséges, és nem minden gráfnál alkalmazható egyszerűen.