无信息搜索算法:算法除了问题定义本身没有任何其他信息,如:广度优先搜索、深度优先搜索、深度受限搜索等。
有信息(启发式)搜索算法:利用给定的知识引导,便于更有效地找到解,如贪婪最佳优先搜索、A*搜索等。
0 问题求解 Agent
问题求解类的 Agent 是一种 基于目标(goal-based)类的 Agent。
Offline problem solving:Agent 在执行计划的时是 "eyes closed" 的,它很清楚行动的后果是什么。
Online problem solving:Agent 是在信息不完备的状态下执行的。
1 问题形式化
我们对现实中的问题进行抽象化表示,包括对状态描述抽象、对行动抽象。保持有效抽象的前提下去除尽可能多的细节和确保抽象后的行动容易完成。
例如:对于 8-数码 问题,我们可以这样形式化。
2 树搜索算法
基本思想:通过 生成 已经探索过的状态(扩展状态)的后继节点,离线模拟探索状态空间。
对于树中的每个节点,我们定义四个属性:
- n.State:对应状态空间中的状态
- n.Parent:搜索树中产生该节点的父节点
- n.Action:父节点生成该节点时所采取的行动
- n.Path-Cost:代价
当我们去评估一个问题求解算法的性能的时候从以下四个角度出发:
- 完备性:当问题有解时,是否能保证找到解?
- 最优性:搜索策略能否找到问题的最优解?
- 时间复杂度:找到解需要花费多长时间?
- 空间复杂度:在执行搜索的过程中需要多少内存?
3 无信息搜索策略
Uninformed search strategies use only the information available in the problem definition.
3.1 Breadth-First search
广度优先搜索(宽度优先搜索):先扩展根节点,接着扩展根节点的所有后继,然后再扩展他们的后继。每次总是扩展最浅的节点。
BFS可以使用队列实现,将边缘组织成FIFO的队列。
完备性:是完备的
时间复杂度:1+ b + b2 + b3 +… +bd + b(bd-1) = O(bd+1) (在检查到d层上的最后一个节点之前,其他节点已经被扩展)
空间复杂度:O(b的 d+1次方)
最优性:是最优的
3.2 Uniform-cost search
一致代价搜索:扩展路径消耗最小的节点n。这里可以通过将边缘节点组织成 按照路径代价的值排序的队列 来实现。
一致代价搜索对解路径的步数并不关心,只关心路径总代价。因此,如果 存在零代价的行动就可能陷入死循环。如果每一步的代价都是非零正值常数,则一致代价搜索是完备的。
3.3 Depth-first search
深度优先搜索:总时扩展搜索树当前边缘节点集中最深的节点。
深度优先搜索可以使用栈来实现。
3.4 Depth-limited search
深度受限搜索:避免无限状态空间深度优先搜索会一直迭代。我们把深度为 L 的节点当作没有后继对待。
3.5 Iterative deeping search
迭代加深的深度优先搜索:是在深度受限搜素的基础上,为了保证搜索的完备性而提出的方法。不断地增大深度限制,直至找到目标。
3.6 Summary
针对以上无信息搜索算法总结如下:
4 有信息(启发式)搜索
4.1 Greedy best-first search
贪婪最佳优先搜索:试图扩展离目标最近的节点,它对每个节点进行评估,提供启发式信息。
Evaluation function f(n) = h(n) (heuristic) = estimate of cost from n to goal
4.2 A* search
A* 搜索:它对节点的评估结合了 g(n) 和 h(n)。其中 g(n) 是到达此节点已经花费的代价,h(n) 是从该节点到达目的节点所花的代价。即 f(n) = g(n) + h(n)。
4.3 保证最优性的条件:可采纳性和一致性
保证最优性的第一个条件是 h(n) 是一个 可采纳启发式(Admissible heuristics)。可采纳启发式是指 它从来不会过高估计到达目标的代价。因为 g(n) 是当前路径到达节点 n 的实际代价,而 f(n) = g(n) + h(n),因此,f(n) 永远不会高于经过节点 n 的解的实际代价。
保证最优性的第二个条件是 一致性,只作用于图搜索中使用 A* 算法。对于每个节点 n 和通过任一行动 a 生成的 n 的每个后继节点 n',从节点 n 到达目标的估计不大于 n 到达 n' 的单步代价与从 n' 到达目标的估计代价之和:h(n) ≤ c(n, a, n') + h(n')
4.4 启发式函数比较:占优
h2 比 h1 占优势:对于任意节点 n,有 h2(n) ≥ h1(n)。