小结:A* & IDA* & 迭代深搜
概要:
在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs。在这里A*、IDA*和迭代深搜都是对dfs的优化,因此放到一块小结。
A*的概念主意在于估计函数,f(n)=g(n)+h(n),f(n)是估计函数,g(n)是n节点的当前代价,h(n)是n节点的估计代价;而实际中,存在最优的估计函数f'(n)=g'(n)+h'(n),那么显然我们在A*的估计中,h(n)<=h'(n),否则你将搜不到最优解;(g(n)>=g'(n)我还不怎么清楚为什么啊,大多数情况是g(n)=g'(n),这个可以不用管吧。。),所以我们可以根据题目所给约束来计算估计代价,当然越逼近h'(n)的估计代价效率越高(显然bfs是h(n)=0的情况)(有关A*概念介绍在这篇博文里【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索))
裸的A*是往下搜的话更新答案(剪掉估计函数>当前最优解的枝),但是深度还是可能很大,所以我们考虑迭代深搜。
迭代深搜又是一种思想,即限制搜索深度,这样A*与迭代深搜结合起来就成为了IDA*,效率大大提高。
技巧与注意:
技巧只有一个,就是尽量时h(n)逼近h'(n),那么我们就要考虑如何逼近。
例如【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)这题就是考虑到了“当前没有到达目标位置的点的数量”,用这个作为h(n),而这是显然正确的,即h(n)<=h'(n),因为无论如何不在目标位置上的点总是要至少移动一步才能到达目标。(拓展:假设没有空格,而是可以直接换,那么我们可以/2就行了。这也是显然的吧)
然后还有一个应用是求k短路,其中用起点到当前点的维护信息作为g(n),当前点到终点的维护信息作为h(n),这个估计代价也是显然的吧。然后每次将估价函数最小的先弹出来做bfs。当bfs的当前节点为终点时,那么ans+=1,当ans==k时就能结束bfs了,此时的g(n)就是k短路,例题【POJ】2449 Remmarguts' Date(k短路)。(在这里如果起点终点都相等,那么在bfs前要处理k为++k,因为起点和终点的距离为0了,显然会在第一次bfs就累计了答案,而这个答案是我们所不需要的)
小结:A* & IDA* & 迭代深搜的更多相关文章
- bzoj 1085骑士精神 迭代深搜
题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...
- uva12558 Egyptian Fractions (HARD version)(迭代深搜)
Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...
- [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>
题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...
- [codevs1049]棋盘染色<迭代深搜>
题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...
- [noip模拟]小猫爬山<迭代深搜>
[题目描述]: Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Freda和rai ...
- 【wikioi】1049 棋盘染色(迭代深搜)
http://www.wikioi.com/problem/1049/ 这题我之前写没想到迭代加深,看了题解,然后学习了这种搜索(之前我写的某题也用过,,但是不懂专业名词 囧.) 迭代加深搜索就是限制 ...
- 【BZOJ3041】水叮当的舞步 迭代深搜IDA*
[BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...
- POJ 1691 Painting A Board(迭代深搜)
题目链接 调了一上午,单步的效率太低了,特别是在有递归的情况下...下午来了,输出调试了下,就发现bug了,各种混乱啊. 比较高兴的事,1Y了.本来还准备用edge1优化一下的,结果完全没用到.. # ...
- 【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)
IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有 ...
随机推荐
- python2.7里的StringIO.StringIO与BytesIO有什么区别
import StringIO与from io import BytesIO的区别 open()函数返回的文件对象取决于模式.当使用文本模式打开文件时,它返回一个TextIOBase的子类.当使用二进 ...
- AA MME设备内部错误
adobe audition 找不到所支持的音频设备 这是3.0的错误! 上面是cs6的错误的图 主要原因是以前安装过,没有注册表没有清理干净 解决方案: https://jing ...
- Jquery重新学习之三[属性addClass(),removeClass(),toggleClass()]
1:属性.addClass(class|fn)及.removeClass(class|fn) 1.1 .addClass(class) 参数class一个或多个要添加到元素中的CSS类名,请用空格分开 ...
- JavaScript ,Css and Jquery In OpenERP 7.0
From: http://openerpbay.blogspot.jp/2013/02/javascript-css-and-jquery-in-openerp-70.html Hi fellows, ...
- Java之JVM调优案例分析与实战(1) - 高性能硬件上的程序部署策略
本JVM系列均来源于<深入理解Java虚拟机>一书中,版权归该书作者所有. 环境:一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新系统硬件为4个CPU.16GB物理内存.OS ...
- percona XTRADB Cluster 5.6在ubuntu安装
installing-perconaXTRADB Cluster 5.6 in-ubuntu-13-10-wheezy First of all, I would recommend login as ...
- javascript 模块化模式总结(二)
一.对象字面值 这种设计模式中,一个对象被描述为一组以逗号分隔的名称/值对括在大括号({})的集合.对象内部的名称可以是字符串或是标记符后跟着一个冒号":".在对象里最后一个名称/ ...
- mysql和redis之间互相备份
http://code.google.com/p/redisql/wiki/Examples 项目地址:https://github.com/JakSprats/predis/blob/master/ ...
- Sphinx全文检索引擎测试
数据表 1.documents CREATE TABLE `documents` ( `id` int(13) NOT NULL auto_increment, `group_id` int(11) ...
- Javascript遍历页面控件
function validate(){ //var Elements = document.all; var Elements = document.getElementsByTagName(&q ...