本文内容主要来自Artificial Intelligence A Modern Approach和Stanford CS221。
人工智能可以被建模成:学习,模型,推断。所谓的搜索往往指的是根据模型推断的过程。
本文的内容主要包括
- 搜索算法的背景和定义
- 无信息搜索算法
- 宽度优先搜索BFS
- 统一代价搜索UCS
- 深度优先搜索DFS
- 深度受限搜索DLS
- 迭代加深搜索IDS
- 双向搜索BS
- 有信息搜索算法
- 贪心搜索
- A* 搜索
- 迭代最佳优先搜索RBFS
- 启发式设计
搜索算法的背景和定义
首先,搜索算法可以分为树搜索和图搜索。
简单来说,树搜索算法可能会导致状态的重复,所以在图上往往使用图搜索,当然如果你可以保证你的算法不会遇到重复状态的话,也可以放心的使用树搜索。
树搜索:
![c0b4c7fbaab3d30652dce96cb15c3817.png](https://img-blog.csdnimg.cn/img_convert/c0b4c7fbaab3d30652dce96cb15c3817.png)
图搜索:
![81ab6b30043da5e69d8b0a740dc59254.png](https://img-blog.csdnimg.cn/img_convert/81ab6b30043da5e69d8b0a740dc59254.png)
容易看出,图搜索比树搜索多维护了一个explored
队列,这个队列用来记录算法经过的节点,通过检查新的节点是否在这个队列中,图搜索避免了重复。
而两者都有的frontier
队列,则是用来记录将要探索的节点。
算法开始的时候把初始节点放到 frontier
里,接下来一直探索,如果frontier
空了却没有找到最终的目标,说明目标是不存在的,算法返回failure。
其次是对节点的描述,一个节点包括:
![3d55380d1a942b9d4b30d85acf618445.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/9331256d012fb33a78a412a198e8cb38.png)
说白了BFS就是用一个FIFO的队列维护frontier
中的节点。
我们用BFS的目标是找到目标节点,但是这个从初始节点通向目标节点的路径可能有很多条。
很多时候,我们不仅希望找到节点,还希望在搜索的过程中最小化某种指标,这个指标可以用
如果满足对任意
这个证明是很直观的,只需要一层层的向下找就可以了。往往这样假设的
注意,如果
因为目标节点在d层,所以BFS的时间复杂度和空间复杂度都是
统一代价搜索UCS
接下来,UCS就是来解决
实际上UCS也不复杂,学过了Dijkstra算法就能发现,UCS其实就是Dijkstra算法。
![137f9cda797fe9da9163998f5701e791.png](https://img-blog.csdnimg.cn/img_convert/137f9cda797fe9da9163998f5701e791.png)
UCS和BFS的主要区别是UCS维护了一个优先队列,通过这个优先队列保证达到目标节点的时候路径一定是最短的。
这个也好理解,因为从frontier
取出的节点满足chooses the lowest-cost node in frontier
,所以如果这个节点是目标节点,那么即便是存在另一个路径也可以通向目标节点,因为当前走过的路径已经比这条路长了,又有
实际上,一个更直观的事实是,任何被放入explored
的节点都满足最短路径。
深度优先搜索DFS
DFS和BFS的区别就是DFS用一个LIFO的队列(其实就是栈)来维护frontier
。
注意,因为DFS一旦找到了目标节点就会停止,所以当
但是,如果
![d6e172dd9b500eef02f7d3febde14594.png](https://img-blog.csdnimg.cn/img_convert/d6e172dd9b500eef02f7d3febde14594.png)
值得一提的是,在树搜索算法中,DFS非常容易陷入无穷的循环,所以DFS往往用于图搜索。
因为DFS理论上要搜完整个空间才知道是否有解,所以最大的时间复杂度是