这几天我这个蒟蒻为了搞懂部分的广搜优化也是心累,所以来做个简单的总结。
当然凭借目前的水平能够总结的只有小部分的内容,毕竟我超弱啊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啊嘿嘿嘿~