搜索的两层含义:

  1. 找到从初始事实到问题最终答案的一条推理路线。
  2. 时间、空间复杂度最小。

盲目搜索

OPEN表:存放将要刚生成的节点。
在这里插入图片描述
CLOSE表:存放要扩展或已经扩展的节点。
在这里插入图片描述

上述两图要记住父结点编号,以便于为扩展节点设置指向父节点的指针。

一般的搜索过程:
step1:初始节点S0放入OPEN表,并建立只包含S0的图(记作G)。

step2:OPEN表为空,退出,无解。

step3:(OPEN表非空)取OPEN表的第一个节点,放入CLOSE表中,记为n。

step4:若n为目标节点,搜索成功,并从n逆向回溯到S0的路径。

step5:(n不是目标节点)根据n生成一组子节点。将其中不是n节点的先辈的子节点记作集合M,并M中的节点加入G中。

step6:针对M的不同情况进行一下处理
①M中未曾在G中出现过的节点,设置一个指向父节点(n)的指针,并加入OPEN表中。
②M中已经在G中出现过的节点,确认是否需要修改指向父节点的指针。
③M中已经在G中出现过且已经扩展过的节点,确认是否需要修改其后继节点指向父节点的指针。

step7:按某种策略对OPEN表中的节点排序。

step8:转step2

下面出现的广搜(宽度优先搜索)、深搜(包括有界深搜)、等代价搜索对OPEN表排序的策略不同。


1.宽度优先搜索

这种搜索是逐层进行,在对下一层任一节点进行搜索之前,必须搜索玩本层的所有节点。
宽度优先搜索在扩展节点时,是将每个扩展节点放入OPEN尾部,并配置指向父节点n的指针。


2.深度优先搜索

扩展结点的策略:子节点放置在OPEN表首部,并配置指向父节点n的指针。
关于有界深搜:
设定了一个搜索深度最大值dm。其中初始节点是0,其他节点是父节点深度再+1。
因此在算法执行期间,扩展节点之前还要判断当前搜索深度是否等于dm,如果等于转到step2


3.代价树搜索

此时的搜索树的每条边都有代价
g(n):初始节点S0到节点n的代价。
c(n1,n2):父节点n1到子节点n2的代价。
因此有g(n2) = g(n1) + c(n1,n2)

代价树广搜

扩展节点时,将n节点的子节点ni(i = 1,2,3…)加入OPEN表,设置指向父节点的指针,对OPEN表中的全部节点按g(ni)从小到大顺序重新排序。

代价树深搜

扩展结点时,将n的节点的子节点ni(i = 1,2,3…)按边代价从小到大的顺序放入OPEN表的首部,并设置指向父节点的指针。


作业题1
列出图中树的访问序列以满足下列两种搜索策略,并写出搜索过程中的OPEN表和CLOSE表。(在所有情况下都选择最左分支优先访问,设节点12为目标节点):
(1)深度优先搜索
(2)广度优先搜索在这里插入图片描述
深度优先搜索:

OPENCLOSE
1
4,3,21
6,5,4,31,2
6,4,31,2,5
11,10,4,31,2,5,6
11,4,31,2,5,6,10
4,31,2,5,6,10,11
7,41,2,5,6,10,11,3
13,12,41,2,5,6,10,11,3,7
13,41,2,5,6,10,11,3,12
  1. 既要满足深搜在扩展OPEN表时将扩展结点放入OPEN表的头部,又要满足题目选择最左分支的情况(就是从引入CLOSE表的n节点的子节点集合M中,选取其序号最小的节点,比如对于n=2,子节点引入OPEN的顺序为6,5,小的序号是5,也就是下一步要扩展到最左节点)
  2. 关于深搜将扩展结点放入OPEN表首部,此博客有详细图示

广度优先搜索:

OPENCLOSE
1
2,3,41
3,4,5,61,2
4,5,6,71,2,3
5,6,7,8,91,2,3,4
6,7,8,91,2,3,4,5
7,8,9,10,111,2,3,4,5 ,6
8,9,10,11,12,131,2,3,4,5 ,6,7
9,10,11,12,131,2,3,4,5 ,6,7 ,8
10,11,12,131,2,3,4,5 ,6,7 ,8,9
11,12,131,2,3,4,5 ,6,7 ,8,9,10
12,131,2,3,4,5 ,6,7 ,8,9,10,11
131,2,3,4,5 ,6,7 ,8,9,10,11,12

作业题2
根据右边的交通图,分别利用代价树的广度优先搜索哟和代价树的深度优先搜索求出从A点出发到达E点的路径

1.广搜:

OPENg(ni)CLOSEg(ni)
A
C1,B13,4A0
B1,D14,5A,C10,3
D1 ,E1,D25,6,8A,C1,B10,3,4
E1,D2 ,E26,8,8A,C1 ,B1,D10,3,4,5
D2,E28,8A,C1 ,B1,D1,E10,3,4,5,6

所以路线为:A——B(B1)——E(E1

2.深搜:

OPENc(ni,nj)CLOSEg(ni)
A
C1,B13,4A0
D1 ,B12,4A,C10,3
E1,B1,B23,4,4A,C1,D10,3,5
B1,B24,4A,C1 ,D1,E10,3,5,8

启发式搜索

估价函数f(x):g(x) + h(x)
g(x):从初始节点S0到约束节点x的实际代价
h(x):从约束节点x到目标节点Sg最优路径的估计代价

h(x)体现的问题自身的启发性,被称为启发函数

1.局部择优选择

扩展结点的方式:计算n的子节点的f(x),并按从小到大的顺序放入OPEN表首部

“局部”的含义:只在子节点的范围考察下一节点。

2.全局择优选择(有序搜索算法)

扩展结点的方式:计算了n的每个子节点的f(x)并加入OPEN后,需要对OPEN表中的所有节点按f(x)从小到大排序。

3.A*算法

在这里插入图片描述

A*算法步骤:
在这里插入图片描述

  1. ④中就是比较新的g值(g(SUC))和旧的g值(g(OLD)),新的g值小,就要修改SUC节点的f值,并且修改父节点为BESTNODE(先前的节点是BESTNODE的父节点)
  2. ⑥中SUCCESSOR在CLOSE表,就继续⑦
  3. 更详细的A*算法:有手写过程

关于h(n)的选择:(八数码问题)

  1. 选择一:节点n中不在目标状态中相应位置的数码个数
    尽管并不知道h*(n)具体为多少,但当采用单位代价时,通过对“不在目标状态中相应位置的数码个数”的估计,可以得出至少需要移动h(n)步才能够到达目标,显然h(n)≤h*(n)。因此它满足A*算法的要求。
    在这里插入图片描述
  2. 定义启发函数h(n)=p(n)为节点n的每一数码与其目标位置之间的距离总和
    显然有ω(n)≤p(n)≤h*(n),相应的搜索过程也是A*算法。
    然而,p(n)比ω(n)有更强的启发性信息,由h(n)=p(n)构造的启发式搜索树,比h(n)=ω(n)构造的启发式搜索树节点数要少。
    在这里插入图片描述
    在这里插入图片描述
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