关于A*估价函数的总结
估价函数的优劣决定一个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*估价函数的总结的更多相关文章
- BZOJ 2850: 巧克力王国 KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...
- BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆
Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...
- BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 1000000000 using namespace std; ...
- ACM模板(持续补完)
1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...
- KD-tree(2维)
用于动态插入以及求某点的最近点的距离(BZOJ2648,BZOJ2716) #include <cstdio> #include <cmath> #include <al ...
- A*算法
A*在游戏设计中有它很典型的用法,是人工智能在游戏中的代表. A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚 A*算法,我看还是先说说何谓启发式算法. 一.何谓启发式搜索算法: 在说它之前 ...
- 【bzoj1941】 Sdoi2010—Hide and Seek
http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...
- 【bzoj2648】 SJY摆棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...
- 人工智能 启发式算法(A,A*)
启发式算法区别于盲目搜索算法,是搜索策略的一种.主要特点是 可以利用问题自身的一些特征信息(启发式信息)来指导搜索的过程,从而可以缩小搜索范围,提高搜索效率. 实际上,启发式算法也代表了"大 ...
随机推荐
- Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- 吴恩达《Machine Learning Yearning》总结(21-30章)
21.偏差和方差举例 前提:对于人类而言,可以达到近乎完美的表现(即人类去做分类是误差可以接近0). (1)假设算法的表现如下:训练误差率:1%,开发误差率:11%:此时即为高方差(high vari ...
- webbrowser使用已过期资源的一个报错
如果webbrowser控件已更新,仍使用一个HtmlElement就会出现以下错误: 2013-12-23 17:33:48,375 [18] ERROR xx.xxx<Run>b__0 ...
- Hashtable元素的删除
2中方法 Remove(); Clear(); static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add(1,& ...
- 网页设计,Access入门 2010,语文
Access入门 2010(select查询) order by(按升序排列)?+desc(按降序排列) group by(进行分组,下一行只能用having) sum(数值总数)?+as?(新字段的 ...
- 08.StreamReader和StreamWrite的学习
StreamReader和StreamWrite是用来操作字符的 namespace _21.对StreamReader和StreamWriter的学习 { class Program { stati ...
- 集合的前N个元素
集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下: (1)数1属于M: (2)如果X属于M,则Y=2*x+1和Z=3*x+1也属于M: (3)此外 ...
- java参数传递之值传递
一 概述 1.什么是参数传递? 调用方法时向形参传递数据的过程叫做参数传递.在编程语言中有两种传递方式:值传递与引用传递.必须强调的是,这里提到的两种传递方式不是仅限于java使用到的传递方式,而是出 ...
- CSS3 常用新特性总结
更新于(2017.07.07)会总结项目中比较常用的有些CSS属性 伪类选择器 E:first-of-type: 匹配同类型中的第一个同级兄弟元素E E:last-of-type: 匹配同类型中的最后 ...
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...