现实问题的形式化
基本概念
- 环境:一种静态、可观察、确定、离散的基础
状态:表达在环境中某位置
初始状态:起始时的状态 - 后继函数:从状态到状态
状态集合:从初始状态开始的后继函数闭包 - 目标状态集合
解:从初始状态到目标状态的路径
路径耗散:从初始状态到目标状态,在路径上的花费 - 无信息:无其他信息,搜索时只能通过后继索引结点,或判断当前状态是否达成目标
形式化要素
要建立状态、初始状态、后继函数、目标测试、路径耗散和实际问题中事物或要素的对应。
eg.寻径问题(爆搜最优解:明确任务,准备数据)
- 状态:各个地点
- 初始状态:初始地点
- 状态集合:从初始地点通过路径能到的所有地点
- 后继函数:状态集合中所有地点之间的路径
- 目标测试:判断当前地点是否在目的地集合中
- 路径耗散:按目前的路径驾驶,从初始状态到此状态的花费
(注意,这个花费不一定需要以带权路径的方式定义在路上,同样可以以类似的方式定义在状态上。我们只需要保证,只要当前的路径确定,路径耗散就能确定)
eg.八皇后问题(爆搜可行解,假设皇后一行一行摆)
- 状态:皇后摆放情况
- 初始状态:空棋盘
- 状态集合:所有可摆出,可行的皇后摆放情况
- 后继函数:从当前摆放情况映射到全体下一行可以摆放的位置
- 目标测试:判断当前是否已经摆放成功
- 路径耗散:没有(但是可以定义一个优先度,以辅助选择可行度高的分支)
- 特点:所有可行解位于同一层(第8层)
搜索求解的方法
AI中的问题经常不得不用爆搜解决:搜索结点树,保证所得解的路径耗散最小(或足够小)。
基本概念
完备性:在问题有解时,有限时间能找到解
最优性:能找到最优解
简单BFS(Breadth First Search)
每次扩展深度最小的结点之一(不选树枝,所有结点一排一排地来)
假设目标结点所在的深度为d,则对于每个状态有b个后继的理想的搜索树,需要搜索的结点个数达到b+⋯+bd=O(bd+1)b+\dots+b^d=O(b^{d+1})b+⋯+bd=O(bd+1);这些结点每个都要搜,而且需要同时保存在内存里,所以时间复杂度和空间复杂度都为O(bd+1)O(b^{d+1})O(bd+1),效率很低。
提高效率的方法:限制搜索层数(可能导致不完备),剪枝(不是无信息搜索)
代价一致搜索(Uniform Cost Search)
还是bfs,但每次扩展当前结点中路径消耗最低的结点
缺点:完备性需要每一步的耗散都是正的(零耗散会导致无限循环)
优点:可以相对快地找到相对好的解
如果辅助以限制层数、设计剪枝,搜索的工作量大大减小
复杂度:时间复杂度和空间复杂度是O(b⌈C∗/ϵ⌉)O(b^{\lceil C^*/\epsilon \rceil })O(b⌈C∗/ϵ⌉),其中C∗C^*C∗是最优解的耗散值,ϵ\epsilonϵ是单步最小耗散值;这种情况对应找到最优解之前探索了一整颗耗散很小的步骤组成的很大的树。
在有信息搜索中,可以引入树枝的选择策略(启发函数,etc.),这让我们在过程中尽快找到解,找到的解尽量较优,从而在过程中更快地找到最优解:
- 针对找到一个可行解或限制时间求尽量优解的问题(相当于放宽完备性的最优解问题),选择策略能直接提高效率,因为较优的分支先被验证
- 对于严格求最优解的问题,选择策略主要是能剪掉更多的枝,从而间接提高效率
简单DFS(Depth First Search)
尽量向深扩展,到叶子之后回溯到还有未扩展后继的父结点,继续向深处扩展
优点:省空间,只需要存储bm+1bm+1bm+1个结点,空间复杂度为O(bm)O(bm)O(bm),m是树的高度
另外,算法可以递归地描述
缺点:时间复杂度为O(bm)O(b^m)O(bm),m有可能很大,甚至达到无穷
在搜索空间规模无法确定,或解的深度无法确定时,dfs可能会很慢,甚至找不到最优解
深度有限搜索(DLS, Depth Limited Search)
dfs+深度不能超过l
时间复杂度O(bl)O(b^l)O(bl),空间复杂度O(bl)O(bl)O(bl)
缺点:可能找不到最优解(不完备)
迭代深入DFS(Iterative Deepening Search)
从深度限制为0开始,每次增加深度限制并做一次深度有限搜索(DLS),直到找到目标解;搜索下一层之前,所有上层结点都已经搜过
时间复杂度O(bd)O(b^d)O(bd),空间复杂度O(bd)O(bd)O(bd),其中ddd是最浅的目标结点的深度(深度达到ddd时找到符合题目要求的目标结点)
优点:完备性、最优性和BFS标齐(因为过程类似),空间复杂度和DFS标齐
上层结点的重复搜索虽有浪费,但是在数量级上没有改变
双向搜索(Bidirectional Search)
一个从初始状态、一个从目标状态搜索
优点:降时间复杂度
时间复杂度和空间复杂度都为O(bd/2)O(b^{d/2})O(bd/2)(两个bd/2b^{d/2}bd/2相加)
要求祖先可以有效地计算,而且状态集合不能太大(总之就是要求实际上可行)
无信息搜索策略的总结
单纯看指标,基于BFS和DFS的算法都是指数时间复杂度。
BFS的特长:BFS是图搜索的基础(DFS树搜索那种一找到底显然不适合),而且有信息时BFS实际比较有利于剪枝。
DFS的特长:在空间复杂度上DFS比较占优势(线性),这其中又以迭代深入为最,可以在额外时间不太多的情况下节省大量空间。
本文主要参考《人工智能:一种现代的方法(第2版)》。