专栏文章
A* 算法
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miphlzph
- 此快照首次捕获于
- 2025/12/03 12:08 3 个月前
- 此快照最后确认于
- 2025/12/03 12:08 3 个月前
算法是一种剪枝的BFS算法(它适用于只要没有负权回路的题中,且一定要保证有解)
与一般的算法不同之处在于它用到了优先队列。
同时算法用优先队列记录了,从起点到当前点的真是距离 + 从当前点到终点的估计距离、
它的基本模板是:
CPPwhile(!q.empty())
{
t < -- 取出优先队列队头(小根堆)
当终点第一次出队时,break;
for t的所有临边
将临边入队
}
接下来要证明给算法的正确性:
设当前状态为
则 表示由起点到的真实距离, 表示从到终点的真实距离, 表示从到终点的估计距离。
要想一定正确 -- >
(越接近的话剪掉的状态越多)
那为什么满足这个条件下是对的呢?
反证法:
假设终点第一次出队时,不是最小值 -- >
由于一定有解,所以队列中一定存在一个点在最优路径上(最坏情况下是起点)
设这个点为,所以
所以由(1)和 (2)得:
因为
所以 -- > 该假设不成立
完美收(汁)
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...