一,问题求解的搜索算法
定义:
b
b
b:分支数(可能为无穷)
d
d
d:最优解的深度(一定存在)
m
m
m:搜索树的最大深度(可能为无穷)
(一)无信息搜索:
1. 宽度优先搜索( B F S BFS BFS)
(1)时间复杂度:
O
(
b
d
)
O(b^d)
O(bd)
(2)空间复杂度:
O
(
b
d
)
O(b^d)
O(bd)
(3)完备性:是(当且仅当b是有限的)
(4)最优性:是(当且仅当单步代价相同)
2. 一致最优代价搜索( U C S UCS UCS)(即 D i j k s t r a Dijkstra Dijkstra算法)
引入单步代价,每次扩展一个代价最小的节点(注意:搜索到某一结点但不一定扩展它,只有当它是当前所有未扩展结点中代价最小时才扩展),第一次被扩展的节点一定是最优解。
(当单步代价相同时,该算法退化为宽度优先搜索)
(1)时间复杂度:
O
(
b
m
)
O(b^m)
O(bm)
(2)空间复杂度:
O
(
b
m
)
O(b^m)
O(bm)
(3)完备性:是(当且仅当
b
b
b是有限的,且单步代价
⩾
ϵ
\geqslant \epsilon
⩾ϵ )
(4)最优性:是
3. 深度优先搜索( D F S DFS DFS)
(1)时间复杂度:
O
(
b
m
)
O(b^m)
O(bm)
(2)空间复杂度:
O
(
b
m
)
O(bm)
O(bm)
(3)完备性:否(因为
m
m
m可能为无穷)
(4)最优性:否
4. 深度受限搜索( D L S DLS DLS)
定义深度界限
l
l
l,避免
D
F
S
DFS
DFS面对
m
m
m过大时无法终止。(
D
F
S
DFS
DFS即
l
l
l为无穷大的
D
L
S
DLS
DLS)
(1)时间复杂度:
O
(
b
l
)
O(b^l)
O(bl)
(2)空间复杂度:
O
(
b
l
)
O(bl)
O(bl)
(3)完备性:否(如果
l
<
d
l<d
l<d)
(4)最优性:否
5. 迭代加深的深度优先搜索( I D S IDS IDS)
避免
D
L
S
DLS
DLS出现
l
<
d
l<d
l<d的情况,如果未找到目标节点则增大
l
l
l。
(1)时间复杂度:
O
(
b
d
)
O(b^d)
O(bd)
(2)空间复杂度:
O
(
b
d
)
O(bd)
O(bd)
(3)完备性:是(当且仅当
b
b
b是有限的)
(4)最优性:是(当且仅当单步代价相同)
6. 双向搜索
从初始状态和目标状态同时用
B
F
S
BFS
BFS搜索,如果出现交集则说明找到了一个解(可以用常数时间检查该解是不是最优)
(有一些问题的目标节点并不容易找到,面对这类问题下双向搜索不适用)
(1)时间复杂度:
O
(
b
d
/
2
)
O(b^{d/2})
O(bd/2)
(2)空间复杂度:
O
(
b
d
/
2
)
O(b^{d/2})
O(bd/2)
(3)完备性:是(当且仅当
b
b
b是有限的)
(4)最优性:是(当且仅当单步代价相同)
(二)有信息(启发式)搜索
定义:考虑
n
n
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):选择扩展结点的依据(即当前节点中
f
(
n
)
f(n)
f(n)最小的被扩展)
1. 贪婪最佳优先搜索
令
f
(
n
)
=
h
(
n
)
f(n)=h(n)
f(n)=h(n),即每次只使用启发式信息寻找下一个扩展节点。
(1)时间复杂度:
O
(
b
m
)
O(b^m)
O(bm)
(2)空间复杂度:
O
(
b
m
)
O(b^m)
O(bm)
(3)完备性:否(如果出现环则搜索可能不会终止)
(4)最优性:否
2. A ∗ A^* A∗搜索
A
∗
A^*
A∗算法会扩展所有
f
(
n
)
<
C
∗
f(n)<C^*
f(n)<C∗的节点,不会扩展任何
f
(
n
)
>
C
∗
f(n)>C^*
f(n)>C∗的节点
(1)时间复杂度:
O
(
b
ϵ
d
)
O(b^{\epsilon d})
O(bϵd)(知道是指数级即可)
(2)空间复杂度:指数级
(3)完备性:是
(4)最优性:是
总结:
A
∗
A^*
A∗算法理论上是效率最优的(即没有其他算法能保证扩展节点少于
A
∗
A^*
A∗算法),但不代表
A
∗
A^*
A∗算法就是我们想要的,因为实际应用中
A
∗
A^*
A∗算法的指数级复杂度是无法接受的。可以尝试降低对解最优性的要求或者设计更好的启发式函数改进算法。
(以下部分符号含义: n 0 n_0 n0表示初始节点, n s n_s ns表示目标节点, h ∗ ( n ) h^{*}(n) h∗(n)表示 n n n到目标节点的实际最小代价, C ∗ C^* C∗表示初始节点到目标节点的最小代价)
令
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f(n)=g(n)+h(n)
f(n)=g(n)+h(n),定义:
(1)可采纳性:称
h
(
n
)
h(n)
h(n)是可采纳的,若
h
(
n
)
h(n)
h(n)永远不会高过
n
n
n到目标节点的实际最小代价
h
∗
(
n
)
h^{*}(n)
h∗(n)
(2)一致性(单调性):称
h
(
n
)
h(n)
h(n)是一致的,若
n
′
n'
n′为
n
n
n的后继扩展节点且满足
h
(
n
)
⩽
c
(
n
,
a
,
n
′
)
+
h
(
n
′
)
h(n)\leqslant c(n,a,n')+h(n')
h(n)⩽c(n,a,n′)+h(n′)
(
a
a
a为任意从
n
n
n到
n
′
n'
n′的路径)
(1)可采纳性适用于 A ∗ A^* A∗的树搜索;一致性适用于 A ∗ A^* A∗的图搜索)
(2)树搜索允许重复访问同一节点;图搜索不允许重复访问同一节点)
-
A ∗ A^* A∗图搜索的最优性(基于一致性):
证明:(1)先证 f ( n ) f(n) f(n)在任何路径上都是非递减的:
设 n ′ n' n′为 n n n的后继节点,则
f ( n ′ ) = g ( n ′ ) + h ( n ′ ) = g ( n ) + c ( n , a , n ′ ) + h ( n ′ ) ⩾ g ( n ) + h ( n ) = f ( n ) f(n')=g(n')+h(n')=g(n)+c(n,a,n')+h(n')\\ \geqslant g( n)+h(n)=f(n) f(n′)=g(n′)+h(n′)=g(n)+c(n,a,n′)+h(n′)⩾g(n)+h(n)=f(n)
(2)再证当节点 n n n被扩展时,说明已经找到从初始节点 n 0 n_0 n0到节点 n n n的最优路径:
反证法:若不然,由图的分离性质知(见图1),在从 n 0 n_0 n0到 n n n的最优路径上必存在某一边缘节点 n ′ n' n′。由(1)知 f ( n ) f(n) f(n)在任何路径都是非递减的,所以 f ( n ) < f ( n ′ ) f(n) < f(n') f(n)<f(n′),故 n ′ n' n′会先于 n n n被选择,这与 n ′ n' n′是边缘节点矛盾。 -
A ∗ A^* A∗树搜索的最优性(基于可采纳性):
证明:记最优节点为 G G G,假设存在一个次优节点 G ′ G' G′。要证 G G G先于 G ′ G' G′被扩展,只要证从初始节点到 G G G的任意节点 n n n都先于 G ′ G' G′被扩展即可。
已知 h ( n ) ⩽ h ∗ ( n ) h(n)\leqslant h^{*}(n) h(n)⩽h∗(n); g ( G ) ⩽ g ( G ′ ) g(G)\leqslant g(G') g(G)⩽g(G′),则
f ( n ) = g ( n ) + h ( n ) ⩽ g ( n ) + h ∗ ( n ) = g ( G ) ⩽ g ( G ′ ) = f ( G ′ ) f(n)=g(n)+h(n)\leqslant g(n)+h^{*}(n)=g(G)\leqslant g(G')=f(G') f(n)=g(n)+h(n)⩽g(n)+h∗(n)=g(G)⩽g(G′)=f(G′)
故 n n n总是先于 G ′ G' G′被拓展 -
一致性 > 可采纳性
3.启发式函数
A ∗ A^* A∗算法的复杂度对启发式函数的依赖很大,设计一个好的启发式函数可以有效改进算法。
- 定理:称启发式函数
h
2
(
n
)
h_2(n)
h2(n)比
h
1
(
n
)
h_1(n)
h1(n)更好,若
h
1
(
n
)
h_1(n)
h1(n)和
h
2
(
n
)
h_2(n)
h2(n)同时满足可采纳性(或一
致性)且对任意节点 n n n,有 h 2 ( n ) > h 1 ( n ) h_2(n)>h_1(n) h2(n)>h1(n)
二,局部搜索算法
(一)爬山法
每次沿梯度方向
▽
f
\triangledown f
▽f移动一小步
α
\alpha
α,直到收敛(即梯度为 0,说明到达极值点)此时更新公式:
x
=
x
+
α
▽
f
(
x
)
或
x
=
x
−
g
(
x
)
g
′
(
x
)
(牛顿法)
x=x+\alpha \triangledown f(x)\\ 或x=x-\frac{g(x)}{g'(x)}(牛顿法)
x=x+α▽f(x)或x=x−g′(x)g(x)(牛顿法)
若
x
x
x为高维,则
x
=
x
−
H
f
−
1
(
x
)
▽
f
(
x
)
x=x-H_f^{-1}(x)\triangledown f(x)
x=x−Hf−1(x)▽f(x)
这里
H
f
(
x
)
H_f(x)
Hf(x)即为
f
f
f关于
x
x
x的黑塞矩阵(不一定可逆)
H
i
j
=
∂
2
f
∂
x
i
∂
x
j
H_{ij}=\frac{\partial^2 f}{\partial x_i\partial x_j}
Hij=∂xi∂xj∂2f
- 爬山法在处理凸规划问题时非常有效
- 缺点:爬山法严重依赖于状态空间的形状。如果状态空间存在较多山脊、高原等局部极值状态,则很容易失效。
- 改进:随机重启爬山法
每次陷入局部极值点时,则重新生成初始状态尝试,直至找到最优解。
该算法的完备概率接近于1 (当尝试次数非常大时)
(二)模拟退火算法
引入随机性。每次以概率
p
p
p接受局部最佳移动,以
1
−
p
1-p
1−p的概率随机移动,如果该移动导致结果变差,则下一次接受局部最佳移动的概率呈指数级下降。
同时,
p
p
p也随“温度”
T
T
T的降低而下降。即
T
T
T高时可能允许“坏”的移动,
T
T
T越低越不可能接受“坏”移动。
该算法的完备概率接近于1(当
T
T
T的下降速度接近于0时)。
(三)遗传算法
(四)蚁群算法
(五)蒙特卡洛算法
三,博弈问题的对抗搜索算法
博弈问题(主要是零和问题)的对抗搜索策略
(一)极小极大( M i n i m a x Minimax Minimax)算法
定义:每个节点的效益是基于
m
a
x
max
max定义的,即某个节点的效益越大,对
m
a
x
max
max越有利;反之对
m
i
n
min
min越有利。
m
a
x
max
max总是尝试让节点效益最大化,
m
i
n
min
min总是尝试让节点效益最小化。
M
i
n
i
m
a
x
Minimax
Minimax算法基于
D
F
S
DFS
DFS,故
(1)时间复杂度:
O
(
b
m
)
O(b^m)
O(bm)
(2)空间复杂度:
O
(
b
m
)
O(bm)
O(bm)
(3)完备性:是(当且仅当博弈树是有限的,即
m
m
m有限)
(4)最优性:是(若对手也是最优的,否则不一定;但一定不会比原策略更差)
(二) α − β \alpha-\beta α−β剪枝
通过对节点进行评估和剪枝,减少搜索的节点数量,从而提高搜索效率
定义:
(1)
α
\alpha
α:当前
m
a
x
max
max节点能获得的最大效益,即节点效益的最大值;
(2)
β
\beta
β:当前
m
i
n
min
min节点能获得的最大效益,即节点效益的最小值;
(注意:每个节点都有
α
\alpha
α,
β
\beta
β,且初始值分别为
−
∞
-\infty
−∞,
+
∞
+\infty
+∞)
- 更新:在父节点中,根据节点的类型(
m
a
x
max
max节点或
m
i
n
min
min节点),更新α或β的值
(1) m a x max max节点的 α \alpha α即为它的 m i n min min子节点的 β \beta β的最大值(遍历完一个分支,更新一次;遍历完所有分支且当前 m a x max max节点未被剪枝,令 β = α \beta=\alpha β=α)
(2) m i n min min节点的 β \beta β即为它的 m a x max max子节点的 α \alpha α的最小值(遍历完一个分支,更新一次;遍历完所有分支且当前 m i n min min节点未被剪枝,令 α = β \alpha=\beta α=β) - 剪枝:当 m a x max max节点的 α ⩾ \alpha \geqslant α⩾其父节点的 β \beta β,或者 m i n min min节点的 β ⩽ \beta \leqslant β⩽其父节点的 α \alpha α,意味着其父节点已经找到了更好的选择,因此可以剪掉该节点的子树;如果每次剪枝都是最优顺序,则时间复杂度为 O ( b m / 2 ) O(b^{m/2}) O(bm/2)
(三)不完美的实时决策
前面的 M i n i m a x Minimax Minimax算法和 α − β \alpha-\beta α−β剪枝算法之所以时间复杂度过高,是因为它们要搜索至终止状态,搜索深度为 m m m。一种降低时间复杂度的策略是:考虑使用启发式评估函数,把非终止节点变为终止节点,提前截断搜索。
- 一些策略:评估函数的设计、截断搜索、向前剪枝、搜索与查表(查表 → \rightarrow →搜索 → \rightarrow →查表)
(四)其它博弈问题
随机博弈、部分可观察博弈
四,约束满足问题( C S P CSP CSP)搜索算法
(一) C S P CSP CSP问题
1.定义:
-
C
S
P
CSP
CSP问题包含:
变量集合 X = { X 1 , X 2 , … , X n } X=\begin{Bmatrix}X_1,X_2,…,X_n \end{Bmatrix} X={X1,X2,…,Xn}
值域集合 D = { D 1 , D 2 , … , D n } D=\begin{Bmatrix}D_1,D_2,…,D_n \end{Bmatrix} D={D1,D2,…,Dn},每个变量对应自己的值域 D i D_i Di
约束集合 C C C - 称一个赋值是相容的,若这个赋值不违反任何约束条件(完整赋值和部分赋值)
- 一元约束、二元约束、全局约束
- 绝对约束、偏好约束
- 结点相容、弧相容
2.定理:
- 任意值域是有限的约束都可以通过引入足够的约束变量转化为二元约束
(因此求解 C S P 问题 ⇔ 求解该问题对应的二元约束问题) (因此求解 CSP 问题\Leftrightarrow求解该问题对应的二元约束问题) (因此求解CSP问题⇔求解该问题对应的二元约束问题)
3.处理 C S P CSP CSP问题的核心思想:局部相容性
(二) A C − 3 AC-3 AC−3算法
一种弧相容算法,弧 ( X i , X j ) (X_i,X_j) (Xi,Xj)即为 X i X_i Xi相对于 X j X_j Xj的二元约束
( X i , X j ) ≠ ( X j , X i ) (X_i,X_j)\neq (X_j,X_i) (Xi,Xj)=(Xj,Xi)
-
基本方法:维护一个弧相容队列,队列中包含所有弧。
(1)每次将一条弧 ( X i , X j ) (X_i,X_j) (Xi,Xj)出队,取遍 X j X_j Xj所有可能取值。
(2)若 D i D_i Di不发生变化,则处理下一条弧;若 D i D_i Di发生变化(只可能变小),那么将所有相对于 X i X_i Xi的弧 ( X k , X i ) (X_k,X_i) (Xk,Xi)重新插入队列(因为 D i D_i Di的缩小可能使 D k D_k Dk缩小)。
(3)重复(1)(2),直到出现某个 D i D_i Di为空集,则说明整个 CSP 没有相容解;或者队列中没有弧,则说明找到某个解满足 CSP 问题 -
假设 C S P CSP CSP有 n n n个变量, c c c条弧,每个值域最多包含 d d d个元素,则算法时间复杂度为 O ( c d 3 ) O(cd^3) O(cd3)
(1)每条弧 ( X k , X i ) (X_k,X_i) (Xk,Xi)最多入队 d d d次(因为 X i X_i Xi的值域大小为 d d d,每次入队就减少1)
(2)检验一条弧的相容性时间复杂度为 O ( d 2 ) O(d^2) O(d2)(因为 X i , X j X_i,X_j Xi,Xj的不同取值组合最多为 d 2 d^2 d2)
(三)回溯搜索
其本质就是 D F S DFS DFS,每次为一个变量赋值,当出现变量没有合法赋值时就回溯
- 关键策略:每次选择给哪个变量赋值,和每次给选定的变量赋什么值
(1)最少剩余值(MRV)启发式(选择变量)
每次选择合法取值最少的变量(从而加快对搜索树的剪枝)
(2)度启发式(选择变量)
有时候最少剩余值启发式失效,则考虑度启发式每次选择与其它未赋值变量约束最多的变量
(3)最少约束值启发式(选择变量的值)
选定某个变量后,选择赋哪个值的依据是让邻居变量的值域更大
为什么选择变量和选择变量的值的策略不同?
因为选择值域较小或者约束较多的变量可以及早剪枝搜索树,而选择变量的值时,只要找到一个解即可,不需要纠结于可能失败的值。
(还有其它启发式如最小冲突启发式在一些问题中也有不错的效果)
-
方法:前向检验
每次给赋值后,根据弧tt将未赋值变量中与不相容的值删去 -
改进: M A C MAC MAC算法
前向检验的不足之处在于每次只处理一个变量引起的不相容性,也许该变量引起的不相容性又会导致更多的不相容性。(如的赋值使的值域发生变化,但的值域发生变化可能又会引起其它未赋值变量的值域发生变化,前向检验方法并没有考虑后续的不相容性)因此, M A C MAC MAC算法递归传播约束,将由该变量引起的后续所有不相容性都考虑进去。
以上未完待更新,仅供个人学习,侵权联系删除,如有错误或不足之处可指出,以便改进。