关于广搜优化的半吊子总结

来源:互联网 发布:电脑无损音乐播放软件 编辑:程序博客网 时间:2024/05/17 08:49

这几天我这个蒟蒻为了搞懂部分的广搜优化也是心累,所以来做个简单的总结。

当然凭借目前的水平能够总结的只有小部分的内容,毕竟我超弱啊QAQ

一、双向bfs

在已知目标状态的情况下,可以从目标状态初始状态一起开始搜索。

用两个队列表示两个方向的搜索,一旦有重合的点,即为正解。

当两个队列皆不为空时,对未处理元素少的队列进行扩展。注意,扩展和处理一定要分开,扩展仅仅代表将一个合法的点加入队列,而处理则是另外的部分,切忌在扩展函数中对元素进行处理。【估计这种错误只有我会犯orz】 所以一定要理解清双向广搜的思想。

以下是伪代码orz

while (!q1.empty()&&!q2.empty()){if (sum1<sum2) {//扩展q1的点;//处理;}else{//扩展q2的点;//处理;}}while(!q1.empty()){//扩展q1的点;//处理;}while(!q2.empty()){//扩展q2的点;//处理;}}


二、分支定界

这个由于自身了解的不是很深刻,所以只能浅显的总结几句。

用最简单的话来讲,就是边搜索边剪枝,将不可能达到目标的点以及一定不为最优解的点剪枝即可。

每一次搜索将当前的点与目前的最优解比较,如果明显不为最优解即可弃去该点。

分支定界可用 队列法(FIFO)或者优先队列法(最大堆/最小堆),根据题意具体实现。

个人认为这个讲的很详细可以参考 分支定界


三、A*算法

这里就偷个懒分享一个dalao的博客,非常好懂。

点击打开链接

写出估价函数,找到最优点。

ps:A*算法对于空间需求很大,可能到达指数级别,但在理论时间上是最优的。


四、迭代加深搜索

算是bfs+dfs???

迭代加深搜索经常用于深度上没有上界的问题。

通过设定一个maxd的深度多次进行搜索,如果没有找到解,则maxd++,直到找到。

此时若已知当前点要到达目标所需深度大于maxd,就剪枝。

使用迭代加深搜索时要保证一定可以找到解,否则会无限循环下去orz。


五、hash???

这个不say了,都懂……



好,蒟蒻的总结到此结束,啪啪啪啪啪啪!!!!!

有兴趣的话来看一看我的PPT啊嘿嘿嘿~



0 0
原创粉丝点击