A* IDA* BFS Dijkstra 几种搜索方式
来源:互联网 发布:mac安全控件 编辑:程序博客网 时间:2024/05/22 07:46
学搜索中最先接触到的肯定是dfs和bfs。这两种也是比较基础的搜索方式。这类的题目也非常多,状态的设计及转移变化也很多,需要多加练习。这里着重讲一讲其他几种搜索方式。先说一个之前dfs和bfs 理解的误区,原来一直以为bfs只能求最优解,其实不是的。。如果对入队的状态不加以hash掉,任其自由扩展,那么求出来的就是所有状态。
A*
A*中存在一个f()=g()+h(); 其中g()代表的是从我们的初始状态扩展到这个当前状态的真实消耗,h()是从这个状态到最终状态的估计消耗,这里要保证,h()一定要比从该状态到目标状态的真是消耗一定要小,为什么后面解释。
具体的操作就是维护一个队列,第一步将初始状态放入队列中,然后重复一下过程,初始所有的状态均是开启。
(1)队列是否为空,如果是,那么结束搜索,不是继续 2。
(2)从队列中取出一个f()值最小的,检查这个点是否关闭,如果是,那么继续1,不是3.如果这个点就是目标状态了,那么这个就是答案。
(3)将该状态标记为设为关闭,也不在开启,然后从这个状态扩展一下,所有扩展出来的状态,如果已经是关闭的,那么不管,如果队列中不存在,那么添加到队列中,如果这个状态在队列中已经存在了,那么我们更新掉队列中的最优解,继续1.
这个流程和我们原来学过的bfs是不是很像,原来我们用的bfs可以说就是一个h()=0时候的特例,A*的正确性不难说明,B状态代价b,如果存在从一个X状态转移过来的代价更小,那么在队列中找到b之间那么f(X)=g(X)+h(X); 又因为h(X)是估计值,比真实的估计要小,所以在B出队列之前,那么X一定会出队列,并且更新过来。反证法完毕。
DBFS
双向广搜的原理的bfs其实没太大差别,双广适用于初始状态和目标状态都已经知道情况下的搜索,由于最坏的情况下,广搜的状态数是成指数级增长的, 所以如果一遍搜索的深度过深,那么时间空间都可能会非常巨大,所以如果采用双广,那么理想情况下可以达到单广的开根号。
在这里有一点需要注意的就是如果在采用dbfs寻求最优解的时候,由于我们认为,两个方向中最先相遇的就是最优解,所以在两边队列中扩展的时候必须是一层一层的扩展,而不能是一个一个节点扩展。
- A* IDA* BFS Dijkstra 几种搜索方式
- A*,IDA*,Dijkstra
- HDU 3220 IDA*搜索 || BFS
- 搜索,A* IDA*
- 搜索 ( 八数码问题详解:BFS,A*,IDA* )——Eight ( POJ 1077 )
- 【IDA*搜索】uva11212Editing a Book
- poj 1077 Eight (bfs A* IDA*)
- lucene几种搜索方式
- 【搜索-BFS】A计划
- 【启发式搜索】A*与IDA*学习笔记
- 【BFS/Dijkstra】hdu 1548 A Strange Lift
- hdu 1548 A strange lift (BFS、Dijkstra)
- HDU1548:A strange lift(Dijkstra && BFS)
- 【dijkstra + 优先队列 && bfs && A*】POJ
- 【A*搜索,BFS搜索】poj3897Maze Stretching
- AI中的几种搜索算法---A*搜索算法
- AI中的几种搜索算法---A*搜索算法
- 【UVA】11212-Editing a Book(IDA*搜索减枝)
- gdb教程:5. How do I use watchpoints?
- keil 软件的使用注意事项(持续更新中)
- 多线程的一些小问题集锦
- Objective-C特点及特征
- Java HttpURLConnection 以数据流写数据到Servlet
- A* IDA* BFS Dijkstra 几种搜索方式
- C++第十三周任务-项目一(理解基类中成员的访问限定符和派生类的继承方式)
- css选择器种类
- jquery与js原生 的加载方式区别
- JQUERY从指定数组移除指定的值操作
- gdb教程:6. Advanced gdb Features
- 《Head First Object-Oriented Analysis and Design》读书笔记
- hdu4445-Crazy Tank
- hdu 3342 两种解法