宽度优先搜索算法实现8数码_经典搜索算法总结

本文内容主要来自Artificial Intelligence A Modern Approach和Stanford CS221。

人工智能可以被建模成:学习,模型,推断。所谓的搜索往往指的是根据模型推断的过程。

本文的内容主要包括

  • 搜索算法的背景和定义
  • 无信息搜索算法
    • 宽度优先搜索BFS
    • 统一代价搜索UCS
    • 深度优先搜索DFS
    • 深度受限搜索DLS
    • 迭代加深搜索IDS
    • 双向搜索BS
  • 有信息搜索算法
    • 贪心搜索
    • A* 搜索
    • 迭代最佳优先搜索RBFS
  • 启发式设计

搜索算法的背景和定义

首先,搜索算法可以分为树搜索图搜索

简单来说,树搜索算法可能会导致状态的重复,所以在图上往往使用图搜索,当然如果你可以保证你的算法不会遇到重复状态的话,也可以放心的使用树搜索。

树搜索:

c0b4c7fbaab3d30652dce96cb15c3817.png

图搜索:

81ab6b30043da5e69d8b0a740dc59254.png

容易看出,图搜索比树搜索多维护了一个explored队列,这个队列用来记录算法经过的节点,通过检查新的节点是否在这个队列中,图搜索避免了重复。

而两者都有的frontier队列,则是用来记录将要探索的节点。

算法开始的时候把初始节点放到 frontier里,接下来一直探索,如果frontier空了却没有找到最终的目标,说明目标是不存在的,算法返回failure。

其次是对节点的描述,一个节点包括:

3d55380d1a942b9d4b30d85acf618445.png

其中关于STATE,CS221给出了一个很好的解释:

A state is a summary of all the past actions sufficient to choose future actions optimally.

最后是描述算法好坏的指标:

  • Completeness: Is the algorithm guaranteed to find a solution when there is one?
  • Optimality: Does the strategy find the optimal solution?
  • Time complexity: How long does it take to find a solution?
  • Space complexity: How much memory is needed to perform the search?

为了描述后两个性能指标,我们在图搜索上定义一些常数(这些常数由问题确定,与算法无关)

  • branching factor b:一个节点的最多分支
  • maximum depth m:整个图的最大深度
  • solution depth d:最优解所在的深度

无信息搜索算法

宽度优先搜索BFS

9331256d012fb33a78a412a198e8cb38.png

说白了BFS就是用一个FIFO的队列维护frontier中的节点。

我们用BFS的目标是找到目标节点,但是这个从初始节点通向目标节点的路径可能有很多条。

很多时候,我们不仅希望找到节点,还希望在搜索的过程中最小化某种指标,这个指标可以用

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29 描述。

如果满足对任意

equation?tex=n%2Ca%2Cn%5E%5Cprime 三元组满足
equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%3D%5Ctext%7Bconst%7D%3E0 ,可以证明BFS是可以找到
最优解的。

这个证明是很直观的,只需要一层层的向下找就可以了。往往这样假设的

equation?tex=%5Ctext%7Bconst%7D 会是时间,人数等最小单位。

注意,如果

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%5Cneq%5Ctext%7Bconst%7D ,BFS不保证找到最优解。

因为目标节点在d层,所以BFS的时间复杂度和空间复杂度都是

equation?tex=b%2Bb%5E%7B2%7D%2Bb%5E%7B3%7D%2B%5Ccdots%2Bb%5E%7Bd%7D%3DO%5Cleft%28b%5E%7Bd%7D%5Cright%29

统一代价搜索UCS

接下来,UCS就是来解决

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%5Cneq%5Ctext%7Bconst%7D 的问题的。

实际上UCS也不复杂,学过了Dijkstra算法就能发现,UCS其实就是Dijkstra算法。

137f9cda797fe9da9163998f5701e791.png

UCS和BFS的主要区别是UCS维护了一个优先队列,通过这个优先队列保证达到目标节点的时候路径一定是最短的。

这个也好理解,因为从frontier取出的节点满足chooses the lowest-cost node in frontier,所以如果这个节点是目标节点,那么即便是存在另一个路径也可以通向目标节点,因为当前走过的路径已经比这条路长了,又有

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%3E0 ,所以
另一条路径不可能更短

实际上,一个更直观的事实是,任何被放入explored的节点都满足最短路径


深度优先搜索DFS

DFS和BFS的区别就是DFS用一个LIFO的队列(其实就是栈)来维护frontier

注意,因为DFS一旦找到了目标节点就会停止,所以当

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%3E0
无法找到最优解

但是,如果

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%3D0 ,任意到达目标节点的解都是最优解,DFS就可以找到最优解。

equation?tex=c%28n%2Ca%2Cn%5E%5Cprime%29%3D0 这种情况往往出现在对代价几乎没有要求的情况下,例如不计时间的拼魔方。

d6e172dd9b500eef02f7d3febde14594.png

值得一提的是,在树搜索算法中,DFS非常容易陷入无穷的循环,所以DFS往往用于图搜索。

因为DFS理论上要搜完整个空间才知道是否有解,所以最大的时间复杂度是

equation?tex=O%28b%5Em%29 ,但是因为需要记录的节点很少(毕竟是用栈维护),时间复杂度比较低,为
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值