A* Algorithm
Introduction To The A* Algorithm
广度优先搜索-Breadth First Search
层次遍历
flood fill.
- 起点入队;
- 队列中取出一个节点,标记为已访问,并遍历其相邻节点,将未访问的节点入队;
- 队列是否为空 ? end : step2.
遍历过程中添加记录“父节点”的操作,便于由终点回溯出最短路径。
Early exit
早退
if current_node == goal:
break
Movement costs
Steps
or Distance
.
考虑到不同的移动成本开销(图上边权重不同),BFS就不适用于计算最短路径。
Dijkstra算法
计算单源最短路径。
Dijkstra(Graph, start, goal):
priority queue Q
Init...
# distances[i]=∞
# distances[start]=0
# visited[i]=False
# predecessors[i]=i
# Q.enqueue(start)
while Q is not empty:
u <-- min(distances[u]) and visited[u] = False
Q.dequeue(u)
visited[u] = True;
for neighbor in neighbors[u]:
new_distance = distances[u] + weight(u, v)
if visited[v]==False and new_distance < distances[v]:
distances[v] = new_distance
predecessors[v] = u
Q.enqueue(v)
启发式搜索-Heuristic Search
定义一个启发函数,返回与目标点的曼哈顿距离。
def heuristic(a, b):
# Manhattan distance on a square grid
return abs(a.x - b.x) + abs(a.y - b.y)
对比发现,速度大大提升!
A*算法
将dijkstra算法与Heuristic search相结合,融会贯通。
F(n) = G(n) + H(n)
G(n)
:从起始节点到节点n的实际开销(movement cost)H(n)
:启发式函数,表示从节点n到目标节点的估计最小代价F(n)
:总开销
看吧,这就是既要,又要,全都要!