前置知识

定义1,g(n)=从树根到节点n的代价。当算法处理到某个节点时,g(n)是可以精确计算的。

定义2,h*(n)=从节点n到目标节点的优化路径的代价。一般不可知。

定义3,f*(n)=g(n) + h*(n)是包含节点n的路径的最小代价。一般不可知。

定义4,h(n)=从节点n到目标节点的优化路径的估计代价。

定义5,f(n)=g(n) + h(n)是包含节点n的路径的估计最小代价。

假设,对于任意的节点n而言,已知h*(n),可以构建出一个算法直接找到最优解,即处理每一次选择时,都选择f*(n)代价最小的节点。但是,对于任意一个算法而言,h*(n)不可知,我们只能够估计h*(n)的值,这也是爬山法和Best-Frist算法中评价函数或启发式函数的作用。

算法本质

A*算法保证所估计h*(n)的值h(n)满足:h(n) ≤ h*(n)。

一旦满足这个条件,当使用使用Best-first策略搜索时,如果该方法选中的节点是目标节点,那么该节点表示的解就是当前问题的最优解。

定理1,使用Best-first策略搜索,且满足h(n) ≤ h*(n),如果算法选择的节点是目标节点, 则该节点表示的解是优化解。

       证明1:只需要证明,f*(t)是最优解代价即可,n为此时可以进行扩展的所有节点,即f*(t){f*(n)}中的最小值

  • 由于节点t是目标节点,所以h*(t) = h(t) = 0,f(t) = f*(t) = g(t)。
  • 假设:{f*(n)}中的最小值为M,M∈{f*(n)}。
  • 由于 f*(t)∈{f*(n)},故而,f(t) ≥ M。
  • 由于此时算法选择的节点是节点t,即在当前可以扩展的节点中,t是估计总代价最小的那一个,故而 f(t) ≤ f(n) ,而对于所有当前可以扩展的节点n而言,由于h(n) ≤ h*(n),所以 f(n) ≤ f*(n),而{f*(n)}中的最小值为M,f(t) ≤ M。
  • 由 f(t) ≥ M 以及 f(t) ≤ M 可知,f(t) = M。

算法拓展

可以将A*算法的h(n)作两种极端情况的考虑。

  • 对于任意的节点n,h(n) = 0,此时算法退化,每一次进行选择时,选择当前g(n)最小也就是当前路径长度最小的点。
  • 对于任意的节点n,h*(n) = 0,正如本文之前提到的,直接可以选择得到,不会走其他路径。

由此,可以明确的是,尽量使得h(n)接近h*(n),越接近,算法越佳。

例子说明








最新文章

  1. 一个开关电源传导、辐射处理案例-----Layout环路
  2. IOS开发-UIScrollView陷阱之----删除所有子view, 滚动条(indicator) 消失
  3. long和BigDecimal引发的管理思考
  4. [充电][库]Zlib文件压缩和解压
  5. ABAP-SQL基础知识
  6. ASP.NET Web API的安全管道
  7. MyBatis知多少(14)分散的数据库系统
  8. USACO section1.2 Miking cows
  9. WCF与ASMX Web服务差异比较[译]
  10. Restrict each user to a single session in window server 2008 R2 or 2012
  11. vijos 1379 字符串的展开
  12. Linq中小心使用IndexOf
  13. Linux软件
  14. HDU 2852 KiKi's K-Number
  15. 迟来SQLHelper
  16. Github+Hexo搭建静态博客
  17. 微信小程序实战(商城)
  18. ubuntu设置网络
  19. eclipse properties 插件
  20. CentOS7.6最小化纯净版安装xfce桌面

热门文章

  1. 全世界最强的算法平台codeforces究竟有什么魅力?
  2. Leetcode-数组&链表
  3. 在sqlserver中创建表
  4. JVM系列【4】内存模型
  5. 怎么快速从产品助理/初级 PM 成长为高级 PM?
  6. 解决vue、js 下载图片浏览器默认预览而不是下载
  7. Chrome浏览器调试移动端网页,测试人员也可以轻松debug
  8. 数据结构&算法的引言&时间复杂度
  9. Logstash 国内加速下载 转
  10. spring boot:使用log4j2做异步日志打印(spring boot 2.3.1)