专栏文章

A*学习笔记

算法·理论参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@minjce0b
此快照首次捕获于
2025/12/02 03:21
3 个月前
此快照最后确认于
2025/12/02 03:21
3 个月前
查看原文
发现尼姑上没有太多 A* 学习笔记,来一发。

算法简介

A* 又称启发式搜索,能够解决带权有向图上的最短路问题。具体的,给出起点 ss 和终点 tt,它能在不劣于(不是一定优于)优先队列 bfs(即 Dijkstra)的时间内求出从起点到终点的最短路。
我们先来思考,为什么 Dijkstra 会在有些情况下慢呢?因为它的优先队列只保证了 ss 到队头点的距离最短,但如果队头到 tt 的最短路不是最优解,而队尾点到 tt 是最优解,那么就会花费大量时间使用优先队列前面的点松弛,松弛出来的也不是最优解。A* 就解决了这个问题,它保证了在优先队列中靠前的点 uussuu 再到 tt 的路径一定是比较优的。
具体的,对于每个点 xx 都有两个属性 g(x),h(x)g(x),h(x),其中 g(x)g(x) 为起点到当前节点的最短路(由前驱点松弛得到),h(x)h(x)xx 的预估价值,在最短路问题中就是预估的 xxtt 的最短路。定义 xx 点的价值 f(x)=g(x)+h(x)f(x)=g(x)+h(x),优先队列中的节点按价值 ff 排序。
可以发现,当 h(x)=0h(x)=0 时,一个点的价值就相当于起点到当前点的最短路,这时算法就退化为了 Dijkstra。这启示我们,恰当的 hh 函数值可以让 A* 算法的复杂度降低。需要特别注意的是,hh 预估的值必须是最乐观的估计,即只能估少不能估多。具体证明可以看这篇文章。sto
稍微总结一下,Dijkstra 只是保证了 ss 到队头 uu 最优,而 A* 虽然没有保证它,但它保证了 ssuu 再到 tt 是最优的。

例题

A* 算法最重要的就是 hh 函数的设计。

走迷宫

题目

给出一个 n×mn \times m 的迷宫,每单位时间内可以从一个点向四个方向走一步求从 (1,1)(1,1)(n,m)(n,m) 最少需要多少单位时间。

解析

显然 dfs 和 bfs 可做。这里给出 A* 做法。
显然 f(x,y)f(x,y) 可以

踩蛋

Warning
不知道大家发现了没有,想要用 A* 求最短路前,为了得到每个点的 hh 函数,必须知道当前点到终点 tt 的最短路,需要建反图跑 Dijkstra。这样就不如我们直接跑一遍 Dijkstra 了。

评论

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

正在加载评论...