启发式搜索算法2 - A*算法

相关文章:
启发式搜索算法1 – 最佳优先搜索算法

A* 算法

最佳优先搜索算法的效果非常依赖估价函数,而估价函数又不是这么容易设置,那么能不能折中一下,添加其他确定性参数来平衡这个估价函数的不确定性,这就是A算法。
A
算法(A-Star)是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。它是基于使用启发式方法来实现最佳性和完整性的,它是最佳优先算法的一种变体。因为它不但具备启发式搜索特点,而且能够保证找到最佳的解决方案。许多游戏和基于Web的地图都使用此算法非常有效地找到最短路径(近似值)。

为什么这个算法这么厉害,主要是它在进行搜索时候,会计算到达相邻结点的成本函数f(n),挑选f(n)最小结点。这个成本函数公式为f(n)=g(n)+h(n),g(n)函数是从起点状态到当前状态n的实际代价,这是一个确定值,h(n)是从当前状态n到目标状态的最佳路径的估计代价,换言之f(n)函数包含了一部分确定值和一部分估计值的估价函数,也可以说是一种启发式搜索算法。为了保证找到最短路径(最优解),关键在于估价函数f(n)的选取(或者说h(n)的选取),也可以说是g(n)和h(n)值的比重分配。以d(n)表达状态n到目标状态的实际距离,那么h(n)的选取大致有如下三种情况:

(1)如果h(n)<d(n)到目标状态的实际距离,或者说h(n)的比重过小,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。在极端情况下,h(n)值过小可以忽略,f(n)约等于g(n),算法变回了盲目搜索。
(2)理想状态是h(n)=d(n),即距离估计h(n)等于实际最短距离,那么搜索效率是最高的。
(3)如果h(n)>d(n),或者说h(n)的比重过大,这种情况下搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。在极端情况下,h(n)值过大,使得f(n)约等于h(n),算法变回了最佳优先算法。
举一个例子,参照上一个的例子,这次是一个有权有向图,【D-E】边值变成5,如图所示。

在这里插入图片描述
尝试用A*算法在图结构上的直接实现。为了简单起见,所有结点的启发式函数h(n)均定义为1,分析过程如下表所示。
在这里插入图片描述
每次挑选结点,都是在开放列表中选择f(n)最小值的结点,直到找到目标路径。从表中看到,f(F)的值经过一次修改,在选择【E】结点的时候,因为g(f)值减少了,f(F)也就比原来的值小,因此更新了【F】结点的f(n)值,以下是用代码来表示此算法运算。

class Graph(object):
    def __init__(self, graph):
        self.graph = graph 
    def get_neighbors(self, v):
        return self.graph[v]
    def h(self, n):
        # 估价函数,我们简化了这个函数,假设每个结点的距离为1
        H = {
   
           
  • 31
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值