前置知识

定义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),越接近,算法越佳。

例子说明








A*算法的有关知识--例子:最短路径问题的更多相关文章

  1. 机器学习算法的基本知识(使用Python和R代码)

    本篇文章是原文的译文,然后自己对其中做了一些修改和添加内容(随机森林和降维算法).文章简洁地介绍了机器学习的主要算法和一些伪代码,对于初学者有很大帮助,是一篇不错的总结文章,后期可以通过文中提到的算法 ...

  2. (二)区块链的共识算法:PoS 及其 例子 代码 实现

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  3. Flyod 算法(两两之间的最短路径)

    Flyod 算法(两两之间的最短路径)动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j), #include <iostream> #include <v ...

  4. 一个基于RSA算法的Java数字签名例子

    原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性 ...

  5. Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)

    Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  6. C#算法设计之知识储备

    前言 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/669 访问. 算法的讨论具有一定的规则,其中也包含一些不成文的约定 ...

  7. 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议

    node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...

  8. 【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码

    一.熵编码概念: 熵越大越混乱 信息学中的熵: 用于度量消息的平均信息量,和信息的不确定性 越是随机的.前后不相关的信息,其熵越高 信源编码定理: 说明了香农熵越信源符号概率之间的关系 信息的熵为信源 ...

  9. 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)

    哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...

随机推荐

  1. AI小白必读:深度学习、迁移学习、强化学习别再傻傻分不清

    摘要:诸多关于人工智能的流行词汇萦绕在我们耳边,比如深度学习 (Deep Learning).强化学习 (Reinforcement Learning).迁移学习 (Transfer Learning ...

  2. 一种统计ListView滚动距离的方法

    注:本文同步发布于微信公众号:stringwu的互联网杂谈 一种统计ListView滚动距离的方法 ListView做为Android中最常使用的列表控件,主要用来显示同一类的数据,如应用列表,商品列 ...

  3. 【Python】类

    初探类 类定义与函数定义( def语句 )一样必须被执行才会起作用 调用 x.f() 其实就相当于 MyClass.f(x) 补充说明 数据属性会覆盖掉具有相同名称的方法属性 命名方法 方法名称使用大 ...

  4. spring-boot-route(七)整合jdbcTemplate操作数据库

    在一部分内容中,我们学习了Restful接口的编写,及接口文档的生成.我们需要将接口数据进行持久化存储,这一部分我们主要学习几种持久化框架将数据进行存储.本部分内容中,我们都将使用mysql为例来做为 ...

  5. 055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念

    055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念 本文知识点:数组的概念 数组的声明创建.初始化 在学习数组的声明创建.初始化前,我们可以和之 ...

  6. matlab中imread 从图形文件读取图像

    来源:https://ww2.mathworks.cn/help/matlab/ref/imread.html?searchHighlight=imread&s_tid=doc_srchtit ...

  7. 《穷查理年鉴》习惯 & 工作 & 自省 & 自律 (关于自己)

    习惯 001.在那充满古老年鉴的年代里,扔掉你的恶行,不管它们曾经给你带来多大的好处. 002.许多关于预言的争论都可以简化为:当你说是时,就有人说浊;当你认为不是时,一定有人说是. 003.坏习惯和 ...

  8. S3C6410中断系统

    S3C6410的中断主要改进是. 增加中断向量控制器,这样在S3C2440里需要用软件来跳转的中断处理机制,在S3C6410完全由硬件来跳转.你只要把ISR地址是存在连续向量寄存器空间,而不是象S3C ...

  9. Redis的介绍以及安装

       redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库,缓存和消息中间件 高速缓存介绍 高速缓存利用内存保存数据,读写速度远超硬盘 高速缓存可以减少 I/O 操作,降 ...

  10. SQl编程存储过程

    过程化存储 存储过程,一组为完成特定功能.经过编译后存储在数据库中的SQL语序集 灵活性:存储过程中可以进行流程控制和循环操作来完成复杂的判断和运算 一致性:通过存储过程可以使一些关联的操作一起发生, ...