第二章 盲目搜索
解决AI问题的三个最流行的方法:搜索、知识表示和学习
2.0 简介:智能系统中的搜索
很多算法搜索和排序使用表结构
2.1介绍状态空间图(state-space graph),典型案例:假币问题(False coin problem)2.2 生成-测试(generated-and-test)搜索范式还有贪心算法(greedy algorithm)和回溯法(backtracking),都将问题分成若干步骤。
如8各皇后放在国际棋盘,任意两个皇后都不占据同一行、同一列或同一对角线:2.3主要讲了盲目搜索(Blind Search,即无信息搜索)算法。盲目搜索算法是一种不需要使用问题域知识的搜索方法。典型的有广度优先搜索(BFS,breath first search)和深度优先搜索(Depth First Search,DFS),BFS消耗内存太多,DFS内存需求合理,但可能会因为偏离起始位置过远而错过相对靠近搜索起始位置的解。介于BFS和DFS之间的折中是迭代加深的DFS,可以将DFS有限的空间需求与BFS能找到解的确定性结合到一起。
2.1 状态空间图
状态空间图(state-space gragh)是对问题的一种表示方法。空间图的一条路径,对应某个具体问题的解。有时只需搜索问题的任意一个解即可,而有时需要找到一个最优解(最短路径)。知情搜索(Informer Search)法常可以发现问题的最优解,盲目搜索可寻求发现问题的任意一个解。
假币问题(False Coin Problem),有12枚硬币,已知其中一枚是假的或伪造的,但不知道这枚假币比真币轻还是重。为解决这问题,可以建模个过程,只称3次,即可找到那枚假币。
微型假币问题(Mini False Coin Problem),只涉及6枚硬币。
状态空间树(state-space tree),包含了问题可能出现的所有状态和这些状态之间所有可能的转换,有两种特殊类型的节点,其中一种是表示问题起始状态的起始节点,搜索始于起始节点,止于终点或目标状态。有时目标是找到一个解,有时是找到最小代价的解。
2.2 生成-测试范式(generate-and-test)
定义:先给出可能的解,再检查每个可能的解,看是否有候选解能够构成问题的解。
N皇后问题(n-Queens Problem)指将n个皇后放置在一个n*n的棋盘上,使得任何两个皇后都不互相攻击,即任何两个皇后都不占据相同的行、列或对角线。这些条件被称为问题的约束条件。
一个可靠的生成器须给出满足问题约束的、大小为4的所有子集。若生成器能给出每个可能的解,那么生成器是完备的(complete).若某个给出的解被拒绝,那么这个解就不会再次被给出,那么生成器是非冗余(noredundant)的。若生成器没有给出明显不可行的解,那么它相对高效。若生成器有一些信息,允许其对给出的解做出一些限制,那么这个生成器是知情的(informed)。
生成-测试范式的过程:
{while 没有找到解,但仍有候选方案
[生成可能的解
测试其是否满足所有的问题约束条件]
End While}
IF找到某个解,则宣布成功,并输出此解
Else宣布没有找到解
2.2.1 回溯法
完全枚举法(exhaustive enumeration),会查看所有情况以寻找问题的解,甚至在已经发现当前步骤不可能成功得到解的情况下,还可能从部分解开始进一步往后搜索。
回溯法(backstracking)是对完全枚举法的一种改进。针对某个问题,给出解的过程会被分成多个步骤。
2.2.2 贪心算法
贪心算法(greedy algorithm),也是先将一个问题分成几个步骤求解,其中每次只考虑一个输入,每次总是包含一个必须优化的目标函数(objiective function),典型的目标函数可是旅行距离、开销或时间。
2.2.3 旅行商问题
旅行商问题(Travelinh Salesperson Problem,TSP),也称旅行销售员问题。
分支定界(branch and bound)算法是广度优先搜索的一种变体,此算法中按照开销不减少的原则进行探索。
2.3 盲目搜索算法
有DFS深度优先搜索、BFS广度优先搜索和DFS-ID迭代加深的深度优先搜索,它们:
- 不使用启发估计 启发式估计会搜索最有希望得到解的路径前进
- 目标是找出给定问题的解。
2.3.1 深度优先搜索 DFS
尽可能快地深入树中进行搜索,每当搜索方法可做出选择时,就选择最左(最右)分支。
3拼图问题 8层
2.3.2 广度优先搜索BFS
从树的顶部到底部,按从左到右(或从右到左)的方式,可逐层访问节点。
三拼图问题,4层
2.4 盲目搜索算法的实现和比较
2.4.1 深度优先搜索的实现
搜索算法的共同做法,维护2张表,openlist开放表和clsed list封闭表,开放表包含了所有待探索的节点,而封闭表中则包含了所有已探索和不再考虑的节点。DFS搜索过程用栈存放,后进先出(LIFO)。
2.4.2 广度优先搜索的实现
广度优先搜索用队列来表示开放表。队列是先进先出(FIFO)
2.4.3 问题求解性能的衡量指标
完备性(complete)
最优性(optimal)
时间复杂度(time complexity)关注找到解要花费的时间—可以根据搜索期间生成(或扩展)的节点数量来衡量时间。
空间复杂度(space complexity)关注内存开销,用三个参数表示:1)节点的分支因子(branching factor记为b),参数d是最浅目标节点的深度,参数m是状态空间中所有路径的最大长度。
2.4.4 DFS和BFS的比较
当1.树很深2.分支因子不太大。3.解出现在树中的位置相对较深时,优先DFS
当1.分支因子不太大2.解出现在树中位置在合理的深度3.所有的路径都不是特别深时优先BFS
DFS-ID 执行一个DFS算法,其状态空间的深度的界为0,若没找到目标就执行另一个DFS算法,此时深度的界为1。继续以此方式搜索,深度的边界都会增加1.
2.5 本章小结
生成-测试范式是解决问题的直接方式,生成器给出问题的可能解,测试器确定它们的有效性。好的生成器是完备、非冗余并且知情的。
完全枚举法是一种查看所有可能解来寻找解的搜索过程。
回溯法一旦发现一个部分违反了问题的约束条件,就放弃这个部分解,这样就缩短了搜索时间。
贪心算法在求解城市间最短路径的问题中非常有用,但不适用解决所有问题,如解决旅行商问题。
BFS在探索求解问题时,按层次遍历树,(在各种约束下)是完备和最优的;但空间需求的过量阻碍其发展;DFS有可能迷失在无限路径中,但DFS的空间需求相对合理,既不是完备的也不是最优的。DFS-ID执行的是一个完备的DFS搜索过程,具备DFS和BFS的优点,即DFS的中等存储空间需求以及BFS的完备性和最优性。