A算法的一些理解

  这是一篇读书笔记,论文见http://files.cnblogs.com/crbtmac/Astar%E5%AF%BB%E8%B7%AF%E5%88%9D%E6%8E%A2.pdf

  所谓众里寻她千百度讲的就是启发式搜索吧- -!

  做ACM题目的时候,发现很少题目涉及到启发式搜索,也就是所谓的A算法。这学期开始学人工智能,于是对A算法也就有了更深入的了解。

  A算法就是在普通的宽搜或者深搜的基础上,建立一个函数,这个函数能在搜索的过程中能带来一些启发式的信息,从而更快的找到目标解。一般这个函数是这样表示的:f(n) = g(n) + h(n), g(n)表示起始状态到当前状态n实际耗费的代价,而h(n)则是一个估计出来的值,估计的是当前状态n到目标状态的代价,通常,起始状态和目标状态是已知的。

A算法可以很快的找到目标解,但却不总是最优的,为啥呢?为了证明,我们假设h'(n)表示n到达目标状态的实际代价。一个比较容易想到的情况是,状态u, v可以到达目标状态end,于是便有:

1)f(u) = g(u) + h(u)

2)f(v) = g(v) + h(v)

假设u比v能更优的到达目标状态,但是如果出现h(u)远远大于h'(u)的时候,非常有可能搜出来的是v比u先达到目标状态。于是A算法无法保证一定能找到最优解,但在很多寻路策略用的最多的还是A算法,因为他很快,而且很多情况下我们并不要求一定要最优解。
  如果h(n)总能满足h(n) <= h'(n),那么A算法就肯定能找到最优解,此时A算法变成了另外一个名字叫做Astar(A*)。如果你非常熟悉求最短路的Dijkstra算法,没错,Dijk就是一个h(n) = 0的Astar算法。为啥Astar总能找到最优解呢?我们可以借鉴Dijk算法的证明方法。简单的证明如下:

  搜索的过程中我们总要维护一个f(n)的序列F,然后每次取出最小的f(n)进行扩展,当取出的是目标状态时,最优解便找到。end表示目标状态,显然h(end) = 0,于是f(end)就是起始状态到目标状态的实际代价,那为啥会是最优?可以看到,此时F里面所有的f(n)严格小于或等于f(end),而且又有h(n) <= h'(n),所以F里面的状态是不可能更新end从而使得f(end)出现更优值。

(PS:教科书上的证明说了一大堆,不过我没怎么看懂- -)

转载于:https://www.cnblogs.com/crbtmac/archive/2011/03/26/1996044.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值