专栏文章

A* 算法

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miphlzph
此快照首次捕获于
2025/12/03 12:08
3 个月前
此快照最后确认于
2025/12/03 12:08
3 个月前
查看原文

AA* 算法是一种剪枝的BFS算法(它适用于只要没有负权回路的题中,且一定要保证有解)

AA*与一般的BFSBFS算法不同之处在于它用到了优先队列。

同时AA*算法用优先队列记录了,从起点到当前点的真是距离 + 从当前点到终点的估计距离、

它的基本模板是:

CPP
while(!q.empty())
{
  t < -- 取出优先队列队头(小根堆)
  当终点第一次出队时,break;
  for  t的所有临边
    将临边入队
}

接下来要证明给算法的正确性:

设当前状态为statestate

d(state)d(state) 表示由起点到statestate的真实距离,g(state)g(state) 表示从statestate到终点的真实距离, f(state)f(state) 表示从statestate到终点的估计距离。 要想A算法A*算法一定正确 -- >
0<=f(state)<=g(state)(如果不大于等于0,可能在没有找到最优解时终点就被弹出)0 <= f(state) <= g(state) (如果不大于等于0,可能在没有找到最优解时终点就被弹出)
(越接近的话剪掉的状态越多)

那为什么满足这个条件下是对的呢?

反证法:

假设终点第一次出队时,不是最小值 -- >
dist>d最优解(1dist > d最优解 (1)
由于一定有解,所以队列中一定存在一个点在最优路径上(最坏情况下是起点) 设这个点为uu,所以
d(u)+f(u)<=d(u)+g(u)==d最优(2d(u) + f(u) <= d(u) + g(u) == d最优 (2)
所以由(1)和 (2)得:
dist>d最小>=d(u)+f(u)dist > d最小 >= d(u) + f(u)
因为
dist优先出队dist 优先出队
所以 -- > 该假设不成立

完美收(汁)

评论

0 条评论,欢迎与作者交流。

正在加载评论...