搜索问题
- 状态空间
- 初始状态
- 动作
- 转移模型:将状态和动作映射为一个结果状态
- 目标状态
- 动作代价
一个动作序列形成一条路径,解是一条从初始状态到某个目标状态的路径,最优解是所有解中路径代价最小的解
搜索算法
- 扩展节点:考虑该状态的可用动作,使用结果函数查看这些动作指向何处,并为每个结果状态生成一个新节点,称为子节点或后继节点
- 边缘节点(搜索树的边界):未被扩展的节点
- 已达状态:任何已经生成过的节点
不断从边缘节点中选择节点并扩展,直到到达目标状态,或者没有状态可以扩展
树搜索算法
图搜索算法
搜索策略的主要区别在于如何选择要扩展的状态
搜索算法性能评估
- 完备性
- 最优性
- 时间复杂度
- 空间复杂度
符号 | 含义 |
---|---|
b | 分支因子,即搜索树中每个节点最大的分支数目 |
d | 根节点到最浅的目标结点的路径长度 |
m | 搜索树中路径的最大可能长度 |
n | 状态空间中状态的数量 |
无信息搜索
宽度优先搜索(BFS)
先扩展根节点,接着扩展根节点的所有后继节点,然后再扩展后继节点的后继,以此类推
- 完备性:
True
- 最优性:
True 对于所有动作代价相同的问题
宽度优先搜索总能找到一个动作最少的解 - 时间复杂度: 1 + b + b 2 + b 3 + ⋯ + b d = O ( b d ) 1+b+b^2+b^3+\dots+b^d=O(b^d) 1+b+b2+b3+⋯+bd=O(bd)
- 空间复杂度: O ( b d ) O(b^d) O(bd)
深度优先搜索(DFS)
总是优先扩展边缘节点中最深的节点
- 完备性:
False
对于树型的有限状态空间,算法是有效且完备的。在有环状态空间,算法可能陷入无限循环;在无限状态空间,可能陷入无限路径 - 最优性:
False
它会返回它找到的第一个解,即使这个节不是路径代价最小的 - 时间复杂度: O ( b m ) O(b^m) O(bm)
- 空间复杂度: O ( b m ) O(bm) O(bm) 只需要存储一条从根节点到叶子节点的路径,以及该路径上每个节点的所有未被扩展的兄弟节点
迭代加深的深度优先搜索
对于许多状态空间,大多数节点位于底层,所以上层是否重复并不重要。在迭代加深搜索中,底层(深度d)的节点被生成一次,倒数第二层的节点被生成两次,以此类推,一直到根节点的子节点(生成d次)。在最坏情况下生成的节点总数是 N ( I D S ) = ( d ) b 1 + ( d − 1 ) b 2 + ⋯ + b d N(IDS)=(d)b^1+(d-1)b^2+\dots+b^d N(IDS)=(d)b1+(d−1)b2+⋯+bd
- 完备性:
True
- 最优性:
True 对于所有动作代价相同的问题
- 时间复杂度: O ( b d ) O(b^d) O(bd)
- 空间复杂度: O ( b d ) O(bd) O(bd)
一致代价搜索
评价函数为从根到当前节点的路径的代价
C ∗ C^{*} C∗ 是最优解的代价, ϵ \epsilon ϵ 是每个动作代价的下界
- 完备性:
True
一致代价搜索会按照代价递增的顺序系统地考虑所有的路径,而不会陷入一直沿单一无限路径探索的困境(假设所有动作的代价 ≥ ϵ > 0 \geq\epsilon>0 ≥ϵ>0) - 最优性:
True
它找到的第一个解的代价至少与边缘节点上的任何其他节点的代价一样小 - 时间复杂度:
O
(
b
1
+
⌊
C
∗
/
ϵ
⌋
)
≫
b
d
O(b^{1+\lfloor{C^ * /\epsilon}\rfloor})\gg {b^d}
O(b1+⌊C∗/ϵ⌋)≫bd
一致代价搜索在探索包含一个可能有用的高代价动作的路径之前,可能会先探索具有低代价动作的大型树。当所有动作代价相同时, b 1 + ⌊ C ∗ / ϵ ⌋ = b 1 + d {b^{1+\lfloor{C^ * /\epsilon}\rfloor}= b^{1+d}} b1+⌊C∗/ϵ⌋=b1+d - 空间复杂度: O ( b 1 + ⌊ C ∗ / ϵ ⌋ ) O(b^{1+\lfloor{C^{*}/\epsilon}\rfloor}) O(b1+⌊C∗/ϵ⌋)
启发式搜索
贪婪搜索
策略:每一步均扩展距离目标状态更近的节点
启发式信息:估计当前状态距离目标状态的距离
- 完备性:
False
可能陷入无限循环 - 最优性:
False
- 时间复杂度: O ( b m ) O(b^m) O(bm) 如果有好的启发式函数,复杂度可以有效降低
- 空间复杂度: O ( b m ) O(b^m) O(bm)
$A^{*} $ 搜索
评价函数:
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f(n)=g(n)+h(n)
f(n)=g(n)+h(n)
g
(
n
)
=
g(n)=
g(n)= 从初始状态到节点
n
n
n 的路径代价
h
(
n
)
=
h(n)=
h(n)= 从节点
n
n
n 到一个目标状态的最短路径的代价估计值
f
(
n
)
=
f(n)=
f(n)= 经过
n
n
n 到一个目标状态的最优路径的代价估计值
完备性:
在一些常见的搜索问题中,状态数量是有限的,此时图搜索 $A^* $ 算法和排除环路的树搜 $A^* $ 算法均是完备的,即一定能够找到一个解
在更普遍的情况下,如果所求解问题和启发函数满足以下条件,则 A ∗ A^* A∗ 算法是完备的:
- 搜索树中分支数量是有限的,即每个节点的后继结点数量是有限的
- 单步代价的下界是一个正数
- 启发函数有下界
最优性:
可采纳性: 对于任意节点 n n n,有 h ( n ) ≤ h ∗ ( n ) h(n)\leq h^{*}(n) h(n)≤h∗(n)
定理:如果启发函数是可采纳的,那么树搜索的 A ∗ A^{*} A∗ 算法满足最优性
假设:
- A A A 是最优的目标节点
- B B B 是次优的目标节点
- 启发函数是可采纳的
证明:
- 假设 B B B 位于边缘集
- A A A 的某个父节点 n n n 也在边缘集
- 那么, n n n 比 B B B 更早被扩展
- f ( n ) ≤ f ( A ) f(n)\leq f(A) f(n)≤f(A)
f ( n ) = g ( n ) + h ( n ) ≤ g ( n ) + h ∗ ( n ) = g ( A ) = f ( A ) f(n)=g(n)+h(n)\leq g(n)+h^{*}(n)=g(A)=f(A) f(n)=g(n)+h(n)≤g(n)+h∗(n)=g(A)=f(A)- f ( A ) < f ( B ) f(A)<f(B) f(A)<f(B)
f ( A ) = g ( A ) < g ( B ) = f ( B ) f(A)=g(A)<g(B)=f(B) f(A)=g(A)<g(B)=f(B)- f ( n ) ≤ f ( A ) < f ( B ) f(n)\leq f(A)< f(B) f(n)≤f(A)<f(B)
- 所有节点 n n n 都比 B B B 更早被扩展,所以 A A A 比 B B B 更早被扩展
一致性: 对于每个节点 n n n 和由任一动作 a a a 生成的 n n n 的每个后继节点 n ′ n' n′,有 h ( n ) ≤ c o s t ( n , a , n ′ ) + h ( n ′ ) h(n)\leq cost(n,a,n')+h(n') h(n)≤cost(n,a,n′)+h(n′)
一致性的启发式函数都是可采纳的
定理:如果启发函数满足一致性,那么图搜索的 A ∗ A^{*} A∗ 算法满足最优性
启发式函数
松弛问题:减少了对动作的限制条件的问题
松弛问题的状态空间图是原始状态空间的一个超图,因为删除限制条件会导致原图中边的增加
松弛问题中最优解的代价可以作为原问题的一个可采纳的启发式函数:原问题的任一最优解也是松弛问题的一个解,因为松弛问题向状态空间图中添加了一些边,如果增加的边提供了捷径,松弛问题可能有更好的解
该启发式函数是一致的:得到的启发式函数是松弛问题的准确代价,一定满足三角不等式
有效分支因子(一种描述启发式函数质量的方法):
针对一个特定问题,
A
∗
A^*
A∗ 搜索生成的总节点数为
n
n
n,而解的深度为
d
d
d,那么
b
b
b 就是深度为
d
d
d 的均衡树要包含
n
+
1
n+1
n+1 个节点所必需的分支因子,有
n
+
1
=
1
+
b
∗
+
(
b
∗
)
2
+
⋯
+
(
b
∗
)
d
n+1=1+b^*+(b^*)^2+ \dots +(b^*)^d
n+1=1+b∗+(b∗)2+⋯+(b∗)d
对抗搜索
双人零和博弈:信息确定、全局可观察、竞争对手轮流行动、输赢收益零和
Two-Step Game: m a x j m i n i U ( i , j ) ≤ m i n i m a x j U ( i , j ) \underset{j}{max} \underset{i}{ min}U(i,j)\leq \underset{i}{min}\underset{j}{ max}U(i,j) jmaximinU(i,j)≤iminjmaxU(i,j)
最优策略
给定博弈树,可以通过计算树中每个状态的极小化极大值确定最优策略。某一状态的极小化极大值是指,假设从该状态到博弈结束两个参与者都以最优策略行动,到达的终止状态对于 M A X MAX MAX 的效用值,终止状态的极小化极大值就是它的效用值
M i n m a x ( s ) = { U t i l i t y ( s , M A X ) I f I s − T e r m i n a l ( s ) m a x a ∈ A c t i o n s ( s ) M i n i m a x ( R e s u l t ( s , a ) ) I f T o − M o v e ( s ) = M A X m i n a ∈ A c t i o n s ( s ) M i n i m a x ( R e s u l t ( s , a ) ) I f T o − M o v e ( s ) = M I N Minmax(s)= \begin {cases} Utility(s, MAX) &If\quad Is-Terminal(s) \\\\ max_{a \in Actions(s)}Minimax(Result(s,a)) & If \quad To-Move(s)=MAX \\\\ min_{a \in Actions(s)}Minimax(Result(s,a)) &If\quad To-Move(s)=MIN \end{cases} Minmax(s)=⎩ ⎨ ⎧Utility(s,MAX)maxa∈Actions(s)Minimax(Result(s,a))mina∈Actions(s)Minimax(Result(s,a))IfIs−Terminal(s)IfTo−Move(s)=MAXIfTo−Move(s)=MIN
极小化极大搜索算法
- 时间复杂度: O ( b m ) O(b^m) O(bm)
- 空间复杂度: O ( b m ) O(bm) O(bm)
α − β \alpha -\beta α−β 剪枝
α
\alpha
α :目前为止路上发现的
M
A
X
MAX
MAX 的最佳(即极大值)选择
β
\beta
β :目前为止路上发现的
M
I
N
MIN
MIN 的最佳(即极小值)选择
- 对于 M A X MAX MAX 节点,如果其子节点的收益大于当前的 α \alpha α 值,则将 α \alpha α 值更新为该收益
- 对于 M I N MIN MIN 结点,如果其子节点的收益小于当前的 β \beta β 值,则将 β \beta β 值更新为该收益
- 根结点( M A X MAX MAX 结点)的 α \alpha α 值和 β \beta β 值分别被初始化为 + ∞ +\infty +∞ 和 − ∞ -\infty −∞
随着搜索算法不断被执行,每个节点的 α \alpha α 值逐渐增加, β \beta β 值逐渐减少,如果一个节点的 α \alpha α 值和 β \beta β 值满足 α > β \alpha > \beta α>β 的条件,则该结点尚未被访问的后续结点就会被剪枝,即不会被智能体访问
启发式 α − β \alpha -\beta α−β 树搜索
为了充分利用有限的计算时间,我们可以提前截断搜索,并对状态应用启发式评价函数(对状态效用值进行估计),从而有效地将非终止节点转变为终止节点
大多数评价函数需要计算状态的各种特征
加权线性函数: E v a l ( s ) = w 1 f 1 ( s ) + ⋯ + w n f n ( s ) Eval(s)=w_1f_1(s)+\dots +w_nf_n(s) Eval(s)=w1f1(s)+⋯+wnfn(s) ( w i w_i wi 表示权重, f i f_i fi 是某个特征)
蒙特卡洛树搜索
状态值根据从该状态开始的多次完整博弈模拟的平均效用值估算
资源是有限的,选择更有希望的节点进行模拟
多臂老虎机
赌博机有 K K K 个摇臂,每次转动一个赌博机摇臂,赌博机则会随机吐出一些硬币,如何在有限次数的尝试中使收益最大化
ϵ − \epsilon- ϵ−贪心算法:在探索与利用之间进行平衡的搜索算法
在第 t t t 次,以 1 − ϵ 1-\epsilon 1−ϵ 的概率,选择在过去 t − 1 t-1 t−1 摇动赌博机所得平均收益最高的摇臂进行摇动;以 ϵ \epsilon ϵ 的概率随机选择一个摇臂进行摇动
不足:没有考虑每个摇臂被探索的次数
上限置信区间算法
为每个动作的奖励期望计算一个估计范围,优先采用估计范围上限较高的动作
假设每个摇臂的均值为 Q ( k ) Q(k) Q(k),估计的偏差为 δ ( k ) \delta(k) δ(k),每次根据 Q ( k ) + δ ( k ) = Q ( k ) + 2 l n T T k Q(k)+\delta(k)=Q(k)+2ln\sqrt{T\over T_k} Q(k)+δ(k)=Q(k)+2lnTkT 选择摇臂