启发式图搜索
图搜索策略
图搜索策略112----⎧⎪⎧⎪⎨⎪⎩⎪⎪⎧⎪⎪⎪⎪⎪⎨⎨⎪⎪⎪⎩⎪⎪⎪⎪⎪⎧⎪⎨⎪⎩⎩⎧⎪⎨⎪⎩一、图搜索概论:①,树的定义和基本术语,图的意义②,图的存储结构2,图的定义1,顶点,2,边,③,显示图的常用术图搜索回顾3,图,4,数据元素隐式图术语,子集树,,排列树二、状态图搜索:①,搜索定义②,搜索树定义广度优先盲目穷举式深度优先有界深度优先全局择优1,树式搜索局部择优分启发式状态图搜索③,搜索方式分类*--A --121*2 4A ⎧⎧⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎩⎩⎪⎧⎪⎧⎪⎨⎪⎪⎩⎪⎨⎪⎧⎪⎪⎨⎪⎪⎩⎩⎩⎧⎧⎧⎪⎪⎨⎨⎪⎩⎨⎪⎪⎩⎪⎩A Beam Search 支界限最近择优算法算法随机碰撞盲目回溯穷举2,线式搜索不回溯启发式可回溯深度优先搜索穷举式搜索,盲目搜索广度优先搜索④,搜索策略盲目碰撞搜索,启发式搜索,⑤搜搜寻算法,3,二分取中查索法找算法算, ⎧⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎩⎩Branch and bound1 2⎧⎨⎩⎧⎨⎩1,猴子与香蕉三,简单实例回顾:2,猴子与香蕉的状态空间图,图搜索一般过程四,图搜索过程,图搜索框过程框图五,通过文章加深图搜索策略(《人工智能图搜索策略的研究》)一,图搜索概论:①图搜索回顾:1.11.2②图的存储结构:1.11.2③图及其术语:1.11.2显示图与隐式图:1.3,显示图的常用术语:1.4隐式图术语二,状态图搜索:①,搜索定义,②,搜索树定义:③,搜索方式分类:④图搜索策略:1.1盲目式搜索:1.2启发式搜索:⑤图搜索算法1.1树搜索方法1.3树搜索举例1.4状态图搜索:1.5状态图搜索举例⑥,常见搜索算法下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的或是比较生僻的,和计算机的不相干,所以没有选取。
第4章 搜索技术-图启发搜索 2012AI课件 人工智能教学课件
搜索技术中启发信息的用途:
① 用于决定要扩展的下一个节点,避免宽度优先或 深度优先搜索中的盲目(人为规定)地选择扩展节 点
② 在扩展一个节点的过程中,用于决定要生成哪一 个或哪几个后继节点,避免盲目地同时生成所有可 能的后继节点
③ 用于决定某些应该从搜索树中抛弃或修剪的节点
2020/10/3
以分成两个部分:
①已经付出的代价(起始节点到当前 当前节点
节点)
②将要付出的代价(当前节点到目标 节点)
2020/10/3
目标节点
节点 n 的估价函数 f ( n ) 定义为从初始 节点、经过 n 、到达目标节点的路径的 最小代价的估计值,即
f(n)=g(n)+h(n)
g ( n ) 是从初始节点到记0分,否则记
2分。中心位置有数字记1分,无数字记0分。所有的
总和为 h(n)
当
目
前
标
状
状
态
态
2020/10/3
有序搜索算法(方法、技术)
在搜索过程中,OPEN表中节点按照其估价函数值 以递增顺序排列,选择OPEN表中具有最小估价函 数值的节点作为下一个待扩展的节点,这种搜索 方法称为有序搜索
低
➢ 根据搜索过程、问题的启发信息来定义的,对
搜索效率会产生较大的影响
2020/10/3
➢ 用 f (n) 表示节点 n 的估价函数值,并且期 望,它是从起始节点、通过节点 n 、到达目 标节点的最小代价的一个估计值
起始节点
节点 n
2020/10/3
目标节点
估价函数的计算
起始节点
计算一个节点的“ 估价函数 ” ,可
每一个后继节点 j :
《启发式图搜索》课件
剪枝策略:根据启发式函数 进行剪枝,减少搜索空间
剪枝方法:使用A*算法、 IDA*算法等
剪枝效果:提高搜索效率, 减少计算量
剪枝优化:根据问题特性进 行剪枝优化,提高搜索效果
启发式图搜索 的优化方法
优先队列:一种特殊的数据结构,可以快速找到队列中的最大值或最小值 优化搜索过程:在启发式图搜索中,使用优先队列可以快速找到最优路径 应用场景:在路径规划、任务调度等领域,使用优先队列优化搜索过程可以提高效率 优缺点:优点是可以快速找到最优路径,缺点是实现较为复杂,需要一定的编程技巧
启发式图搜索
汇报人:PPT
目 录
添加目录标题
什么是启发式图 搜索
启发式图搜索的 原理
启发式图搜索的 实现
启发式图搜索的 优化方法
启发式图搜索的 应用案例
添加章节标题
什么是启发式 图搜索
启发式图搜索是一种人工智能算法,用于解决复杂问题。 它通过构建一个图,将问题分解为多个子问题,然后使用启发式函数来指导搜索过程。 启发式图搜索的优点是可以快速找到问题的解,并且可以处理大规模问题。 它广泛应用于各种领域,如计算机视觉、自然语言处理、机器人控制等。
十字链表:用十字链表表示 图,适用于稀疏图
邻接多重表:用多重链表表 示图,适用于稀疏图
边集树:用树表示边,适用 于稠密图
路径评估:根据 启发式函数评估 当前路径的代价
节点扩展:根据启 发式函数选择下一 个节点进行扩展
启发式函数:用于 评估路径代价的函 数,通常与问题相 关
路径代价:从当前 节点到目标节点的 总代价,包括路径 长度、节点代价等
原理:通过计算每个节点的优先级,选择优先级最高的节点进行搜索 特点:可以快速找到最优解,但需要计算每个节点的优先级 应用场景:适用于解决路径规划、任务调度等问题 优缺点:优点是可以快速找到最优解,缺点是需要计算每个节点的优先级,计算复杂度较高
A搜索算法
2
3
8
4
6
5
F (6 )
2
8
3
1
4
7
6
5
J (7 )
2
3
1
8
4
7
6
5
7
5.4.3 A搜索算法
open表和closed表内状态排列的变化情况
8
5.4.3 A搜索算法
启发式图搜索法的基本特点:如何寻找并设计一个与问
题有关的h(n) 及构出f (n) g(n) h(n), 然后以f (n) 的
大小来排列待扩展状态的次序,每次选择 f (n) 值最小者 进行扩展。
open表:保留所有已生成而未扩展的状态。 closed表:记录已扩展过的状态。 进入open表的状态是根据其估值的大小插入到表中合 适的位置,每次从表中优先取出启发估价函数值最小的 状态加以扩展。
4
5.4.3 A搜索算法
A(-5)
B(-3)
C(-4)
D(-6)
E(-5) F(-3) G(-4) H(-3)
I
J
K L(-5) M(-5) N O(-2) P(-3)
Q
R
S
T
U(-3)
5
5.4.3 A搜索算法
例5.8 利用A搜索算法求解八数码问题的搜索树,其估价函 数定义为
f (n) d (n) w(n)
begin
将该子状态从closed表移到open表中;
记录更短路径走向及其估价函数值;
end;
case end;
将n放入closed表中;
根据估价函数值,从小到大重新排列open表;
end;
*open表中结点已耗尽
第4章+图搜索技术_2(启发式)
g=0
h=3 f=3
A
优先队:FBH
设g 为已搜索的路程代价 h 为将付出的估计代价
F g=1 h=2 f=3 G h=1
B g=1 h=3 f=4
H g=1 h=4 f=5
F
h=3 A
h= 2
h=3
B
h=4
C
初始结点
h=2 h=3
D
h=1 h=2
E
h=0
目标结点
H
I
J
第4章 图搜索技术
(d)
A
算出f值对OPEN表重排序
(3)用于删除节点的选择,即用于决定应删除哪些
无用节点,以免造成进一步的时空浪费。
第4章 图搜索技术
一般来说启发信息过弱,产生式系统在找到一条 路径之前将扩展过多的节点,即求得解路径所需搜索 的耗散值(搜索花费的工作量)较大;相反引入强的 启发信息,有可能大大降低搜索工作量,但不能保证 找到最小耗散值的解路径(最佳路径),因此实际应
模式,需要具体问题具体分析。通常可以参考的思路 有:一个节点到目标节点的某种距离或差异的度量; 一个节点处在最佳路径上的概率;或者根据经验的主 观打分等等。例如,对于八数码难题,用h(x)就可表 示节点x的数码格局同目标节点相比,数码不同的位 置个数。
第4章 图搜索技术
4.启发式搜索算法
启发式搜索要用启发函数来导航,其搜索算法就 要在状态图一般搜索算法基础上再增加启发函数值的 计算与传播过程,并且由启发函数值来确定节点的扩 展顺序。为简单起见,下面我们仅给出树型图的树式 搜索的两种策略。
第4章 图搜索技术
4.1.5 加权状态图搜索
1. 加权状态图与代价树 例4.6 图4—8(a)是一个交通图,设A城是出发地,E 城是目的地,边上的数字代表两城之间的交通费。试 求从A到E最小费用的旅行路线。
启发式搜索算法
目录页
Contents Page
1. 启发式搜索算法定义 2. 启发式搜索算法分类 3. 启发式函数的设计与选择 4. A*算法的原理与实现 5. Dijkstra算法的原理与实现 6. 启发式搜索的应用场景 7. 启发式搜索的性能分析 8. 总结与未来展望
启发式搜索算法
启发式搜索算法定义
1.启发式搜索算法的时间复杂度取决于搜索空间的大小、启发 函数的计算复杂度以及搜索策略。 2.在一般情况下,启发式搜索算法的时间复杂度高于普通搜索 算法,因为需要计算启发函数值。 3.通过优化启发函数和搜索策略,可以降低启发式搜索算法的 时间复杂度。
▪ 启发式搜索算法的空间复杂度
1.启发式搜索算法的空间复杂度取决于搜索过程中需要保存的 信息数量。 2.在一般情况下,启发式搜索算法的空间复杂度高于普通搜索 算法,因为需要保存更多的节点和路径信息。 3.通过优化数据结构和搜索策略,可以降低启发式搜索算法的 空间复杂度。
A*算法的未来发展与趋势
1.随着人工智能和机器学习技术的不断发展,A*算法可以与这些技术相结合,进一步提高搜索效率 和精度。 2.未来A*算法的研究可以更加注重实际应用场景,针对具体问题进行优化和改进,提高算法的可靠 性和鲁棒性。 3.A*算法的发展趋势是向着更高效、更精确、更智能的方向发展,为各个领域的问题求解提供更加 优秀的解决方案。
启发式搜索算法分类
▪ 粒子群优化算法
1.粒子群优化算法是一种基于群体行为的启发式搜索算法,通 过粒子间的协作和竞争来寻找最优解。 2.该算法具有较快的收敛速度和较高的搜索效率,适用于处理 连续和多峰值问题。 3.粒子群优化算法需要合理设计粒子行为和更新规则,以提高 搜索性能和精度。
▪ 蚁群优化算法
《启发式图搜索》课件
启发式图搜索的应用场景
路径规划
游戏AI
在交通网络、通信网络等领域,启发 式图搜索算法可用于寻找最优路径, 如最短路径、最低成本路径等。
在游戏AI中,启发式图搜索算法可用 于实现游戏角色的行为规划、决策制 定等。
社交网络分析
在社交网络分析中,启发式图搜索算 法可用于发现社区结构、传播路径等 。
02 基础知识
启发式函数通常用于评估节点或边的 价值,以便在搜索过程中优先探索更 有希望的节点或边。
为什么我们需要启发式图搜索
解决大规模图搜索问题
启发式图搜索算法能够在大规模图中高效地找到最优路径,适用于诸如社交网络、交通网络等大规模图数据。
提高搜索效率
通过利用启发式信息,启发式图搜索算法可以在搜索过程中避免不必要的节点或边的探索,从而显著提高搜索效 率。
一种用于解决大规模稀疏图中带负权 重的最短路径问题的启发式图搜索算 法。
特点: Johnson算法在处理大规模稀 疏图时具有较好的性能,但在稠密图 或节点间距离变化较大的情况下可能 效果不佳。
Johnson算法通过预处理和后处理两 个阶段来找到最短路径,能够高效地 处理大规模稀疏图。
04 启发式图搜索的性能优化
游戏AI
要点一
总结词
游戏AI是启发式图搜索算法在游戏领域的应用,通过实现 智能决策和路径规划,可以提高游戏的可玩性和挑战性。
要点二
详细描述
在游戏AI中,启发式图搜索算法被用于实现智能决策和路 径规划。在角色扮演游戏、即时战略游戏等类型中,AI需 要能够根据游戏规则和环境信息进行智能决策和行动。通 过使用启发式图搜索算法,AI可以更高效地找到最优策略 和行动路径,提高游戏的可玩性和挑战性。
05 实际应用与案例分析
3.3-启发式搜索(2)
8
例1:水壶问题
给定4L和3L的水壶各一个,水壶上没有刻 度,可以向水壶中加水。如何在4L的壶中 准确地得到2L水?
这里:用(x,y)—4L壶里的水有xL,3L壶里的水 有yL,n表示搜索空间中的任一节点。 则给出下面的启发式函数:
人工智能 丁世飞
9
例1:水壶问题
h(n) = 2 =4 =8 =10 如果0< x < 4并且0< y < 3 如果0< x < 4或者0< y < 3 如果 x = 0并且 y = 3 或者 x =4 并且 y= 0 如果 x = 0 并且 y = 0 或者 x1 引言 3.2 盲目搜索 √3.3 启发式搜索(2) 启发式搜索(2)
人工智能 丁世飞 1
通用图搜索算法( 算法 算法) 3.3.3 通用图搜索算法(A算法)
图搜索算法只记录状态空间中那些被搜索 过的状态,它们组成一个搜索图 搜索图G 过的状态,它们组成一个搜索图G。 搜索图G由两种节点组成: 搜索图G由两种节点组成:
人工智能 丁世飞 17
A*算法 算法
有了g*(n) 和h*(n) 的定义,如果对最好优先的 的定义,如果对最好优先的 有了 启发式搜索算法中的 中的g(n)和h(n)做如下的限制: 做如下的限制: 启发式搜索算法中的 和 做如下的限制
人工智能 丁世飞
3
图搜索算法( 算法)(P78:算法3.8) 图搜索算法(A算法)(P78:算法3.8) 算法
Procedure Graph-Search Begin 建立一个只含有初始节点S 的搜索图 , 放入OPEN表;计算 0)=g(S0)+h(S0); 建立一个只含有初始节点 0的搜索图G,把S0放入 表 计算f(S 假定初始时CLOSED表为空。 表为空。 假定初始时 表为空 While OPEN 表不空 do Begin 表中取出f值最小的节点 第一节点),并放入 表中.假设该节点 从OPEN表中取出 值最小的节点 第一节点 并放入 表中取出 值最小的节点(第一节点 并放入CLOSED表中 假设该节点 表中 的编号为n。 的编号为 。 If n是目标 则停止 返回 并根据 的反向指针指出的从初始节点到 的路径。 是目标,则停止 返回n,并根据 的反向指针指出的从初始节点到n的路径 是目标 则停止;返回 并根据n的反向指针指出的从初始节点到 的路径。 Else do Begin (1) 生成 的子节点集合 i},把mI作为 的后继节点加入到 中,并计算 生成n的子节点集合 的子节点集合{m 把 作为n的后继节点加入到 的后继节点加入到G中 并计算 f(mi)。 。 (2) If mi未曾在 中出现过 即未曾在 未曾在G中出现过 即未曾在OPEN和CLOSED表中出现过 中出现过(即未曾在 表中出现过),then 将 和 表中出现过 它们配上刚计算过的f值 设置返回到 的指针,并把它们放入 设置返回到n的指针 并把它们放入OPEN表中。 表中。 它们配上刚计算过的 值,设置返回到 的指针 并把它们放入 表中
启发式图搜索过程
启发式图搜索过程姓名:学号:启发式图搜索过程一、过程A描述:① OPEN := (s), f(s) := g(s) + h(s);② LOOP : IF OPEN=() THEN EXIT(FAIL);③ n := FIRST(OPEN);④ IF GOAL(n) THEN EXIT(SUCCESS);⑤ REMOVE(n, OPEN) , ADD(n, CLOSED);⑥ EXPAND(n) {m i} , 计算f(n, m i) = g(n, m i) + h(m i); g(n, m i)是从s通过n 到m i的耗散值,f(n, m i)是从s通过n、m i到目标节点耗散值的估计;·ADD(m j , OPEN), 标记m i到n的指针。
·IF f(n, m k)<f(m k) THEN f(m k) := f(n, m k),标记m k到n的指针;比较f(n, m k)和f(m k),f(m k)是扩展n之前计算的耗散值。
·IF f(n, m l)<f(m1) THEN f(m l) := f(n, m l),标记m l到n的指针,ADD(m l,OPEN);当f(n, m l)<f(m l)时,把m l重放回OPEN中,不必考虑修改到其子节点的指针。
⑦ OPEN中的节点按f值从小到大排列;⑧ GO LOOP。
二、最佳图搜索算法A*:当在算法A的评价函数中,使用的启发函数h(n)是处在h*(n)的下界范围,即满足h(n)<=h*(n)时,则把这个算法称为算法A*。
在下面解决八数码问题的程序中,采用h(n)=P(n), P(n)定义为每一个将牌与其目标位置之间的距离的总和。
三、算法实现(1)数据结构class StateNode{public:int gs,hs,fs; //分别表示算法中的g(n)、h(n)、f(n) StateNode *psn; //一个指向扩展出它的父节点的指针StateNode(); //构造函数,初始化节点void putstartnode(); //输入开始节点void putgoalnode(); //输入目标节点int getnode(int i,int j); //读取node[i][j]void swap(int i,int j,int m,int n);//交换数组中指定位置的两个元素的数值bool operator ==(StateNode &sn);//重载了运算符==,方便后面进行比较void operator =(StateNode &sn);//重载了运算符=,方便后面对节点进行整体赋值void printstatenode();//将每个节点的内容按照一定格式输出private:int node[3][3]; //八数码的每个节点用一个二维数组存储};void evaluatefunction(StateNode &sn,StateNode &goal);//启发函数,计算某个节点的h(n)值bool isgoal(StateNode &sn,StateNode &goal);//判断当前节点是否目标节点bool uninlist(StateNode &sn,list<StateNode> &lsn);//判断当前节点是不是在OPEN表或者CLOSED表中void addtolist(StateNode &sn,list<StateNode> &lsn,list<StateNode> &lcsn);//根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式void expandnode(StateNode &sn,StateNode &goal,list<StateNode> &lsn,list<StateNode> &lcsn);//扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作list<StateNode> OPEN; //使用STL中的list类型来存放OPEN 表list<StateNode> CLOSED; //使用STL中的list类型来存放CLOSED表(2)运行过程演示:四、程序代码(C++):#include <iostream>#include <list>#include <math.h>using namespace std;#define MAXNUM 1000class StateNode //这是一个节点类型的类,定义了与节点相关的信息及函数{public:int gs,hs,fs;StateNode *psn;StateNode(){gs=0;hs=0;fs=gs+hs;psn=0;for (int i=0;i<3;i++){for (int j=0;j<3;j++){node[i][j]=0;}}}void putstartnode(){cout<<"请输入目标状态!(空闲的格子用0表示)"<<endl;for (int i=0;i<3;i++){for (int j=0;j<3;j++){cin>>node[i][j];}}cout<<endl;}void putgoalnode(){cout<<"请输入初始状态!(空闲的格子用0表示)"<<endl;for (int i=0;i<3;i++){for (int j=0;j<3;j++){cin>>node[i][j];}}cout<<endl;}int getnode(int i,int j) //读取node[i][j]{return node[i][j];}void swap(int i,int j,int m,int n) //交换数组中指定位置的两个元素的数值{int temp;temp=node[i][j];node[i][j]=node[m][n];node[m][n]=temp;}bool operator ==(StateNode &sn) //重载了运算符==,方便后面进行比较{int n=0;for (int i=0;i<3;i++){for (int j=0;j<3;j++){if (node[i][j]==sn.getnode(i,j)){n++;}}}if (n<9){return false;}else return true;}void operator =(StateNode &sn) //重载了运算符=,方便后面对节点进行整体赋值{for (int i=0;i<3;i++){for (int j=0;j<3;j++){node[i][j]=sn.getnode(i,j);}}this->gs=sn.gs;this->hs=sn.hs;this->fs=sn.fs;this->psn=sn.psn;}void printstatenode() //将每个节点的内容按照一定格式输出{for (int i=0;i<3;i++){for (int j=0;j<3;j++){cout<<node[i][j]<<" ";}cout<<"\n";}}protected:private:int node[3][3];};void evaluatefunction(StateNode &sn,StateNode &goal) //启发函数,计算某个节点的h(n)值{for (int i=0;i<3;i++){for (int j=0;j<3;j++){if (sn.getnode(i,j)!=goal.getnode(i,j) && sn.getnode(i,j)!=0){for (int m=0;m<3;m++){for (int n=0;n<3;n++){if (sn.getnode(i,j)==goal.getnode(m,n)){sn.hs+=(abs(i-m)+abs(j-n));}}}}}}}bool isgoal(StateNode &sn,StateNode &goal) //判断当前节点是否目标节点{return sn==goal;}bool uninlist(StateNode &sn,list<StateNode> &lsn){ //判断当前节点是不是在OPEN表或者CLOSED表中list<StateNode>::iterator iter;for (iter=lsn.begin();iter!=lsn.end();iter++){if (*iter==sn){return false;}}return true;}void addtolist(StateNode &sn,list<StateNode> &lsn,list<StateNode> &lcsn){ //根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式list<StateNode>::iterator iter;list<StateNode>::iterator iterc;if (uninlist(sn,lsn) && uninlist(sn,lcsn)){for (iter=lsn.begin();iter!=lsn.end() && sn.fs>=iter->fs;iter++){}lsn.insert(iter,sn);}else if(!uninlist(sn,lsn)){for (iter=lsn.begin();iter!=lsn.end();iter++){if (*iter==sn) {break;}}if (iter->fs>sn.fs) {*iter=sn;}}else if (!uninlist(sn,lcsn)){for (iterc=lcsn.begin();iterc!=lcsn.end();iterc++){if (*iterc==sn) {break;}}if(iterc->fs>sn.fs){for (iter=lsn.begin();iter!=lsn.end() && sn.fs>=iter->fs;iter++){}lsn.insert(iter,*lcsn.erase(iterc));}}}void evaluandadd(StateNode &temsn,StateNode &sn,StateNode &goal,list<StateNode> &lsn,list<StateNode> &lcsn){temsn.gs=sn.gs+1;temsn.hs=0;evaluatefunction(temsn,goal);temsn.fs=temsn.gs+temsn.hs;addtolist(temsn,lsn,lcsn);}void expandnode(StateNode &sn,StateNode &goal,list<StateNode> &lsn,list<StateNode> &lcsn){ //扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作StateNode temsn;list<StateNode>::iterator iter;for (int i=0;i<3;i++){for (int j=0;j<3;j++){if (sn.getnode(i,j)==0){if (i>0) //向左移动{temsn=sn;temsn.swap(i,j,i-1,j);temsn.psn=&sn;evaluandadd(temsn,sn,goal,lsn,lcsn);}if (i<2) //向右移动{temsn=sn;temsn.swap(i,j,i+1,j);temsn.psn=&sn;evaluandadd(temsn,sn,goal,lsn,lcsn);}if (j>0) //向上移动{temsn=sn;temsn.swap(i,j,i,j-1);temsn.psn=&sn;evaluandadd(temsn,sn,goal,lsn,lcsn);}if (j<2) //向下移动{temsn=sn;temsn.swap(i,j,i,j+1);temsn.psn=&sn;evaluandadd(temsn,sn,goal,lsn,lcsn);}}}}}int main(){StateNode Start,SN[MAXNUM],Goal;int i,j=0;list<StateNode> OPEN;list<StateNode> CLOSED;list<StateNode>::iterator iter;list<StateNode>::iterator iterc;Goal.putgoalnode();Start.putstartnode();evaluatefunction(Start,Goal);Start.gs=0;Start.fs=Start.gs+Start.hs;OPEN.push_back(Start);for (iter=OPEN.begin(),i=0;iter!=OPEN.end() && i<MAXNUM;iter=OPEN.begin(),i++) {if (OPEN.empty()) {return 0;}SN[i]=OPEN.front();if (isgoal(SN[i],Goal)){cout<<"搜索过程如下所示:"<<endl;for (StateNode *tempsn=&SN[i];!(*tempsn==Start);tempsn=tempsn->psn,j++){cout<<"第"<<j<<"步搜索:"<<endl;tempsn->printstatenode();cout<<endl;}cout<<"第"<<j<<"步搜索:"<<endl;Start.printstatenode();return 1;}OPEN.pop_front();CLOSED.push_back(SN[i]);if (CLOSED.size()>MAXNUM){cout<<"该初始节点不可扩展至目标节点!"<<endl;return 0;}expandnode(SN[i],Goal,OPEN,CLOSED);}return 0;(注:可编辑下载,若有不当之处,请指正,谢谢!)。
第五章 启发式搜索课件
[S3,S2,S1,S0]
。。 。。 。。。 。。。
5.3.3 深度优先搜索策略
深度优先搜索:首先扩展最新产生的节点,深度相等的节 点可以任意排列的搜索方法。(用堆栈的数据结构)
特点:搜索沿着状态空间的某单一路径沿着起始点向下进
行下去,仅当搜索到达一个没有后裔的状态时,才选择另 S0 一条替代路径。 1 10
5.3
盲目的图搜索策略
5.4 启发式图搜索策略 5.5 与/或图搜索策略
5.3 盲目的图搜索策略
5.3.1 回溯策略
5.3.2 宽度优先搜索策略
5.3.3 深度优先搜索策略
5.3.1 回溯策略
带回溯策略的搜索:(走不通就回头) 从初始状态出发,不停地、试探性地寻找路径, 直到它到达目的或“不可解结点”,即“死胡同” 为止。 若它遇到不可解结点就回溯到路径中最近的父结 点上,查看该结点是否还有其他的子结点未被扩展 。 若有,则沿这些子结点继续搜索;如果找到目标,
(3) NSS(no solvable states)表:不可解状态集,列出 了找不到解题路径的状态。如果在搜索中扩展出的 状态是它的元素,则可立即将之排除,不必沿该状 态继续搜索。
1 A B 2 5.3.1 回溯策略
8 C 11 D
E 3 回溯搜索示意图的回溯轨迹: 10 H 6 F 9 G 初值:PS=[A]; NPS=[A]; NSS=[ ]; CS=A。 J 5 7 K
5.1.2 搜索策略
3.人工智能的主要搜索策略: 求最佳解的搜索策略: 大英博物馆法(British museum); 宽度优先法(Breadth-first search); 分支界定法(Branch and Bound); 最佳图搜索法(A*); 动态规划法(Dynamic Programing);
人工智能课件-启发式搜索问题-3
有信息搜索算法
• • • • • • • • • 启发式搜索算法A 最佳优先搜索算法 贪婪最佳优先搜索算法 A*算法 局部搜索算法 爬山法 模拟退火算法 局部定向算法 遗传算法
启发式搜索算法
• 启发式信息在问题求解中的应用最早出现在1958年西蒙和 纽厄尔的一篇早期论文中,但是短语“启发式搜索”和估 计到目标距离的启发函数出现的比较晚(纽厄尔和 Ernst,1965;Lin,1965).随后,1966年Doran和Miche对启 发式搜索应用于许多问题进行了广泛的研究,尤其是对八 数码和十五数码游戏。虽然Doran和Miche完成了在启发式 搜索中路径长度和“外显率”(路径长度和已经访问过的 节点总数的比率)的理论分析,但他们忽略了当前路径长 度提供的信息;Hart,尼尔森和Raphael于1968年提出了 A*算法,将当前路径长度与启发式搜索相结合,后来Hart 等人于1972年又做了一些修正;以后人们陆续对算法进行 改进;1985年Dechter和Pearl论证了A*算法的最优效率。 迄今为止关于启发式和启发式搜索算法的最前面资料是 Pearl于1984撰写的教材《启发式》,感兴趣的同学可以 参阅。搜索算法的最新结果通常出现在《人工智能》上。
启发式搜索算法A
• 启发式搜索是利用问题拥有的启发信息来引导搜索,达 到减少搜索范围,降低问题复杂度的目的。这种利用启 发信息的搜索过程都称为启发式搜索方法。在研究启发 式搜索方法时,先说明一下启发信息应用,启发能力度 量及如何获得启发信息这几个问题,然后再来讨论算法 及一些理论问题。 一般来说: • 启发信息强,可以降低搜索的工作量,但可能导致找不 到最优解; • 启发信息弱,一般会导致搜索的工作量加大,极端情况 下演变为盲目搜索,但有可能找到最优解。 我们希望,通过引入启发知识,在保证找到最佳解的情 况下,尽可能减少搜索范围,提高搜索效率。
盲目搜索启发式搜索
特点:重排OPEN表,选择最有希望的节点加以扩展 种类:最佳优先搜索、A*算法等
2020/12/23
33
1、 启发式搜索策略
启发信息按其用途可分为3种: (1) 用于决定要扩展的下一个节点,以免像在宽度优
先或深度优先搜索中那样盲目地扩展。 (2) 在扩展一个节点的过程中,用于决定要生成哪一
在深度优先搜索中,首先扩展最新产生的(即最深的)节点 (深度相等的节点可以任意排列)。其结果是搜索沿着状态 空间某条单一的路径从起始节点向下进行下去;只有当搜索 到达一个没有后裔的状态时,它才考虑另一条替代的路径。 替代路径与前面已经试过的路径不同之处仅仅在于改变最后 n步,而且保持n尽可能小。
2020/12/23
OPEN表的前头。如果没有后裔,则转向(2)。 (6) 如果后继节点中有任一个为目标节点,则求得一
个解,成功退出;否则,转向(2)。
2020/12/23
27
算法动态演示图
2020/12/23
28
例如:按深度优先搜索生成八数码难题搜索树,设置深度 界限为5。 下图绘出了搜索树,粗线条的路径表明含有5条应用 规则的一个解。从图可见,深度优先搜索过程是沿着一条 路径进行下去,直到深度界限为止,然后再考虑只有最后 一步有差别的相同深度或较浅深度可供选择的路径,接着 再考虑最后两步有差别的那些路径,等等。
基本思想:从初始节点S开始,逐层地对节点进行扩展并考 察它是否为目标节点,在第n层的节点没有全部扩展并考 察之前,不对第n+1层的节点进行扩展。OPEN表中的节 点总是按进入的先后顺序排列,先进入的节点排在前面, 后进入的排在后面。
14
宽 度 优 先 搜 索 示 意 图
启发式搜索
开始
把S放入OPEN表, 计算估价函数 f (s)
OPEN表为空表?
是
失败
否 把OPEN表中的第一个节点n放入CLOSED表
n为目标节点吗?
是
成功
否 扩展n,计算所有子节点的估价函数值, 并提供它们返回节点n的指针。 把子节点送入OPEN表,并对其中的所有 节点按估价函数值由小到大重排。
最佳优先搜索算法框图
登山法算法步骤:
① ② ③ ④ ⑤ 设定初始节点n; 如果n是目标,则成功退出; 扩展n,得到其子节点集合; 从该集合中选取f(n)为最小的节点n’; 将n’设为n,返回第②步。
最佳优先搜索算法
• 是“登山法”的推广,但它是对OPEN表中 所有节点的f(n)进行比较,按从小到大的顺 序重排OPEN表。 • 其算法效率类似于纵向搜索算法,但使用 了与问题特性相关的估价函数来确定下一 步待扩展的节点,因此是一种启发式搜索 方法。
1
F(6)
2
4 E(4)
G(5)
H(3)
3
5 6
A(2)
C(3)
B(0)
注:每个节点小括号内的数值表示该节点 到目标的空间距离,即该点的估价函数 值。搜索得到的路径如黄线所示。
•
举例:
八数码魔方(8-puzzle problem)
2 1 7 8 6 3 4 5 1 8 7 2 6 3 4 5
(初始状态)
g(n)的计算方法:
• g(n)就是在搜索树中从S到n这段路径的 代价,这一代价可以由从n到S寻找指针 时,把所遇到的各段弧线的代价加起来 给出 ( 这条路径就是到目前为止用搜索 算法找到的从S到n的最小代价路径)。
h(n)的计算方法:
• h(n) 依赖于有关问题的领域的启发信息。 这种信息可能与八数码魔方问题中的函 数 W(n) 所用的那种信息相似。把 h(n) 叫 做启发函数。
启发式图搜索
1. 启发式搜索
• 定义:为减小搜索范围而需要利用某 些已知旳、有关详细问题领域旳特征 信息。此种信息叫做启发信息。利用 启发信息旳搜索措施叫做启发式搜索 措施。
• 特点:重排OPEN表,选择最有希望旳 节点加以扩展
• 种类:最佳优先搜索、A*算法等
启发式搜索策略
• 有关详细问题领域旳信息经常能够用来 简化搜索。一种比较灵活(但代价也较 大)旳利用启发信息旳措施是应用某些 准则来重新排列每一步OPEN表中全部 节点旳顺序。然后,搜索就可能沿着某 个被以为是最有希望旳边沿区段向外扩 展。应用这种排序过程,需要某些估算 节点“希望”旳量度,这种量度叫做估 价函数(evalution function)
• 其算法效率类似于纵向搜索算法,但使用 了与问题特征有关旳估价函数来拟定下一 步待扩展旳节点,所以是一种启发式搜索 措施。
开始
把S放入OPEN表, 计算估价函数 f (s)
是 OPEN表为空表?
否 把OPEN表中旳第一种节点n放入CLOSED表
是 n为目的节点吗?
否 扩展n,计算全部子节点旳估价函数值,
28 3
16 4
7
5
旳f(n)值等于4。
• 第②步有三种情况,我们选择其中
f(n)最小旳:
(5) 2 8 3 16 4
75
28 3
(3)
1
4
76 5
28 3 (5) 1 6 4
75
• 其他依次类推.最终用了7步得出了成果.
3. A算法
• 最佳优先算法有时无法得到最优解,因
为它旳估价函数f旳选用时,忽视了从 初始节点到目前节点旳代价值。所以, 可考虑每个节点n旳估价函数f(n)分为两 个分量:从起始节点到节点n旳代价g(n) 以及从节点n到达目旳节点代价旳估算 值h(n)。
第三章 搜索(2)—启发式搜索
启发式搜索
3.0 简介
启发式搜索基本思想:
定义一个评价函数f,对当前的搜索状态进行评估, 找出一个最有希望的节点来扩展。
第三章 - 10
启发式搜索
3.0 简介
评价函数
f(n) = g(n) + h(n)
f(n):评价函数 h(n):启发函数
符号的意义
f*(n)=g*(n)+h*(n)
启发式搜索
3.1.0 局部择优搜索
Arad Sibiu
Arad (366)
Fagaras (176)
Oradea (380)
Rimnicu Vilcea (193) Arad
Sibiu
Fagaras
Sibiu (253)
Bucharest (0)
第三章 - 19
启发式搜索
3.1.0 局部择优搜索
第三章 - 20
启发式搜索
内容
3.0 简介 3.1 启发式搜索算法
3.1.0 局部择优搜索 3.1.1 全局择优搜索(A算法) * 3.1.2 A 算法
3.2 应用举例 3.3 基于搜索的优化问题
第三章 - 21
启发式搜索
3.1.1 A算法
A算法也称为最佳优先搜索 (best-first search)
o
2 3
目标节点: q
q
第三章 - 27
启发式搜索
(1) (2) (3) (4)
(5)
(6) (7) (8) (9) (10) (11)
(12)
(13)
(14)
第三章 - 28
基于动态阈值启发式图搜索的SLAM算法
回溯机制实现对错误 数据 的修正 , 在搜索过程 中使用动态闽值进行 门限过滤 ,减少可能 的数据 关联 的数 目,在不降低数据 关联正确率 的情 况下 ,提高数据 关联 效率 。仿真实验结果表明 ,该算法可有效地 降低 运算时间。 关健词 :数据 关联 ;启 发式图搜 索 ;动态阈值 ;在线修正 ;回溯
S LAM g rt m s d 0 e rsi r p e r h Al o ih Ba e nH u itcG a h S a c
wih na i t Dy m cThr s l e ho d
F ENG n CHAIHo g x a S Li , n - i , UN a , N h - u n T o YI Z iy a
中 分 号: P0・ 田 类 T31 6
基 于动 态 阈值启 发 式 图搜 索的 S A 算 法 L M
冯 林 ,柴红霞 ,孙 焘 ,殷志远
( 理工大学创新实验学院 ,辽宁 大连 16 2 ) 大连 10 3
摘
要: 针对 当前多数 S A 数据关联算法存在不能在线修正 的问题 , 出一种 使用动态阈值 的启发式 图搜索数据关联算法 。 LM 提 该方法使 用
第3 7卷 第 1 7期
、o .7 厂13
・
计
算
机
工
பைடு நூலகம்
程
2 I 年 9月 01
Se e ptmbe 01 r2 1
N o.7 1
Co utrEn n e i g mp e gi e rn
人工智能及识别技术 ・
文 编号 1 o 3 80 ) — 1 — 3 文 标 码; 章 : o _ 4 ( 11 8 o 22 1 7 5 献 识 A
人工智能启发式图搜索算法
启发式图搜索算法摘要:启发式搜索策略概述和有序搜索。
启发式搜索弥补盲目搜索的不足,提高搜索效率。
一种方法用于排列待扩展节点的顺序,即选择最有希望的节点加以扩展,那么,搜索效率将会大为提高。
进行搜索技术一般需要某些有关具体问题领域的特性的信息。
关键词:启发式搜索;估价函数;有序搜索;A*算法;正文:启发式图搜索的意义因为无信息图搜索算法的效率低,耗费过多的计算空间与时间,这是组合爆炸的一种表现形式。
所以引入了启发式图搜索算法。
启发式图搜索算法就是进行搜索技术一般需要某些有关具体问题领域的特性的信息,把此种信息叫做启发信息。
利用启发信息的搜索方法叫做启发式搜索方法。
关于图搜索的启发式搜索算法就叫做启发式图搜索算法。
启发式图搜索策略:假设初始状态、算符和目标状态的定义都是完全确定的,然后决定一个搜索空间。
因此,问题就在于如何有效地搜索这个给定空间。
启发信息按其用途可分为下列3种:(1) 用于决定要扩展的下一个节点,以免像在宽度优先或深度优先搜索中那样盲目地扩展。
(2) 在扩展一个节点的过程中,用于决定要生成哪一个或哪几个后继节点,以免盲目地同时生成所有可能的节点。
(3) 用于决定某些应该从搜索树中抛弃或修剪的节点。
启发信息的状态空间搜索算法,即决定哪个是下一步要扩展的节点。
这种搜索总是选择“最有希望”的节点作为下一个被扩展的节点。
这种搜索叫做有序搜索(ordered search)。
有关具体问题领域的信息常常可以用来简化搜索。
一个比较灵活(但代价也较大)的利用启发信息的方法是应用某些准则来重新排列每一步OPEN表中所有节点的顺序。
然后,搜索就可能沿着某个被认为是最有希望的边缘区段向外扩展。
应用这种排序过程,需要某些估算节点“希望”的量度,这种量度叫做估价函数(evalution function)。
所谓的估价函数就是为获得某些节点“希望”的启发信息,提供一个评定侯选扩展节点的方法,以便确定哪个节点最有可能在通向目标的最佳路径上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A*算法的性质(续3)
定理2: 对无限图,若从初始节点s到目标节点t有 路径存在,则A*一定成功结束。
A*算法的性质(续4)
推论2.1: OPEN表上任一具有f(n)<f*(s)的节点n, 最终都将被A*选作扩展的节点。
A*算法的性质(续5)
定理3 (可采纳性定理): 若存在从初始节点s到目标节点t有路径, 则A*必能找到最佳解结束。
P( wi | wi 1 )CF ( wi )
n
最大
汉字识别后处理
P( S | O) P( S ) P(O | S ) P(O)
P( S ) P( wi | w1...wi 1 )
i 1
二元语法时:
n
P( S ) P( wi | wi 1 )
i 1
n
P (O ) 为常量 P(O | S ) 用识别信度代替
问题变为求
i 1
简写:如果h2(n) > h1(n), 则A1扩展的节点数≥A2扩展的节点数
3,A*算法的改进
问题的提出: 因A算法第6步对ml类节点可能要重新放 回到OPEN表中,因此可能会导致多次重 复扩展同一个节点,导致搜索效率下降。
一个例子: OPEN表
s(10)
1 C(8) 1 3 6
CLOSED表
h单调的性质(续)
定理6: 若h(n)是单调的,则由A*所扩展的节点 序列其f值是非递减的。
h单调的例子
8数码问题:
– h为“不在位”的将牌数
h(ni) - h(nj) = h(t) = 0 c(ni, nj) = 1
1 0 -1
(nj为ni的后继节点)
满足单调的条件。
对算法加以改进
一些结论:
…... mk
…... mj
…... ml
…...
…...
一个A算法的例子
2 8 3 1 6 4 7 5 1 2 8 7 6 3 4 5
定义评价函数: f(n) = g(n) + h(n) g(n)为从初始节点到当前节点的耗散值 h(n)为当前节点“不在位”的将牌数
h计算举例
1 2 2 8 8 1 6 7 3 3 4 5 4 5
2.4 启发式图搜索
利用知识来引导搜索,达到减少搜索范 围,降低问题复杂度的目的。 启发信息的强度
– 强:降低搜索工作量,但可能导致找不到最
优解 – 弱:一般导致工作量加大,极限情况下变为 盲目搜索,但可能可以找到最优解
希望:
引入启发知识,在保证找到最佳解的情 况下,尽可能减少搜索范围,提高搜索 效率。
3
4,其他的搜索算法
爬山法(局部搜索算法)
其他的搜索算法(续1)
随机搜索算法 动态规划算法 如果对于任何n,当h(n)=0时,A*算法就 成为了动态规划算法。
动态规划
s
t
第一阶段
第二阶段
第三阶段
第四阶段
第五阶段
5,搜索算法实用举例
汉字识别后处理 一个例子
我钱线载哦栽哉裁劣绥 优仍们仿伦奶砧犯扔妨 要耍密穷安壁驻努窑垂 扳报叔嵌奴振技寂叙蔽 奋夯杏蚕香脊秀吞吝番 精猜指洁括治捐活冶桔 种神衬祥科钟拌样拎补
前面的例子: OPEN表
s(10)
1 C(8) 1 3 6
s(0+10) A(6+1) B(3+5) C(1+8) A(6+1) B(2+5) s(0+10) s(0+10) C(1+8) s(0+10) C(1+8) B(2+5) 10 10 10
CLOSED表
fm
B(5)
8
1
A(1)
Hale Waihona Puke A(3+1)s(10) A(7) B(8) C(9) B(8) C(9) G(14)
A(1)
s(10) A(7) s(10)
B(8) s(10) A(5) B(8) s(10) C(9) A(5) s(10) B(7) C(9) s(10) A(4) B(7) C(9) s(10)
B(5)
8
1
A(5) C(9) G(14) C(9) G(12) B(7) G(12) A(4) G(12) G(11)
A*算法的性质(续6)
推论3.1: A*选作扩展的任一节点n,有f(n)≤f*(s)。
A*算法的性质(续7)
定理4:设对同一个问题定义了两个A*算 法A1和A2,若A2比A1有较多的启发信 息,即对所有非目标节点有h2(n) > h1(n), 则在具有一条从s到t的路径的隐含图上, 搜索结束时,由A2所扩展的每一个节点, 也必定由A1所扩展,即A1扩展的节点数 至少和A2一样多。
G(11+0)
s(0+10)C(1+8)B(2+5)A(3+1)
10
G 目标
知识的灵活应用
例:如何转动,使得每个扇区数字和为12。
3 1 5 5 2 2 5 1 2 2 35 3 2 3
2
3 4
3 4
5 1
5
3 4
4
2
1 4
3
1
分析: 阴影部分数字和:48 直径部分数字和:24 转45∘改变阴影部分 转90 ∘改变直径部分 但不改变阴影部分 转180 ∘改变扇区部分 但不改变阴影部分 也不改变直径部分
在A算法中,如果满足条件: h(n)≤h*(n) 则A算法称为A*算法。
A*条件举例
8数码问题
– h(n) = “不在位”的将牌数 – h(n) = 将牌“不在位”的距离和
1 2 2 8 8 1 6 7 7 6 3 3 4 5 4 5
将牌1:1 将牌2:1 将牌6:1 将牌8:2
A*算法的性质
G 目标
出现多次扩展节点的原因
在前面的扩展中,并没有找到从初始节 点到当前节点的最短路径,如节点A。
解决的途径
对h加以限制
– 能否对h增加适当的限制,使得第一次扩展
一个节点时,就找到了从s到该节点的最短 路径。
对算法加以改进
– 能否对算法加以改进,避免或减少节点的多
次扩展。
改进的条件
可采纳性不变 不多扩展节点 不增加算法的复杂性
8 3 2 1 4 7 6 5
2 8 3 7 1 4 6 5
2 3 1 8 4 I(5) 7 6 5 1 2 3 8 4 7 6 5
6
2 3 1 8 4 7 6 5
J(7)
G(6)
H(7)
K(5)
1 2 3 7 8 4 6 5
L(5)
1 2 3 8 4 7 6 5
目标
M(7)
2,最佳图搜索算法A*(A*算法)
计算f(n, mi):=g(n, mi)+h(mi);
A算法(续)
ADD(mj, OPEN), 标记mj到n的指针; IF f(n, mk)<f(mk) THEN f(mk):=f(n, mk), 标记mk到n的指针;
IF f(n, ml)<f(ml,) THEN f(ml):=f(n, ml), 标记ml到n的指针, ADD(ml, OPEN); 7, OPEN中的节点按f值从小到大排序; 8, GO LOOP;
定理1: 对有限图,如果从初始节点s到目标节点t 有路径存在,则算法A一定成功结束。
A*算法的性质(续1)
引理2.1 : 对无限图,若有从初始节点s到目标节点t 的路径,则A*不结束时,在OPEN表中 即使最小的一个f值也将增到任意大,或 有f(n)>f*(s)。
A*算法的性质(续2)
引理2.2: A*结束前,OPEN表中必存在f(n)≤f*(s)。
7 6
h(n) =4
2 8 3 1 6 4 7 5 2 8 3 1 6 4 7 5
3
s(4)
1
A(6)
2 8 3 1 4 7 6 5 2 3 1 8 4 7 6 5
2
B(4)
4
2 8 3 1 6 4 7 5 2 8 3 1 4 7 6 5
5
C(6)
2 8 3 1 4 D(5) 7 6 5
E(5)
F(6)
对h加以限制
定义:一个启发函数h,如果对所有节点 ni和nj,其中nj是ni的子节点,满足 h(ni) - h(nj) ≤ c(ni, nj) ni h(t) = 0 则称h是单调的。 c(ni,nj)
nj h(nj) h(ni)
h单调的性质
定理5: 若h(n)是单调的,则A*扩展了节点n之后, 就已经找到了到达节点n的最佳路径。 即:当A*选n扩展时,有g(n)=g*(n)。
g(n)、h(n)、f(n)分别是g*(n)、h*(n)、f*(n) 的估计值
A算法
1, OPEN:=(s), f(s):=g(s)+h(s); 2, LOOP: IF OPEN=( ) THEN EXIT(FAIL); 3, n:=FIRST(OPEN); 4, IF GOAL(n) THEN EXIT(SUCCESS); 5, REMOVE(n, OPEN), ADD(n, CLOSED); 6, EXPAND(n) →{Mi},
1, OPEN:=(s), f(s)=g(s)+h(s), fm:=0; 2, LOOP: IF OPEN=( ) THEN EXIT(FAIL); 3, NEST:={ni|f(ni)<fm} IF NEST ≠ ( ) THEN n:=NEST中g最小的节点 ELSE n:=FIRST(OPEN), fm:=f(n); 4, …, 8: 同过程A。