估价函数的优劣决定一个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. [转]how to use both JDK 7 and JDK 8 in one build

    Note: This article is original from https://gist.github.com/aslakknutsen/9648594 JDK 8 Released Most ...

  2. unity3d发布到安卓平台

    1.首先你得装上JDK并且配置好环境(就像学java配置环境一样) 百度jdk把下载安装成功 找到安装jdk目录的bin目录,复制路径,例如 C:\Program Files (x86)\Java\j ...

  3. 九度oj题目1027:欧拉回路

    题目1027:欧拉回路 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2844 解决:1432 题目描述:     欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条 ...

  4. BNU34067——Pair——————【找规律】

    Pair Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: M ...

  5. git本地创建新分支并推送到远程仓库

    1,在当前项目目录,从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * ...

  6. WPF - MVVM 之TreeView

    在项目中使用OnPropertyChanged方法,最简单的实例: private event PropertyChangedEventHandler PropertyChanged; protect ...

  7. Introduction of Servlet Filter(了解Servlet之Filter)

    API文档中介绍了public Interface Filter(公共接口过滤器) Servlet API文档中是这样介绍的: ‘A filter is an object that performs ...

  8. 位运算(6)——Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  9. git丢弃修改

    丢弃本地所有更改: git fetch origin git reset --hard origin/[对应的分支]   更改上次提交的注释: git commit --amend  会进到(vim编 ...

  10. OpenStack各组件详解和通信流程

    一.openstack由来 openstack最早由美国国家航空航天局NASA研发的Nova和Rackspace研发的swift组成.后来以apache许可证授权,旨在为公共及私有云平台建设.open ...