【人工智能】搜索策略
③M中已经在G中出现过且已经扩展过的节点,确认是否需要修改其后继节点指向父节点的指针。step3:(OPEN表非空)去OPEN表的第一个节点,放入CLOSE表中,记为n。①M中未曾在G中出现过的节点,设置一个指向父节点(n)的指针,并加入OPEN表中。扩展结点的方式:计算n的子节点的f(x),并按从小到大的顺序放入OPEN表首部。扩展结点的方式:计算了n的每个子节点的f(x)并加入OPEN后,需要
搜索的两层含义:
- 找到从初始事实到问题最终答案的一条推理路线。
- 时间、空间复杂度最小。
盲目搜索
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)广度优先搜索
深度优先搜索:
OPEN | CLOSE |
---|---|
1 | |
4,3,2 | 1 |
6,5,4,3 | 1,2 |
6,4,3 | 1,2,5 |
11,10,4,3 | 1,2,5,6 |
11,4,3 | 1,2,5,6,10 |
4,3 | 1,2,5,6,10,11 |
7,4 | 1,2,5,6,10,11,3 |
13,12,4 | 1,2,5,6,10,11,3,7 |
13,4 | 1,2,5,6,10,11,3,12 |
- 既要满足深搜在扩展OPEN表时将扩展结点放入OPEN表的头部,又要满足题目选择最左分支的情况(就是从引入CLOSE表的n节点的子节点集合M中,选取其序号最小的节点,比如对于n=2,子节点引入OPEN的顺序为6,5,小的序号是5,也就是下一步要扩展到最左节点)
- 关于深搜将扩展结点放入OPEN表首部,此博客有详细图示
广度优先搜索:
OPEN | CLOSE |
---|---|
1 | |
2,3,4 | 1 |
3,4,5,6 | 1,2 |
4,5,6,7 | 1,2,3 |
5,6,7,8,9 | 1,2,3,4 |
6,7,8,9 | 1,2,3,4,5 |
7,8,9,10,11 | 1,2,3,4,5 ,6 |
8,9,10,11,12,13 | 1,2,3,4,5 ,6,7 |
9,10,11,12,13 | 1,2,3,4,5 ,6,7 ,8 |
10,11,12,13 | 1,2,3,4,5 ,6,7 ,8,9 |
11,12,13 | 1,2,3,4,5 ,6,7 ,8,9,10 |
12,13 | 1,2,3,4,5 ,6,7 ,8,9,10,11 |
13 | 1,2,3,4,5 ,6,7 ,8,9,10,11,12 |
作业题2
根据右边的交通图,分别利用代价树的广度优先搜索哟和代价树的深度优先搜索求出从A点出发到达E点的路径
1.广搜:
OPEN | g(ni) | CLOSE | g(ni) |
---|---|---|---|
A | |||
C1,B1 | 3,4 | A | 0 |
B1,D1 | 4,5 | A,C1 | 0,3 |
D1 ,E1,D2 | 5,6,8 | A,C1,B1 | 0,3,4 |
E1,D2 ,E2 | 6,8,8 | A,C1 ,B1,D1 | 0,3,4,5 |
D2,E2 | 8,8 | A,C1 ,B1,D1,E1 | 0,3,4,5,6 |
所以路线为:A——B(B1)——E(E1)
2.深搜:
OPEN | c(ni,nj) | CLOSE | g(ni) |
---|---|---|---|
A | |||
C1,B1 | 3,4 | A | 0 |
D1 ,B1 | 2,4 | A,C1 | 0,3 |
E1,B1,B2 | 3,4,4 | A,C1,D1 | 0,3,5 |
B1,B2 | 4,4 | A,C1 ,D1,E1 | 0,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*算法步骤:
- ④中就是比较新的g值(g(SUC))和旧的g值(g(OLD)),新的g值小,就要修改SUC节点的f值,并且修改父节点为BESTNODE(先前的节点是BESTNODE的父节点)
- ⑥中SUCCESSOR在CLOSE表,就继续⑦
- 更详细的A*算法:有手写过程
关于h(n)的选择:(八数码问题)
- 选择一:节点n中不在目标状态中相应位置的数码个数
尽管并不知道h*(n)具体为多少,但当采用单位代价时,通过对“不在目标状态中相应位置的数码个数”的估计,可以得出至少需要移动h(n)步才能够到达目标,显然h(n)≤h*(n)。因此它满足A*算法的要求。
- 定义启发函数h(n)=p(n)为节点n的每一数码与其目标位置之间的距离总和。
显然有ω(n)≤p(n)≤h*(n),相应的搜索过程也是A*算法。
然而,p(n)比ω(n)有更强的启发性信息,由h(n)=p(n)构造的启发式搜索树,比h(n)=ω(n)构造的启发式搜索树节点数要少。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)