人工智能引论笔记

搜索
搜索:既按照特定规则(策略),在知识库中寻找可利用知识,构造解决问题的推理路线的过程。
搜索的目的通常有两种:
找到从初始事实到问题最终答案的推理路线。
所找到路线时间和空间复杂度最小。
状态空间法(将问题转变为能利用搜索方法解决的形式):
由于在实际中人们发现,许多问题实际上可以通过探索其存在的解空间来解决,于是将这种基于解空间的问题解决方法叫做状态空间方法。该方法应用范围可以很广泛,例如我们实际生活中的路线规划问题,象棋怎么下的问题都可以应用该思想解决。
状态空间Q可用三种类型的集合表示:初始状态集合S,操作符集合F,目标状态集合G。状态空间Q可记为三元组(S,F,G)
其主要思想即是将每种结果、操作枚举,将问题转变为计算机能够处理的形式,通过有限的操作,一定的算法,由已知结果探索到目的结果(即搜索)。
图搜索策略
数据结构:open表,closed表(用来描述节点状态的转变过程),树结构,图结构
open表:存放刚生成节点,作为待考察对象,”有进有出”动态数据结构,节点进出OPEN表的顺序由搜索策略决定
closed表:存放将要扩展或已经扩展的节点,记录求解信息,“有进无出”动态数据结构,当前节点进入CLOSED表的最后。
树结构:描述状态与状态之间的关系,控制简单,但占空间较大,若产生相同结点多,则时空均需要较大的代价。
图结构:描述状态与状态之间的关系,节省大量空间(相同的结点只存一次)和时间(相同结点不需要重复产生),但每产生一个新的结点需判断这个节点是否已生成过, 因而控制更复杂,判断也要占用时间
基本策略:
问题初始状态作为当前状态,选择算符进行操作,生成子状态,检查目标状态是否出现。
若出现,则搜索成功,找到问题解;
否则,从已生成状态中再选一个状态作为当前状态。
重复上述过程,直到目标状态出现或不再有可供操作状态及算符为止。
盲目搜索
即无需安排open表的搜索叫做无信息搜索、非启发式搜索或者盲目搜索,适用于求解简单问题。包括:

宽度优先搜索
深度优先搜索
等代价搜索
宽度优先搜索
基本思想
从起始节点S开始,按生成规则生成第一层节点,沿宽度横向扫描该层全部节点,检查该层节点中是否包含目标节点Sg。若没有,则将该层所有节点逐一扩展,得到第二层节点并逐一检查。
特点
向下逐层搜索,n层节点未搜索完之前不进入n+1层搜索。
深度优先搜索
基本思想
从初始节点S开始,按生成规则生成下一级子节点,检查是否出现目标节点Sg。若未出现,则按“最晚生成的子节点优先扩展”原则,再用生成规则生成下一级子节点。
特点
沿着最晚生成子节点分枝,逐级“纵向”深入搜索
有限深度优先搜索
对深度优先搜索的改进,避免太长路径,防止搜索过程沿着无益路径扩展
设置节点扩展的最大深度,即深度界限。如果任何节点达到深度界限,则把它们作为无后继节点处理。
例:八数码难题
等代价搜索
已知搜索树中连接弧线上的代价,求具有最小代价的解答路径。
宽度优先搜索被推广解决从起始状态至目标状态具有最小代价的路径问题。
此时用open表和closed表就描述起来相当方便了,其基本思路是:
首先定义一个基本操作A:即对某一节点进行扩展,将扩展后的节点加入到open表中(没有就不加),而被扩展的节点则加入到closed表中并从open表中删除。
接下来问题便是对哪一个节点进行操作A。这时,我们对open表中代价函数(描述起始节点到目标节点的权)中数值最小的节点进行操作A。得到新的open表和closed表。
若新的open表中出现了我们要找的目标节点,则过程结束。否则,我们将继续进行步骤二。
启发式搜索
由于盲目搜索它效率低并且耗费过多计算空间与时间,这时便想到:通过优化如何选择对open表中的节点进行扩展,选择去排列带扩展节点的顺序来增大搜索效率。简单来说就是改变搜索策略,有目的的找人。

启发式搜索:即利用启发信息的一种搜索方式。
启发信息:
要扩展的下一个节点,避免像宽度优先或深度优先搜索盲目地扩展;
要生成哪一个或哪几个后继节点,避免盲目地同时生成所有可能节点;
某些从搜索树中抛弃或修剪的节点。
有序搜索

利用第一种启发信息,选择“最有希望”的节点作为下一个被扩展的节点的搜索方法。
基本思想:利用估价函数f对open表上的节点进行排序。

特点:应用算法选择OPEN表上具有最小f值的节点作为下一个要扩展的节点,即选择最有希望的节点作为下一个要扩展的节点。

估价函数:估算节点“希望”程度的量度。
对希望的定义方法:
估算目标节点到此节点的距离
解答路径包括被估价过的节点,并计算全条路径的长度
例:八数码难题。此时将启发式函数为数字错放位置的个数和所有数字当前位置以最短路径走到正确位置的步数之和。(单一变量难以描述完全)
图搜索
图的分类:

