[AI]A*算法

本文深入解析A*算法原理,通过罗马尼亚地图实例展示其寻找最优路径的过程。讨论了保证算法最优性的两个条件:可采纳启发式与一致性启发式,并介绍了A*的性能特点。此外,还探讨了IDA*、RBFS和SMA*等A*变种,阐述它们的优化策略和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、A*算法原理

相比贪婪最优搜索的 f ( n ) = h ( n ) f(n)=h(n) f(n)=h(n)注重当前节点到目标节点的距离h(n),A*算法还注重当前节点到初始节点的距离g(n),用公式表示为:
f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)
这公式看着可太枯燥了,用个简单图的表达就是:

在这里插入图片描述
A*算法每次扩展f(n)最小的节点。

二、做个例题吧~

著名的Romania地图,以Bucharest为目标,Arad为起点:
在这里插入图片描述
在这里插入图片描述

  • 初始状态, 366表示点Arad到目标Bucharest的距离,0表示Arad到初始节点Arad它本身的距离:
    在这里插入图片描述
  • 然后扩展Arad,接着判断Sibiu, Timisoara和Zerind的 f(n),发现 f(Sibiu)最小,其中g(Sibiu)=140表示 Arad到Sibiu的距离,h(Sibiu)=253表示Sibiu到目标Bucharest的距离:

在这里插入图片描述

  • 扩展Sibiu,然后继续判断 f(Rimnica Vakea) 最小:
    在这里插入图片描述
  • 继续遵循 f(n)最小的原则去扩展节点。此时,f(Petisti) = 417不是最小了!因为之前的 f(Fagaras) = 415最小!这时候就要返回来扩展 Fagaras 节点:

在这里插入图片描述

  • 回来扩展 Fagaras,此时我们已经找到了目标节点 Bucharest,但是!此时的 f(Bucharest)=450,当前最小的 f 是 f(Pitesti) = 417,那就再回来扩展 Pitesti节点:
    在这里插入图片描述
  • 最后找到 f(Bucharest) = 418,则为最终最优解:
    在这里插入图片描述
    这时候,找到的解也是最优的!

三、A*算法的最优性

保证最优性的两个条件:

  • 可采纳启发式 Admissible Heuristic
  • 一致性启发式 Consistent Heuristic
1.可采纳启发式 Admissible Heuristic

这个是说,可采纳启发式不会高估到达目标的距离,f(n)永远不会超过实际解的距离。

我个人觉得,就是说,A*每次找的路径,都不超过实际到达解的距离,因为他每次找的 f(n)都是最小的,所以他每次找的路径都是近路,他不会绕远路去找解。

2.一致性启发式 Consistent Heuristic

是说,对于节点 n 和通过任一行动 a 生成的每个 n 的后继节点 n’,从节点 n 到达目标的代价都不大于从 n 到 n’ 的单步代价与从 n’ 到达目标的代价之和,公式为:
h ( n ) ≤ c ( n , a , n ′ ) + h ( n ′ ) h(n) \le c(n,a,n')+h(n') h(n)c(n,a,n)+h(n)

说人话就是,,,,懒得写了,直接看知乎大佬的解释吧:
在这里插入图片描述

四、A*算法的性能

A*算法可以找到最优解,其他的,,看下图吧:
在这里插入图片描述

五、IDA算法 Iterative-Deepening A

A*算法的一个缺点在于,他需要存储所有处在候选区域的节点信息,这些信息是呈指数级增长的,这会极大的占用内存。

如果你对迭代深度有所疑问,请移步迭代深度搜索 Iterative Deepening Search

IDA是指,采用迭代深度A算法,即设置一个限制,每次限制迭代增大, IDA*所用的截断值是 f(g+h).每次迭代,截断值取上一次迭代截断值得节点中最小的 f 代价值。
IDA*的一些点

六、递归最佳优先搜索 RBFS

原理和贪婪最佳优先搜索差不多,只不过用的是线性存储空间。
在这里插入图片描述

下图是一些详细信息,太长了,我实在不想打字了55555:
在这里插入图片描述

七、SMA*

我先简单贴点图,等我有时间了再回来更。。。

1. SMA*原理

在这里插入图片描述
在这里插入图片描述

2.SMA*算法性能

在这里插入图片描述

3.SMA*算法的使用

在这里插入图片描述

各位看官老爷,一键三连再走吧~再不济点个赞也行啊~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值