关于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*)
启发式算法区别于盲目搜索算法,是搜索策略的一种.主要特点是 可以利用问题自身的一些特征信息(启发式信息)来指导搜索的过程,从而可以缩小搜索范围,提高搜索效率. 实际上,启发式算法也代表了"大 ...
随机推荐
- linux命令行下的操作的快捷键
历史相关命令 命令 含义!! 执行上一条命令!num 执行历史命令中的第num条命令!-n ...
- underscore javascript工具库支持seajs模块化
underscore是一个很有用的js工具库,但是好像默认不支持seajs模块化 新建一个文件例如叫做xx.js 谈后,键入 define(function(require,exports,modul ...
- BNU29064——硬币水题II——————【事件概率】
硬币水题II Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: ...
- 2、弹出窗口 Alert
1.只是弹出框 /* --- page1.html ---*/ <ion-navbar *navbar> <ion-title>Tab 1</ion-title> ...
- WPF MVVM 如何在ViewModel中操作View中的控件事件
(在学习Wpf的时候,做一个小例子,想在TextBox改变后,检验合法性,并弹出提示.在找了很多贴后,发现这个小例子,抄袭过来,仅供参考. 最后也找到了适合自己例子的办法:在出发TextChanged ...
- 【Linux】安装配置JDK1.8
第一步:下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件: https://www.oracle.com/technetwork/java/javase/downloads/in ...
- Django分页解析
分页 django中实现管理数据分页的类位于 django.core.paginator.py中 Paginator类 对列表数据进行分页处理 对象 Paginator(Post.objects.al ...
- drupal基础
http://www.cnblogs.com/yaoliang11/archive/2009/07/31/1535883.html
- qt 创建线程
http://www.cnblogs.com/xinxue/p/6840315.html Qt 之 QtConcurrent 本文以 Qt 中的 QtConcurrent::run() 函数为例,介绍 ...
- PHP header() session_start() 函数前为什么不能有输出?
前阵面试遇到的问题,当时没答上来,后来查了些资料,仍未得到答案.今天研究HTTP请求,终于知道了答案. HTTP 函数允许在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. HTT ...