A* IDA* BFS Dijkstra 几种搜索方式

    学搜索中最先接触到的肯定是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寻求最优解的时候,由于我们认为,两个方向中最先相遇的就是最优解,所以在两边队列中扩展的时候必须是一层一层的扩展,而不能是一个一个节点扩展。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值