估价函数的优劣决定一个A*算法的好坏

360百科上是这样说的:

(https://baike.so.com/doc/6223470-6436780.html)

关于估价函数h(n)与实际距离d(n)的大小关系导致的搜索范围的不同,一些同学表示不理解

这里给出一个不是很严谨的证明:

首先,d(n)+g(n)即为当前路径到目标状态的总距离,

而我们在估价后,认为这条路径的总距离为h(n)+g(n)

以第一种情况(h(n)<d(n))为例  八数码

在八数码中的估价中,我们发现一次操作最多使两个元素接近于目标状态,

所以把每个数字距离目标的状态的曼哈顿距离之和除以二,这样是一个最理想的距离,

也就是说,h(n)<d(n)。

而每次取出队首元素,向下扩展,我们可以想到,

随着深度的增大,该路径的g(n)+h(n)会越来越大,一直趋向g(n)+d(n)

所以当这个值比其他路径的估价大时,就不会再继续搜这条路径了

可以理解为,深度越大,一条路径的优势越小,从而搜到的范围比较大

为什么一定能搜出最优解:

最优解的g(n)+d(n)<非最优解的g(n)+d(n),而h(n)<d(n),

因此,不会存在一种情况,使最优解的g(n)+h(n)>非最优解的g(n)+d(n)

而随着深度的增大,每个路径g(n)+h(n)都是会趋向g(n)+d(n)的

在一个非最优解的路径中,随着深度增大,

在搜到目标之前,一定会在某一层出现都比最优解估价大的情况

而最终先搜到目标的,就是最优解。

关于A*估价函数的总结的更多相关文章

  1. BZOJ 2850: 巧克力王国 KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...

  2. BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...

  3. BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 1000000000 using namespace std; ...

  4. ACM模板(持续补完)

    1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

  5. KD-tree(2维)

    用于动态插入以及求某点的最近点的距离(BZOJ2648,BZOJ2716) #include <cstdio> #include <cmath> #include <al ...

  6. A*算法

    A*在游戏设计中有它很典型的用法,是人工智能在游戏中的代表. A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚 A*算法,我看还是先说说何谓启发式算法. 一.何谓启发式搜索算法: 在说它之前 ...

  7. 【bzoj1941】 Sdoi2010—Hide and Seek

    http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...

  8. 【bzoj2648】 SJY摆棋子

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...

  9. 人工智能 启发式算法(A,A*)

    启发式算法区别于盲目搜索算法,是搜索策略的一种.主要特点是 可以利用问题自身的一些特征信息(启发式信息)来指导搜索的过程,从而可以缩小搜索范围,提高搜索效率. 实际上,启发式算法也代表了"大 ...

随机推荐

  1. css使用text-align: justify不能实现两段对其的问题解决方式

    一行文本不进行处理.还有就是强制换行的也不处理.所以你强制占满(在后面加个span)了一行他才处理 <p class="home">test test test < ...

  2. pinyin4j的基本使用

    PinYin4jUtils工具类代码:http://www.cnblogs.com/jepson6669/p/8856082.html maven中引入依赖 <!-- 引入pinyin4J的依赖 ...

  3. TOJ 1885 Triangles

    Description It is always very nice to have little brothers or sisters. You can tease them, lock them ...

  4. 微软的深度学习框架cntk ,我目前见过 安装方式最简单的一个框架,2.0之后开始支持C# 咯

    wiki:https://github.com/Microsoft/CNTK/wiki 嗨,你也是我这种手残党么?之前试着安装着mxnet和tensorflow,但是因为时间比较短所以往往来不及安装完 ...

  5. python学习(五)--打印错误信息

    from urllib import request #打印错误信息 except Exceptionlist = [ "http://www.baidu11.com/", &qu ...

  6. Zookeeper之集群搭建(Linux)

    Zookeeper集群搭建(Linux环境) 条件准备:准备三台Linux服务器 vt-serv1.vt-serv2.vt-serv3(虚拟机/物理机均可,服务器数量一定要是单数,不要问我为什么,据说 ...

  7. MyBatis 中 sqlmapconfig核心标签typeAliases配置说明

    标签说明 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声 ...

  8. python的传递实参

    你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或更复杂的对象(如字典).将列表传递给函数后,函数就能直接访问其内容 1.在函数中修改列表 将列表传递给函数后,函数就可对其进行修改. ...

  9. python高阶函数sorted

    原文 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因 ...

  10. python中的字符串 列表 字典

    字符串     一个有序的字符集合  不可变 1,可以使用for in语句进行迭代循环,返回元素    2,in类是于str.find()方法但是是返回布尔结果        str.find()返回 ...