A*算法的有关知识--例子:最短路径问题
前置知识
定义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*算法的有关知识--例子:最短路径问题的更多相关文章
- 机器学习算法的基本知识(使用Python和R代码)
本篇文章是原文的译文,然后自己对其中做了一些修改和添加内容(随机森林和降维算法).文章简洁地介绍了机器学习的主要算法和一些伪代码,对于初学者有很大帮助,是一篇不错的总结文章,后期可以通过文中提到的算法 ...
- (二)区块链的共识算法:PoS 及其 例子 代码 实现
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- Flyod 算法(两两之间的最短路径)
Flyod 算法(两两之间的最短路径)动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j), #include <iostream> #include <v ...
- 一个基于RSA算法的Java数字签名例子
原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性 ...
- Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)
Eclipse直接运行算法第4版例子(重定向和读取指定路径文件) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- C#算法设计之知识储备
前言 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/669 访问. 算法的讨论具有一定的规则,其中也包含一些不成文的约定 ...
- 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议
node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...
- 【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
一.熵编码概念: 熵越大越混乱 信息学中的熵: 用于度量消息的平均信息量,和信息的不确定性 越是随机的.前后不相关的信息,其熵越高 信源编码定理: 说明了香农熵越信源符号概率之间的关系 信息的熵为信源 ...
- 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)
哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...
随机推荐
- AI小白必读:深度学习、迁移学习、强化学习别再傻傻分不清
摘要:诸多关于人工智能的流行词汇萦绕在我们耳边,比如深度学习 (Deep Learning).强化学习 (Reinforcement Learning).迁移学习 (Transfer Learning ...
- 一种统计ListView滚动距离的方法
注:本文同步发布于微信公众号:stringwu的互联网杂谈 一种统计ListView滚动距离的方法 ListView做为Android中最常使用的列表控件,主要用来显示同一类的数据,如应用列表,商品列 ...
- 【Python】类
初探类 类定义与函数定义( def语句 )一样必须被执行才会起作用 调用 x.f() 其实就相当于 MyClass.f(x) 补充说明 数据属性会覆盖掉具有相同名称的方法属性 命名方法 方法名称使用大 ...
- spring-boot-route(七)整合jdbcTemplate操作数据库
在一部分内容中,我们学习了Restful接口的编写,及接口文档的生成.我们需要将接口数据进行持久化存储,这一部分我们主要学习几种持久化框架将数据进行存储.本部分内容中,我们都将使用mysql为例来做为 ...
- 055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念
055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念 本文知识点:数组的概念 数组的声明创建.初始化 在学习数组的声明创建.初始化前,我们可以和之 ...
- matlab中imread 从图形文件读取图像
来源:https://ww2.mathworks.cn/help/matlab/ref/imread.html?searchHighlight=imread&s_tid=doc_srchtit ...
- 《穷查理年鉴》习惯 & 工作 & 自省 & 自律 (关于自己)
习惯 001.在那充满古老年鉴的年代里,扔掉你的恶行,不管它们曾经给你带来多大的好处. 002.许多关于预言的争论都可以简化为:当你说是时,就有人说浊;当你认为不是时,一定有人说是. 003.坏习惯和 ...
- S3C6410中断系统
S3C6410的中断主要改进是. 增加中断向量控制器,这样在S3C2440里需要用软件来跳转的中断处理机制,在S3C6410完全由硬件来跳转.你只要把ISR地址是存在连续向量寄存器空间,而不是象S3C ...
- Redis的介绍以及安装
redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库,缓存和消息中间件 高速缓存介绍 高速缓存利用内存保存数据,读写速度远超硬盘 高速缓存可以减少 I/O 操作,降 ...
- SQl编程存储过程
过程化存储 存储过程,一组为完成特定功能.经过编译后存储在数据库中的SQL语序集 灵活性:存储过程中可以进行流程控制和循环操作来完成复杂的判断和运算 一致性:通过存储过程可以使一些关联的操作一起发生, ...