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

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

当然凭借目前的水平能够总结的只有小部分的内容,毕竟我超弱啊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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值