A* 算法
lzs18637466689 · · 个人记录
A* 算法是一种剪枝的BFS算法(它适用于只要没有负权回路的题中,且一定要保证有解)
A* 与一般的BFS 算法不同之处在于它用到了优先队列。
同时A* 算法用优先队列记录了,从起点到当前点的真是距离 + 从当前点到终点的估计距离、
它的基本模板是:
while(!q.empty())
{
t < -- 取出优先队列队头(小根堆)
当终点第一次出队时,break;
for t的所有临边
将临边入队
}
接下来要证明给算法的正确性:
设当前状态为state
则
(越接近的话剪掉的状态越多)
那为什么满足这个条件下是对的呢?
反证法:
假设终点第一次出队时,不是最小值 -- >
由于一定有解,所以队列中一定存在一个点在最优路径上(最坏情况下是起点)
设这个点为
所以由(1)和 (2)得:
因为
所以 -- > 该假设不成立