回到总目录可以点击索引文导航。
3.1 问题求解Agent
- 当问题求解不能通过单个行动完成时,就需要通过搜索完成。搜索即是指从问题出发寻找解的过程。
- 问题求解Agent是基于目标的Agent中的一种。
- 问题求解的步骤:目标形式化(即简化目标)、问题形式化(环境形式化,即简化问题/环境)、搜索(找出几个可行的行动序列)、执行。这里对目标形式化和执行不做说明。
- 这一章的环境是可观察的、确定的、已知的。
3.2 问题形式化
- 问题的组成部分:状态空间(初始状态、可能行动、转移模型(执行行动后的状态))、目标测试(确定当前状态是不是目标状态)、路径耗散函数(例如图中的边权)。
- 问题的形式化:抽象化(去除描述的细节、去除行动的细节)。
3.3 搜索算法
3.3.1 搜索算法基础
- 每个结点的数据结构:状态、父结点、父结点生成该结点的行动、代价。
- 任何算法的性能度量:完备性(是否能找到解)、最优性(是否能找到最优解)、时间复杂度、空间复杂度。
- 状态空间的复杂度常用度量因子:b(分支因子,任何结点的最多后继数)、d(达成目标的最浅深度)、m(任何路径的最大长度)。
- 时间复杂度由搜索过程中产生的结点数来度量,空间复杂度由内存中存储的最多结点数来度量。
- 搜索算法的有效性:搜索代价(例如搜索花费的时间)、解代价(例如到达目的地的总路程)。
3.3.2 无信息搜索策略
无信息搜索指的是除了问题定义中提供的状态信息外没有任何附加信息。
3.3.2.1 广度优先搜索(breadth-first search)
- 先扩展根节点,再扩展根节点的所有后继,再扩展它们的后继,以此类推。
- 队列逻辑结构比较适合存储边缘结点。
- 是完备的,但不一定是最优的。完备是由于结点是有限的,不是最优的是由于最浅的目标结点不一定是最优的目标结点,当搜索到最浅的之后就不会继续搜索了。
- 时间复杂度和空间复杂度都由边缘结点集的大小决定。对于深度为d的一致树(每个状态都有b个后继),两个复杂度的值为 。一般来讲,指数级别复杂度的搜索问题不能用无信息的搜索算法求解,除非是规模很小的实例。
- 当每一步的行动代价都相等时,广度优先搜索是最优的。
- 在生成结点时目标检测。
3.3.2.2 一致代价搜索(uniform-cost search)
- 扩展路径消耗 最小的结点 。
- 将边缘结点按g值排序的优先级队列来实现。
- 当若该状态已经在边缘结点中且发现了更小代价的路径时,将该边缘结点替换为该新路径的边缘结点。
- 在结点选择扩展时目标检测。
- 是最优的。若路径代价都为正数,则该搜索策略是完备的。当有代价为负或0时,搜索可能陷入死循环。
- 假设 为最优解的代价, 为最小的行动代价,那么最坏情况的时间复杂度和空间复杂度为 。
- 该算法会检查目标算法的所有结点,显然在一些情况下做了更多无意义的事。
3.3.2.3 深度优先策略(depth-first search)
- 栈逻辑结构比较适合存储边缘结点。
- 总是扩展搜索树的当前边缘结点集中最深的结点。当结点扩展完后就从边缘结点去除。
- 在生成结点时目标检测。
- 不是最优的。
- 在避免重复和冗余路径的图或树中是完备的。
- 可用递归实现搜索。
- 时间复杂度上来说和广度优先搜索差差不多,但在空间复杂度上就简单很多,为 ,原因是搜索完一颗子树后就会删除。
- 一个变形是回溯搜索(backtracking search),每次只产生一个后继而不是所有后继,空间复杂度为 。
- 可以限制深度,称为深度受限搜索(depth-limited search)。另外可以通过逐渐加深深度界限来找到最好的深度界限,这种策略称为迭代加深的深度优先搜索(iterative deepening search)。
- 与一致代价搜索策略结合,可以得到迭代加长搜索(iterative lengthening search),其主要思想是用不断增加的路径代价界限代替不断增加的深度界限。不过这种算法会带来实在的额外开销。
3.3.2.4 双向搜索(bidirectional search)
- 双向搜索的思想是同时运行两个搜索——一个从初始状态向前搜索,另一个从目标状态向后搜索,当两个搜索的边缘交集不为空时就找到了一个解。
- 难点在于向后搜索,目标若不为具体描述则难以实现双向搜索。
3.3.3 有信息搜索策略
知道一个非目标状态是否比其它状态更有希望接近目标的策略称为有信息搜索策略或启发式搜索策略。该信息就是代价函数 ,被看作是特殊的代价估计,因此评价值最低的结点被扩展,这与一致代价搜索类似,不过一个是g(实际走过路径的代价)一个是f(剩余代价估计)。
3.3.3.1 贪婪最佳优先搜索
- 采用某种启发函数作为代价函数,即 。
- 优先扩展启发函数最小的结点。
- 效率取决于启发函数。
- 不完备不最优。
- 它不是最优的但效率较高。
3.3.3.2 A*搜索:缩小总评估代价
- ,除了启发函数还加入了路径代价(即已经花费的代价)。
- 既完备也最优。保障最优性的第一个条件是可采纳性(或者说是可采纳启发式),即当前的代价函数为已经走过的路径的代价加上剩余代价估计,而这个剩余代价估计(例如两点之间的直线距离)通常比实际剩余代价(例如实际两点之间的距离)小,这样的搜索自然是乐观的。第二个条件是一致性(或单调性),即搜索算法满足三角不等式 , 为结点n通过行动a的后继结点,c为路径代价,由于满足这个性质,故 单调不减并逐渐逼近真实代价。
- 尽管该策略看起来很好,但复杂度依然与深度呈指数增长。
3.3.3.3 存储受限的启发式搜索
-
迭代加深A*算法(IDA*):融入了迭代加深思想,截断值取上一次迭代不扩展的结点中最小的f值。
-
递归最佳优先搜索(RBFS):如其名,在A*搜索中融入了递归元素。如下图所示,该算法只需要线性的存储空间来存储f_limit即可。不过这种算法不适合图,冗余的路径会带来复杂度指数级的增长。
-
内存受限A*(MA*)和SMA*(简化版MA*):上面两个算法的内存使用的太少了,容易忘了曾经搜索过的地方。于是产生了MA*算法,这里我们只讨论简化版的SMA*。该算法的思想就是在加入新结点时就要抛弃一个最差的旧结点。
3.3.3.4 学习以促搜索
可以利用学习避免不必要的搜索步骤,学习的目标是减小问题求解的总代价,在计算开销和路径代价之间取得最佳性价比。
3.3.4 启发式函数
启发式搜索算法的性能取决于启发式函数的质量。好的启发式可以通过松弛问题的定义、子问题的解、经验学习得到。
3.4 习题和参考答案
-
为什么问题的形式化要在目标的形式化之后?
参考答案:
问题形式化也叫环境形式化,若不先对目标形式化的话,则环境错综复杂难以选择需要的或者说是关键的要素。 -
略
-
参考答案:
a. 状态空间:所有可能的城市对 。转移函数: 表示x转移到i,y转移到j。目标测试: 。路径耗散函数:
b. (iii)是可采纳的,另外两个在最好的情况(两人之间的城市直线相连,且距离相等)不是可采纳的。
c. 有,例如只有两个点和一条边的图,两个人会一直互换位置。
d. 是的:在(c)中向任何一个节点添加一个自循环。如果朋友们开始相隔奇数步,其中一个朋友进行自循环的移动将使问题得以解决。 -
略
-
-
略
-
略
-
略
-
参考答案:
这显然是错误的,如果把树压缩成深度为1,那显然违背了求解问题的本质,求解问题是为了得到一组行动序列,而这些行动都是不可再抽象化的。 -
略
-
参考答案:
a. 错误:幸运的DFS可能会精确地扩展d个节点以达到目标。而A*在保证找到最优解的任何图搜索算法中占很大的优势。
b. 正确:h(n)=0总是一个可采纳的启发式,因为代价是非负的。
c. 错误:A*搜索通常用于机器人;空间可以离散化或骨架化。
d. 正确:解决方案的深度对于广度优先搜索才是关键。不是成本。
e. 错误:在中途没有棋子的情况下,曼哈顿距离 实际距离。 -
略
-
略
-
找出一个状态空间,使用迭代加深搜索比深度优先搜索的性能要差很多(如,一个是 另一个是 )。
参考答案:
考虑b=1的情况,若解在深度d,则会有这个情况发生。 -
略
-
略