算法导论——A*算法易懂的证明
算法导论——A*算法易懂的证明
- 前言
- A* 证明
证明采用反证法,课上老师讲解不够清晰,课后自己下了点功夫,明白了A * 算法的原理。
前言
A*算法,其核心思想在于f(n)和Best-First.其中 f(n) = g(n) + h(n),h(n)是代价估计函数,
g(n)是出发点到点n的距离。我们假设结点n可以到达m个结点。这m个结点形成一个
集合S。进一步的,h(n) = minDistance {n -> m | m ∈ S}。从而计算出结点n的代价函
数f(n),再利用Best-First思想,选择f(n)最小的结点,然后递归操作。
A* 证明
我们需要证明利用A*算法选出的路径是最小路径。证明采用反证法。
现在,我们假设有:
A*算法选出的路径A = {S, N1, N2 … Ni-1, Nj … N’, T( A )},并说明该路径不是最短路径。
以及,
最短路径P = {S, N1, N2 … Ni-1, Ni,Ni+1 … T( P )},最短路径中必定包含路径A中没有的结点Ni。并说明路径P的Ni之前的所有结点和路径A保持一致。
其中T( A )表示由路径A到达的终点T,T( P )表示最短路径P到达的终点T,N’表示T( A )结点的上一个结点
因为有f(Ni) = g(Ni) + h(Ni) <= g(T(P)) + 0 = f(T(p))
即无论如何,我们的Ni的下一个结点到起始点的路径长度小于等于终止点T§到起始点的路径长度
又有f(T(P)) <= f(T(A))
即T( P )是最短路径
所以有f(Ni) <= f(T( A ))。
同理,有
所以有f(Ni+1) <= f(T( A )),f(Ni+2) <= f(T( A ))……f(T( P )) <= f(T( A ))
这时,我们反过来看A*算法选出的路径,当我们处于N’,要选择下一个结点时,根据Best - First,我们必定会选择Ni结点,而不会选T(A);而当我们处于Ni结点时,我们必定会选择Ni+1,而不会选择T(A),如此一来,路径A不可能达到,故矛盾,所以A*算法正确
算法导论——A*算法易懂的证明相关推荐
- 算法导论——排序算法
学习<算法导论>学习感受 转载于:https://www.cnblogs.com/xuddong/archive/2013/04/10/3012567.html
- 算法导论——贪心算法:哈夫曼编码(霍夫曼编码)
2019独角兽企业重金招聘Python工程师标准>>> package org.loda.greedy;import org.junit.Test; import org.loda. ...
- 算法导论-排序算法-分治法
1.分治法原理 所谓的分治指的就是分而治之,即将大规模的问题分解成几个较小规模的问题.通过对较小规模问题的求解达到对整个问题的的求解.当我们将问题分解成两个较小问题求解时的分治方法就是二分法. 分支的 ...
- 算法导论5:基数排序和计数排序 2016.1.5
今天的这个比较神奇,是一个线性复杂度的排序算法O(n),算法导论在这一部分先证明了比较排序的复杂度下界是nlgn,所以基数排序不是基于比较的排序. 其实这种比较方法我们应该都接触过.假设输入的数都是三 ...
- 算法导论9.1-1找第二小的元素
文章目录 算法导论9.1-1 1.证明:在最坏情况下,找到n个元素中第二小的元素需要 n+ceil(lgn)-2 次比较.(提示:可以同时找到最小元素) 1.证明 n-1 2.证明 ceil(lg) ...
- 组合数学 算法导论 具体数学 博弈论 计算机科学数学
组合数学[清华大学] https://www.bilibili.com/video/BV1sW411V7RU 15日掌握<具体数学>第1天学习直播实况记录(2019.5.27) https ...
- 重读《算法导论》第一章
重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...
- 算法导论-麻省理工公开课-百度云
资源来源于网络,若有侵权,请告知,我会在24小时之内删除~~ 我整理的资源已汇总,请访问:资源汇总贴,选择自己还需要的资源~ 算法导论的视频教程,算法导论,算法中的圣经啊.分享麻省理工的公开课,需要的 ...
- 算法导论主定理证明(3)
章节4.6.1引理4.3的第一句就不证了,因为比较简单. 这里是最后一部分的证明,即算法导论4.6.2---向下取整和向上取整部分. 呼~到这里为止终于把这个定理证完了! 仔细用mathtype码证明 ...
最新文章
- python tab符号_Python3 expandtabs()方法
- TensorFlow学习笔记(四)自己动手求Weights和biases
- 委托又给我惹麻烦了————记委托链的取消注册、获取返回值
- 在JDT中使用Java 8 Lambda
- java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例
- 谈谈如何在面试中发掘程序猿的核心竞争力 什么是程序员的核心竞争力?
- Mysql字符串组合的问题
- pythontry参数_Python try except异常处理详解(入门必读)
- 从字节码层面,解析 Java 布尔型的实现原理
- springBoot于tomcat7搭建websocket服务
- 【大数据部落】基于ARIMA、SVM、随机森林销售的时间序列预测
- ong拼音汉字_拼音ong到底怎么读?
- 它拖慢你的网速,还泄露你的个人隐私,学一招治治它
- idea怎么进行c语言编程_idea编写c语言
- web字体文件过大优化方案
- 淘宝怎么选品技巧秘籍,做淘宝7分靠选货品
- matlab中的out模块,matlab-simulink中out模块怎么用?
- 谈谈Line-height的深入理解 与 应用
- 第五章(第四节)论路由器重置
- 关于LTE终端的所谓的五模、七模、十频、十一频