或图:搜索扩展时,可在若干分支中选择其中之一。
与/或图:搜索扩展时,有可能要同时搜索若干分支,也有可能在若干分支中选择其中之一。
爬山法:
爬山法把出现在离目标最近的节点选作为它下一步的节点。此算法取名于模仿—个在黑暗中在半山腰迷路的徒步旅行者。假设他的营地在山顶,那末即使在黑暗中,徒步旅行者也知道每向上走一步就是向正确的目标前进了一步。
基本步骤
生成第一个可能的解。若是目标,则停止;否则转下一步。
从当前可能的解出发,生成新的可能解集。(1)用测试函数测试新的可能解集中的元素,若是解,则停止;否则转(2)。(2)若不是解,则将它与至今已测试过的“解”比较。若它最接近解,则保留作为最佳元素;若它不最接近解,则舍弃。
以当前最佳元素为起点,转2。
最佳优先搜索
算法步骤
生成第一个可能的解。若是目标,则停止;否则转下一步。
从该可能的解出发,生成新的可能解集。(1)用测试函数测试新的可能解集中的元素,若是解,则停止;否则转(2)。(2)若不是解,则将新生成的“解”集加入到原可能“解”集中。
从解集中挑选最好的元素作为起点,再转(2)
通用或图搜索算法
图搜索算法只记录状态空间那些被搜索过的状态,它们组成一个搜索图叫G。G由两张表内的节点组成:
Open表:用于存放已经生成,且已用启发式函数作过估计或评价,但尚未产生它们的后继节点的那些结点,也称未考察结点。
Closed表:用于存放已经生成,且已考察过的结点。
一个辅助结构Tree, 它的节点为G的一个子集。Tree 用来存放当前已生成的搜索树, 该树由G的反向边组成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 算法如下:
设S0 :初态, Sg:目标状态
1. 产生一仅由S0组成的open表;
2. 产生一空closed表;
3. 如果open为空,失败退出;
4. 在open表上按某一原则选出第一个优先结点,称为n,放n
到closed表中,并从open表中去掉n;
5. 若n∈Sg,则成功退出;
解为在Tree中沿指针从n到s0的路径,或n本身。
(如八皇后问题给出n即可,重排九宫问题要给出路径)
6. 产生n的一切后继,将后继中不是n的前驱点的一切点构成
集合M,将装入G作为n的后继, 这就除掉了既是n的前驱又
是n的后继的结点,避免回路,节点之间有偏序关系存在。
7. 对M中的元素P,分别作两类处理:
7.1 若P∉G,即P不在open表中也不在closed表中,则P
加入open表(注1)
,同时加入搜索图G中,对P进行估计
放入Tree中。
7.2 P∈G,则决定是否更改Tree中P到n的指针(注2)。
8. 转3。

注1:
若生成的后继节点放于:
(1)Open 表的尾部——相当于Breadth-first-search;
(2)Open表的首部——相当于Depth-first-search;
(3)根据启发式函数f的估计值确定最佳者,放于Open表的
首部——相当于Best-first-search
注2:Tree的生成
(1) 若P∈M且在open表中,
这说明P在n之前已是某一结
点m的后继, 但本身尚未被考
察(未生成P的后继),
这说明从S0→p至少有两条路径,这时有两种情况:
a.若Path1的代价< Path2的代价时,当前路径较好,要修
改p的指针,使其指向n,即标出搜索之后的最好路径;
b.若Path1的代价≥Path2的代价时,原路径较好,不改变
p的指针。
(2) 若p∈M且在closed表中,这说明:
a. p在n之前已是某一节点m的后继,所以需要作如(1)同样
的处理,如下图右部。
b.p在closed表中,说明p的后继也在n之前已生成,我们
称为Ps,那么对Ps同样可能由于n→p这一路径的加入又必须
比较多条路径代价后而取代价小的一条。
A算法与A*算法
几个术语要点:

估价函数f:从节点s到节点n的最小代价路径的代价与从节点n到目标节点t的最小代价路径的代价之总和
OPEN表上具有最小f值的节点为所估计的加有最少严格约束条件的节点,且下一步要扩展该节点是合适的。
k(ni,nj):任意两个节点ni和nj之间最小代价路径的实际代价。
函数g(n):所有从节点s开始可达到节点n的路径的代价,即g(n)=k(s,n)。
函数h(n):从节点n到目标节点的最小代价路径的代价。
函数f (n):从节点s到节点n的一条最佳路径的实际代价加上从节点n到目标节点的一条最佳路径的代价之和,即 f(n)=g(n)+h(n)。
估价函数f是f 的一个估计,f(n)=g(n)+h(n)。其中,g是g 的估计,h是h
的估计。
对g(n)来说,它为搜索树中从s到n这段路径的代价,该定义包含了g(n)≥g* (n)。
对h(n)来说,它依赖于有关问题的领域的启发信息,h称为启发函数。
A算法:

定义:图搜索算法中,如果能在搜索的每一步都利用估价函数f(n)=g(n)+h(n)对Open表中的节点进行排序,则称该搜索算法为A算法。又估价函数中带有问题自身的启发性信息。因此,A算法又称为启发式搜索算法
问题:A算法没有对估价函数f(n)做任何限制
A*算法:

定义:对估价函数加上一些限制后得到的一种启发式搜索算法称为A算法。
注:A 之所以加一个 号,是因为它的启发式函数是有限制的,这个限制确保它能找到绝对最优解,去掉这个限制,就是 A 算法。
在A算法中,若令:
h(n) ≡ 0,则A算法相当于广度优先,因为上一层节点的搜索
费用一般比下一层的小。
g(n) ≡ h(n) ≡ 0,则相当于随机算法。
g(n) ≡ 0 ,则相当于最佳优先算法。
特别是当要求:h(n) ≤ h (n) 就称为这种A算法为A
算法。