人工智能及其应用
第三章 确定性推理
第2章研究的知识表示方法是问题求解所必需的。
从问题表示到问题的解决,有个求解的过程,也就是搜索过程。在这一过程中,采用适当的搜索技术,包括各种规则、过程和算法等推理技术,力求找到问题的解答
3.1 图搜索策略
可把图搜索控制策略看成一种在图中寻找路径的方法
初始节点和目标节点分别代表初始数据库和满足终止条件的目标数据库。求得把一个数据库变换为另一个数据库的规则序列问题就等价于求得图中的一条路径问题
在图搜索过程中涉及到的数据结构除了图本身以外,还需要两个辅助的数据结构,即存放已访问但未扩展结点的
O
P
E
N
OPEN
OPEN表,以及存放已扩展节点的
C
L
O
S
E
D
CLOSED
CLOSED表
搜索的过程实际是从隐式的状体空间图中不断生成显示的搜索图和搜索树,最终找到路径的过程
为实现这一过程,图中每个节点除了自身的状态信息外,还需存储诸如父节点是谁,由其父节点是通过什么操作可到达该节点,以及节点位于搜索树的深度、从起始节点到该节点的路径代价等信息
图搜索的一般过程如下:
- 建立一个只含有起始节点 S S S的搜索图 G G G,把 S S S放到一个 O P E N OPEN OPEN表中
- 初始化 C L O S E D CLOSED CLOSED表为空表
- L O O P LOOP LOOP:若 O P E N OPEN OPEN表是空表,则失败退出
- 选择 O P E N OPEN OPEN表上的第一个节点,把它从 O P E N OPEN OPEN表移出并放进 C L O S E D CLOSED CLOSED表中。称此节点为节点 n n n
- 若 n n n为一目标节点,则有解并成功退出,此解是追踪图 G G G中沿着指针从 n n n到 S S S这条路径而得到的
- 扩展节点 n n n,生成后继节点集合 M M M
- 对那些未曾在 G G G中出现过的 M M M成员设置其父节点指针指向 n n n并加入 O P E N OPEN OPEN表。对已经在 O P E N OPEN OPEN或 C L O S E D CLOSED CLOSED表中出现过的每一个 M M M成员,确定是否需要将其原来的父节点更改为 n n n。对已在 C L O S E D CLOSED CLOSED表上的每个 M M M成员,若修改了其父节点,则将该节点从 C L O S E D CLOSED CLOSED表中移出,重新加入 O P E N OPEN OPEN表中
- 按某一任意方式或按某个试探值,重排 O P E N OPEN OPEN表
- G O L O O P GO\ LOOP GO LOOP
此过程生成一个显示的图 G G G(称为搜索图)和 G G G的一个子集 T T T(称为搜索树),树 T T T上的每个节点也在图 G G G中
搜索过程中使用的 O P E N OPEN OPEN表存储的都是当前搜索树的叶子节点,因此也被称为 F r o n g e Fronge Fronge表,即前沿表
在失败终止的情况下,从起始节点出发,一定达不到目标节点
G R A P H S E A R C H GRAPHSEARCH GRAPHSEARCH算法同时生成一个节点的所有后继节点。为了说明图搜索过程的某些通用性质,将继续使用同时生成所有后继节点的算法,而不采用修正算法。在修正算法中,一次只生成一个后继节点
从图搜索过程可以看出,是否重新安排 O P E N OPEN OPEN表,即是否按照某个试探值重新对未扩展节点进行排序,将决定该图搜索过程是无信息搜索或启发式搜索
3.2 盲目搜索
不需要重新安排 O P E N OPEN OPEN表的搜索叫做无信息搜索或盲目搜索,它包括宽度优先搜索、深度优先搜索和等代价搜索等。
盲目搜索只适用于求解比较简单的问题
3.2.1 宽度优先搜索
如果搜索是以接近起始节点的程度依次扩展节点的,那么这种搜素就叫作宽度优先搜索
宽度优先搜索算法如下:
- 把起始节点放到 O P E N OPEN OPEN表中
- 如果 O P E N OPEN OPEN是个空表,则没有解,失败退出;否则继续
- 把第一个节点从 O P E N OPEN OPEN表移出,并把它放入 C L O S E D CLOSED CLOSED的扩展节点表中
- 扩展节点 n n n如果没有后继节点,则转向上述第(2)步
- 把 n n n的所有后继节点放到 O P E N OPEN OPEN表的末端,并提供从这些后继节点回到 n n n的指针
- 如果 n n n的任一个后继节点是个目标节点,则找到一个解答,成功退出;否则转向第(2)步
宽度优先搜索方法在假定每一次操作的代价都相等的情况下,能够保证在搜索树中找到一条通向目标节点的最短途径。在宽度优先搜索中,节点进出 O P E N OPEN OPEN表的顺序是先进先出,因此其 O P E N OPEN OPEN表是一个队列结构
3.2.2 深度优先搜索
在深度优先搜索中,首先扩展最新产生的(即最深的)节点
深度相等的节点可以任意排列。定义节点的深度如下:
- 起始节点(即根节点)的深度为0
- 任何其他节点的深度等于其父节点深度加1
首先,扩展最深的节点的结果使得搜索沿着状态空间某条单一的路径从起始节点向下进行;只有当搜索到达一个没有后裔的状态时,它蔡考虑另一条替代的路径。替代路径与前面已经试过的路径的不同之处仅仅在于改变最后 n n n步,而且保持 n n n尽可能小
在搜索过程中可能会出现深度无限深,为了避免考虑太长的路径,往往给出一个节点扩展的最大深度——深度界限,任何节点如果达到了深度界限,那么都将它们作为没有后继节点处理。
但即使使用了这样的方法,所求得的路径也不一定就是最短路径
含有深度界限的深度优先搜索算法如下:
- 把起始节点 S S S放到未扩展节点 O P E N OPEN OPEN表中。如果此节点为一目标节点,则得到一个解
- 如果 O P E N OPEN OPEN为一空表,则失败退出
- 把第一个节点从 O P E N OPEN OPEN表移到 C L O S E D CLOSED CLOSED表
- 如果节点 n n n的深度等于最大深度,则转向(2)
- 扩展节点 n n n,产生其全部后裔,并把他们放入 O P E N OPEN OPEN表的前头。如果没有后裔,则转向(2)
- 如果后继节点中有任一个为目标节点,则求得一个解;否则转(2)
显然,深度优先算法中节点进入 O P E N OPEN OPEN表的顺序是后进先出, O P E N OPEN OPEN表是一个栈
3.2.3 等代价搜索
宽度优先搜索可被推广用来解决这种寻找从起始状态至目标状态的具有最小代价的路径问题,这种推广了的宽度优先搜索算法叫做等代价搜索算法。
如果所有的连接弧线具有相等的代价,那么等代价算法就简化为宽度优先搜索算法。在等代价搜索算法中,不是描述沿着等长度路径断层进行的扩展,而是描述沿着等代价路径断层进行的扩展
在等代价搜索算法中,把从节点
i
i
i到它的后继节点
j
j
j的连接弧线代价记为
c
(
i
,
j
)
c(i,j)
c(i,j),把从起始节点
S
S
S到任一节点
i
i
i的路径代价记为
g
(
i
)
g(i)
g(i)。
在搜索树上,假设
g
(
i
)
g(i)
g(i)也是从起始节点
S
S
S到节点
i
i
i的最少代价路径上的代价,因为它是唯一的路径。等代价搜索方法以
g
(
i
)
g(i)
g(i)的递增顺序扩展其节点,其算法如下:
- 把起始节点 S S S放到未扩展节点表 O P E N OPEN OPEN中。如果此起始节点为一目标节点,则求得一个解,否则令 g ( S ) = 0 g(S)=0 g(S)=0
- 如果 O P E N OPEN OPEN是个空表,则没有解而失败退出
- 从 O P E N OPEN OPEN表中选择一个节点 i i i,使其 g ( i ) g(i) g(i)为最小。如果有几个节点都合格,那么就要选择一个目标节点作为节点 i i i;否则,就从中选择一个作为节点 i i i。把节点 i i i从 O P E N OPEN OPEN表移至扩展节点表 C L O S E D CLOSED CLOSED中
- 如果节点 i i i为目标节点,则求得一个解
- 扩展节点 i i i。如果没有后继节点,则转(2)
- 对于节点 i i i的每个后继节点 j j j,计算 g ( j ) = g ( i ) + c ( i , j ) g(j)=g(i)+c(i,j) g(j)=g(i)+c(i,j),并把所有后继节点 j j j放进 O P E N OPEN OPEN表。提供回到节点 i i i的指针
- 转向第(2)步
3.3 启发式搜索
盲目搜索的效率低,耗费过多的计算空间与时间。如果能够找到一种方法用于排列待扩展节点的顺序,即选择最有希望的节点加以扩展,那么搜索效率将会大为提高
3.3.1 启发式搜索策略和估价函数
要在盲目搜索中找到一个解,所需要扩展的节点数目可能是极大的,因为这些节点的扩展次序完全是随意的,且没有利用已解决问题的任何特性。这种结果是组合爆炸的一种表现形式
把进行这种搜索的技术一般需要某些有关具体问题领域的特性的信息,称为启发信息
把利用启发信息的搜索方法叫做启发式搜索方法
利用启发信息来决定哪个是下一步要扩展的节点,总是选择“最有希望”的节点,这种搜索方法叫做有序搜索,也称为最佳优先搜索
用来估算节点“希望”的量度叫做估价函数,估价函数的值越小,意味着该节点位于最优解路径上的“希望”越大,最后找到的最优路径即平均综合指标为最小的路径
估价函数能够提供一个评定候选扩展节点的方法,以确定哪个节点最有可能在通向目标的最佳路径上
启发信息用来排列第8步 O P E N OPEN OPEN表上的节点,使得搜索沿着那些被认为最有希望的区段扩展。
用函数 f f f(估价函数)来排列第8步 O P E N OPEN OPEN表上的节点。根据习惯, O P E N OPEN OPEN表上的节点按照它们 f f f函数值的递增顺序排列。根据推测,某个具有低的估价值的节点较有可能处在最佳路径上
3.3.2 有序搜索
有序搜索又称为最佳优先搜索,它总是选择最有希望的节点作为下一个要扩展的节点
尼尔逊
(
N
i
l
l
s
o
n
)
(Nillson)
(Nillson)曾提出一个有序搜索的基本算法,该算法的估价函数
f
f
f:一个节点的希望程度越大,其
f
f
f值就越小。被选为扩展的节点,是估价函数最小的节点
有序状态空间搜索算法如下:
- 把起始节点 S S S放到 O P E N OPEN OPEN表中,计算 f ( S ) f(S) f(S)并把其值与节点 S S S联系起来
- 如果 O P E N OPEN OPEN是个空表,则失败退出,无解
- 从 O P E N OPEN OPEN表中选择一个 f f f值最小的节点 i i i。如果有几个节点合格,当其中有一个为目标节点时,则选择此目标节点,否则就选择其中任一个节点作为节点 i i i
- 把节点 i i i从 O P E N OPEN OPEN表中移出,并把它放入 C L O S E D CLOSED CLOSED的扩展节点表中
- 如果 i i i是一个目标节点,则成功退出,求得一个解
- 扩展节点
i
i
i,生成其全部后继节点。对于
i
i
i的每一个后继节点
j
j
j:
- 计算 f ( j ) f(j) f(j)
- 如果 j j j既不在 O P E N OPEN OPEN表中,又不在 C L O S E D CLOSED CLOSED表中,则用估价函数 f f f把它添入 O P E N OPEN OPEN表。从 j j j加一指向其父节点 i i i的指针,以便一旦找到目标节点时记住一个解答路径
- 如果
j
j
j已在
O
P
E
N
OPEN
OPEN表或
C
L
O
S
E
D
CLOSED
CLOSED表中,则比较刚刚对
j
j
j计算过的
f
f
f值和前面计算过的该节点在表中的
f
f
f值。如果新的
f
f
f值较小,则:
- 以此新值取代旧值
- 从 j j j指向 i i i,而不是指向它的父节点
- 如果节点 j j j在 C L O S E D CLOSED CLOSED表中,则把它移回 O P E N OPEN OPEN表
- 转向(2)
宽度优先搜索、等代价搜索和深度优先搜索都是有序搜索技术的特例。
宽度优先搜索,选择 f ( i ) f(i) f(i)作为节点 i i i的深度。
对于等代价搜索, f ( i ) f(i) f(i)是从起始节点至节点 i i i这段路径的代价
与盲目搜索方法比较,有序搜索的目的在于减少被扩展的节点数
有序搜索的有效性直接取决于 f f f的选择,这将敏锐地辨别出有希望的节点和没有希望的节点,但是这种辨别不准确,可能会失去一个最好的解甚至全部的解
如果没有适用的、准确的希望量度,那么 f f f的选择将涉及两方面的内容:一方面是一个时间和空间之间的折中方案;另一方面是保证有一个最优的解或任意解
节点希望量度以及某个具体估价函数的合适程度取决于手头的问题情况。根据所要求的解答类型,可以把问题分为3种情况:
- 假设该状态空间含有几条不同代价的解答路径,其问题是要求得最优解答。这种情况的代表性的例子为算法 A ∗ A^* A∗
- 与上面的情况相似,但有一个附加条件:此类问题是比较难的,如果按第一种情况加以处理,则搜索过程很可能在找到解答之前就超过了时间和空间界限。在这种情况下,关键问题是:①如何通过适当的搜索试验找到好的解答;②如何夏至搜索试验的范围和所产生的解答与最优解答的差异程度
- 不考虑解答的最优化;或者只存在一个解,或者任何一个解与其他的解一样好。这时,问题是如何使搜索试验的次数最少,而不像第二种情况那样试图使某些搜索试验和解答代价的综合指标最小
3.3.3 A ∗ A^* A∗算法
在讨论 A ∗ A^* A∗算法前,先定义几个有用的记号:
- 令 k ( n i , n j ) k(n_i,n_j) k(ni,nj)表示任意两个相通节点 n i n_i ni和 n j n_j nj之间最小代价路径的实际代价
- 令 h ∗ ( n ) h^*(n) h∗(n)表示整个目标节点集合 { t i } \left\{t_i \right\} {ti}上所有 k ( n , t i ) k(n,t_i) k(n,ti)中最小的一个,因此 h ∗ ( n ) h^*(n) h∗(n)就是从 n n n到目标节点最小代价路径的代价,而且从 n n n到目标节点的代价为 h ∗ ( n ) h^*(n) h∗(n)的任一路径就是一条从 n n n到某个节点的最佳路径
- 引进函数
g
∗
g^*
g∗,对所有从
S
S
S开始可达到
n
n
n的路径来说,函数
g
∗
g^*
g∗定义为:
- g ∗ ( n ) = k ( S , n ) g^*(n)=k(S,n) g∗(n)=k(S,n)
- 定义函数
f
∗
f^*
f∗,使得在任一节点
n
n
n上其函数值
f
∗
(
n
)
f^*(n)
f∗(n)就是从节点
S
S
S到节点
n
n
n的一条最佳路径的实际代价,加上从节点
n
n
n到某目标节点的一条最佳路径的代价之和,即
- f ∗ ( n ) = g ∗ ( n ) + h ∗ ( n ) f^*(n)=g^*(n)+h^*(n) f∗(n)=g∗(n)+h∗(n)
- 估价函数
f
f
f是
f
∗
f^*
f∗的一个估计,此估计可由下式给出:
-
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f(n)=g(n)+h(n)
f(n)=g(n)+h(n)
- 其中: g g g是 g ∗ g^* g∗的估计; h h h是 h ∗ h^* h∗的估计;
- h ∗ ( n ) h^*(n) h∗(n)的估计 h ( n ) h(n) h(n)依赖于有关问题的领域的启发信息, h h h叫做启发函数
-
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f(n)=g(n)+h(n)
f(n)=g(n)+h(n)
A ∗ A^* A∗算法是一种有序搜索算法,其特点在于对估价函数的定义上
对于一般的有序搜索,总是选择 f f f值最小的节点作为扩展节点。因此, f f f是根据需要找到一条最小代价路径的观点来估算节点的
可考虑每个节点 n n n的估价函数值为两个分量:从起始节点到节点 n n n的代价以及节点 n n n到达目标节点的代价
先有以下定义:
- 在 G R A P H S E A R C H GRAPHSEARCH GRAPHSEARCH过程中,如果第8步的重排 O P E N OPEN OPEN表是依据 f ( x ) = g ( x ) + h ( x ) f(x)=g(x)+h(x) f(x)=g(x)+h(x)进行的,则称该过程为 A A A算法
- 在 A A A算法中,如果对所有的 x x x存在 h ( x ) ≤ h ∗ ( x ) h(x)\le h^*(x) h(x)≤h∗(x),则称 h ( x ) h(x) h(x)为 h ∗ ( x ) h^*(x) h∗(x)的下界,它表示某种偏于保守的估计
- 采用 h ∗ ( x ) h^*(x) h∗(x)的下界 h ( x ) h(x) h(x)为启发函数的 A A A算法,称为 A ∗ A^* A∗算法。当 h = 0 h=0 h=0时, A ∗ A^* A∗算法就变为等代价搜索算法
A ∗ A^* A∗算法:
- 把 S S S放入 O P E N OPEN OPEN表,记 f = h f=h f=h,令 C L O S E D CLOSED CLOSED为空表
- 重复下列过程,直至找到目标节点为止。若 O P E N OPEN OPEN表为空,则失败
- 选取 O P E N OPEN OPEN表中未设置过的具有最小 f f f值的节点为最佳节点 ( B E S T N O D E ) (BESTNODE) (BESTNODE),并移入 C L O S E D CLOSED CLOSED表
- 若最佳节点为一目标节点 ( S U C C E S S O R ) (SUCCESSOR) (SUCCESSOR),则成功求得一解
- 若最佳节点不是目标节点,则扩展结点,产生后继节点
- 对每个后继节点,进行下列过程:
- 建立从后继节点返回最佳节点的指针
- 计算 g ( S U C ) = g ( B E S ) + g ( B E S , S U C ) g(SUC)=g(BES)+g(BES,SUC) g(SUC)=g(BES)+g(BES,SUC)
- 如果 S U C C E S S O R ∈ O P E N SUCCESSOR\in OPEN SUCCESSOR∈OPEN,则称此节点为 O L D OLD OLD,并添加至 B E S T N O D E BESTNODE BESTNODE的后继节点表中
- 比较新旧路径代价。如果 g ( S U C ) < g ( O L D ) g(SUC)<g(OLD) g(SUC)<g(OLD),则重新确定 O L D OLD OLD的父节点为 B E S T N O D E BESTNODE BESTNODE,记下较小代价 g ( O L D ) g(OLD) g(OLD),并修正 f ( O L D ) f(OLD) f(OLD)值
- 若至 O L D OLD OLD节点的代价较低或一样,则停止扩展节点
- 若 S U C C E S S O R SUCCESSOR SUCCESSOR不在 O P E N OPEN OPEN表中,则看其是否在 C L O S E D CLOSED CLOSED表中
- 若 S U C C E S S O R SUCCESSOR SUCCESSOR在 C L O S E D CLOSED CLOSED表中,则比较新旧路径代价。如果 g ( S U C ) < g ( O L D ) g(SUC)<g(OLD) g(SUC)<g(OLD),则重新确定 O L D OLD OLD的父节点 B E S T N O D E BESTNODE BESTNODE,记下较小代价 g ( O L D ) g(OLD) g(OLD),修正 f ( O L D ) f(OLD) f(OLD)值,并将 O L D OLD OLD从 C L O S E D CLOSED CLOSED表中移出,移入 O P E N OPEN OPEN表
- 若 S U C C E S S O R SUCCESSOR SUCCESSOR既不在 O P E N OPEN OPEN表中,又不在 C L O S E D CLOSED CLOSED表中,则把它放入 O P E N OPEN OPEN表中,并添入 B E S T N O D E BESTNODE BESTNODE后裔表,然后转第7步
- 计算 f f f值
- G O L O O P GO\ \ LOOP GO LOOP
A ∗ A^* A∗算法中估价函数的定义是非常重要的,尤其是其中的启发函数 h ( n ) h(n) h(n),由于启发信息在算法中就是通过 h ( n ) h(n) h(n)体现,如果在估价函数的定义中恰好令 h ( n ) = h ∗ ( n ) h(n)=h^*(n) h(n)=h∗(n),则可以看到搜索树将只扩展出最佳路径,也就是最理想的情况,但一般情况下必须满足 h ( n ) h(n) h(n)不超过 h ∗ ( n ) h^*(n) h∗(n)算法才能保证找到最优解, h ( n ) h(n) h(n)的这种特性称为可纳性,即 h ( n ) h(n) h(n)的定义必须满足可纳性才能保证算法的最优性