系列文章目录
搜索问题第一部分 无信息搜索与有信息搜索(启发式搜索)
搜索问题第二部分 约束满足问题(Constraint Satisfaction Problem)和局部搜索(Local Search)算法
搜索问题第三部分 对抗性搜索(Adversarial Search)和蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)
前言
搜索问题可以是一个很简单的问题,也可以是一个相对复杂的问题。本文是系列文章的第一篇,将介绍几种搜索问题的基础算法,如一致代价搜索(UCS)、A*搜索等,其中A*搜索比较重要。
在接下来的几篇文章中,我会介绍约束满足问题(Constraint Satisfaction Problem),这是一类状态具有结构的搜索问题,如八皇后问题;也会介绍一些局部搜索(Local Search)算法,比如经典的爬山法(Hill Climbing)、模拟退火算法(Simulated Annealing)、局部集束搜索(Local Beam Search)和遗传算法;在本系列文章的结尾,我会介绍对抗性搜索(Adversarial Search)和蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)。
一、搜索问题介绍
智能体(Agent)大体可以分为两种,反射型智能体和规划型智能体。反射型智能体只能根据它对于现状的认知(percept)做出一个单独的动作,而规划型智能体则会做出一系列的动作(a1,a2,a3,……)
(称作solution,解决方案)。要想知道究竟要采取哪些动作就需要用到搜索的方法。
一个抽象的搜索问题包含:
- 状态空间
S
- 初始状态s0
- 在每个状态可以采取的所有动作
A(s)
,s是状态空间中的一个状态。 - 转移模型
Result(s,a)
,s是当前状态,a是要采取的动作。 - 检测是否达到目标状态的函数
G(s)
- 动作代价
c(s,a,s')
,其中s是当前状态,a是将要采取的动作,s’是采取动作后转移到的新状态
二、无信息搜索:深度优先搜索DFS、广度优先搜索BFS、迭代加深搜索IDS与一致代价搜索UCS
这几种无信息搜索算法就是大家在算法课上学到的DFS
以及BFS
的本体或变种,它们都有树搜索和图搜索两个版本。
先介绍两个性质:完备性和最优性。完备性是指如果存在解决方案solution
,则算法保证可以找到;最优性是指算法保证可以找到花费最低的路径。
深度优先搜索DFS
:它的策略是优先扩张最深的节点,边缘集是一个LIFO后进先出的栈。
- 完备性:如果搜索图中不存在环,则可以保证找到解决方案(如果存在)。
- 最优性:没有最优性,不能保证获得代价最小的解决方案,
DFS
只能获得最“左”的路径。 - 复杂度:假设
b
是分支因子(每个父节点的孩子节点数),m
是最大深度,则有:
时间复杂度:O( bm )
空间复杂度:O( bm ),因为只有这条路径上的节点(b个)和它们的兄弟节点(每个节点有m-1个兄弟节点)加入了边缘集。
广度优先搜索BFS
:它的策略是优先扩张最浅的节点,边缘集是一个FIFO后进先出的队列。
- 完备性:BFS具有完备性。
- 最优性:如果每一条边的代价都相同,则可以找到最优解;如果不相同,则不能。
- 复杂度:假设
b
是分支因子(每个父节点的孩子节点数),d
是所有目标节点中的最小深度,则有:
时间复杂度:O( bd ),
空间复杂度:O( bd ).
迭代加深搜索IDS
:迭代加深搜索IDS
可以看作是DFS
或BFS
改进算法,它的目的是用DFS
的空间复杂度和BFS
的时间复杂度获得BFS
可以搜索到的最优解。
IDS
实现思路比较简单:在DFS
搜索外面套一个大循环,然后人为限制DFS的深度,如果在当前深度没有找到解,则让探索深度+1,再次执行DFS
,如此循环直到找到解。因为每次迭代都是执行