搜索进阶

  搜索进阶的话,我觉得A*,IDA*,双向BFS应该都是吧。

  双向BFS就是同时从起点和终点开始BFS,直到遇到对方标记的结点就停止(这样应该不一定是最短路),这样的话只要有解就可以减去很多种可能,从而提高效率。

不过如果没解的话,两边的搜索没有交叉,也就。。。会更慢。。。

  然后就是A*,这算是人工智能里面的了吧。。。就是F(n)=G(n)+H(n),这里G一般就是节点的深度,也就是走了多少步走到了这里,H的话就是一个估计,估计还有差不多多少步就会走完,然后这两个加起来,作为一个依据,那么下一次要扩张的节点就是F值最小的那一个,因为这一个我们猜的可能是最优的,所以先走这个。当然可能这样的话可能并不能走到头。这样的话每次都找那个F最小的来扩张,找最小F的话可以用优先队列也就是二叉堆来优化。一般就会快不少。

  不过要想得到最优解的话,应该保证H小于等于实际需要的步数,也就是说你要走到某个地方,那么H可以为直线距离,因为不可能比他更小了。

  每次都保证H小于等于实际的话,最终一定可以拓展那个正确道路上的节点(不一定多块),因为别的点拓展到最后一定F比最优解大了,那么选最小的那个就是正确路上的那个了。

  而且对于H的设计,这应该就是A*算法的核心了,有的可以是直线距离,有的可以是曼哈顿距离(也就是两个点x坐标相减与y坐标相减的和),也可以是不符合条件的个数(不在位个数),一个好的设计可以让程序更快。而且H的设计的话应该保证H小于等于实际值,而且一般来说,不同状态的H差别越大越好,小的很小,大的够大。

  至于IDA*的话,又叫做迭代加上A*,应该是一种DFS吧,不过加了一个限制条件,设置一个期望的深度,当DFS到某一层的时候如果G+H大于这个深度了,就直接返回,因为我们要求的是深度小于等于设置值的解。IDA*的代码要短不少,写的也轻松,速度也不错。。。

  然后就是搜索的问题了,这里要说的就是Eight了,八数码问题,作为学习各种搜索算法的非常好的一个题目。这里我用的是杭电1043,而不是POJ 1077,虽然他们题目几乎一模一样,但是杭电上是多组数据,POJ上是一组,这样的话多组数据可以方便看出各种算法的效率。

  先是一篇经典的文章,八数码的八境界

  这篇文章系统的讲了八种方法,写的很好的。

  然后就是我根据那位大神自己写的,(代码好烂的。)

  链接请单击

时间: 2024-10-04 15:38:23

搜索进阶的相关文章

poj 1426 Find The Multiple 搜索进阶-暑假集训

E - Find The Multiple Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only

kuangbin专题 专题二 搜索进阶 Nightmare Ⅱ HDU - 3085

题目链接:https://vjudge.net/problem/HDU-3085 题意:有两个鬼和两个人和墙,鬼先走,人再走,鬼每走过的地方都会复制一个新鬼, 但新鬼只能等待旧鬼走完一次行程之后,下一次旧鬼再次开始新的行程时旧鬼才能移动, 旧鬼一个行程能走最多两步,M能走三步,G能走一步. 问M和G能不能在被鬼抓住之前相遇,求最短时间. ‘Z’表示鬼. 第一次用曼哈顿距离来真正解决搜索,参考过别人的代码,这份代码感觉还是比较清楚和简单的. 人每次移动一个距离都要进行一次曼哈顿距离的判断,判断人到

1321:棋盘问题(深度优先搜索进阶)

题目链接:http://bailian.openjudge.cn/practice/1321?lang=en_US 题意: 求在一个n*n的矩阵内棋盘内摆放k个棋子的方案,这些棋子不在同一行不在同一列去 思路:可以通过深度优先搜索去搜寻每一行棋子与其他棋子摆放的可能方法数. 代码如下: #include<stdio.h> #include<string.h> #include<iostream> using namespace std; char mp[10][10];

搜索进阶题

1.http://acm.hdu.edu.cn/showproblem.php?pid=1254 分析:由于箱子每次都只能推,而不能拉,所以我们知道,每次往方向 i 推的时候,人必然会站在一个确切的位置 p .所以我们在每次推箱子的时候先bfs求出人是否可以到达 p 位置.若可以到达 p ,则往 p 的对面的推动一格,否则判断下一个方向.直到推到目标位置为止.然后我们得到下面的代码: 1 //First Edit Time: 2014-11-02 17:06 2 //Last Edit Time

POJ-3126 暑假集训-搜索进阶F题http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/F

经验就是要认真细心,要深刻理解.num #include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<ctype.h>#include<queue>using namespace std;#define N 11000 typedef struc

HDU2612 -暑假集训-搜索进阶N http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/N

这两天总是因为一些小错误耽误时间,我希望自己可以细心点.珍惜时间,珍爱生命!#include<iostream> #include<algorithm> #include<string.h> #include<ctype.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<limits.h> #include<queue>

搜索进阶1、八数码(HDU1043)

http://acm.hdu.edu.cn/showproblem.php?pid=1043 八数码八境界: https://www.cnblogs.com/zufezzt/p/5659276.html 借用了MAP哈希,发现只能过hdu(249ms),poj一直TLE. 还是先上个代码吧,以后再改用康拓展开来哈希.. 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<

CSP2019突击训练(搜索专题)

专题一 简单搜索POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find The MultiplePOJ 3126 Prime PathPOJ 3087 Shuffle'm UpPOJ 3414 PotsFZU 2150 Fire GameUVA 11624 Fire!POJ 3984 迷宫问题HDU 1241 Oil DepositsHDU 1495 非常可乐HDU 261

HDU3533(Escape)

不愧是kuangbin的搜索进阶,这题没灵感写起来好心酸 思路是预处理所有炮台射出的子弹,以此构造一个三维图(其中一维是时间) 预处理过程就相当于在图中增加了很多不可到达的墙,然后就是一个简单的bfs 此题难点也是预处理过程,还有就是注意可以停在原地也就是有5个方向 然后就是建图用bool类型,不然可能会爆内存. http://acm.hdu.edu.cn/showproblem.php?pid=3533 AC: 405ms 11608kb #include<iostream> #includ