厦门理工算法设计与分析(第六章)解读.ppt

计算机算法设计与分析 第六章 分支限界法 树搜索的一般形式 SearchTree(Space T) {ok = 0; L = T.initial; while (!ok || L≠?) { a = L.first; if (a is goal) unfinish = false else Control-put-in(L, Sons(a)); } 分支限界法基本思想 分支限界法就是最佳优先(包括广度优先)的搜索法。其基本思想是:将要待考察的结点按其优劣排序,优先搜索好结点。 于是便有了两个问题: (1)如何知道结点的优劣? (2)在回溯法中,表L中结点的层次分明,因而路径也分明。但是这里排序会打乱表L中结点的层次,那又如何找回解的路径呢? 分支限界法基本思想 分支限界法就是最佳优先(包括广度优先)的搜索法。其基本思想是:将要待考察的结点按其优劣排序,优先搜索好结点。 于是便有了两个要点: (1)需要构造评价结点优劣的评价函数。 (2)需要能够重新构造解的路径,也就是搜索的路径。 评价函数的构造 评价函数要能够提供一个评定候选扩展结点的方法,以便确定哪个结点最有可能在通往目标的最佳路径上。 一个评价函数f(d)通常由两个部分构成: ⑴从开始结点到d的已有耗损值g(d),和 ⑵再从d到达目标的期望耗损值h(d)。即: f(d) = g(d) + h(d)。 通常g(d)的构造较易,h(d)的构造较难。 搜索路径的构造 在回溯法中,每次仅考察一条路径,因而只需要构造这一条路径即可:前进时记下相应结点,回溯时删去最末尾结点的记录。这比较容易实现。 在分支限界法中,是同时考察若干条路径,那么又该如何构造搜索的路径呢? 往前看,前程无数!往回看,来路一条。每个结点只要记住其前驱结点就行了! 搜索路径的构造 为此,只需要对每一个扩展的结点d,建立三个信息: (1)该结点的名称d; (2)它的评价函数值f(d); (3)指向其前驱的指针p; 即表示为[d, f(d), p]。 这样一旦找到目标,即可以很方便地逆向构造出该路径。 Open表与Closed表 搜索中,表L用来保存准备扩展的结点,即下一步的结点。把表L称为Open表。 此外,为了构造解的路径,还需要一个表来保存已经搜索过的结点,即已经走过的结点。此表被称为Closed表。 故任意结点d必是: ① d?Open d?Closed; ② d?Closed || d ?Open。 分支限界法的一般算法 ⑴初始化:计算起点s的f(s); [s, f(s), nil]放入Open; ⑵while (Open ≠?) { ⑶ 从Open中取出[p, f(p), x](f(p)为最小); ⑷ if (f(p) U) {将[p, f(p), x]放入Closed; ⑸ if (p是目标) {成功返回} else ⑹ { 产生p的后继d并计算f(d) ;对每个后继d 分支限界法的一般算法 ⑴初始化:计算起点s的f(s); [s, f(s), nil]放入Open; ⑵while (Open ≠?) { ⑶ 从Open中取出[p, f(p), x](f(p)为最小); ⑷ if (f(p) U) {将[p, f(p), x]放入Closed; ⑸ if (p是目标) {成功返回} else ⑹ { 产生p的后继d并计算f(d) ;对每个后继d 分支限界法的一般算法 ⑴初始化:计算起点s的f(s); [s, f(s), nil]放入Open; ⑵while (Open ≠?) { ⑶ 从Open中取出[p, f(p), x](f(p)为最小); ⑷ if (f(p) U) {将[p, f(p), x]放入Closed; ⑸ if (p是目标) {成功返回} else ⑹ { 产生p的后继d并计算f(d) ;对每个后继d 分支限界法求单源最短路径 单源最短路径问题的评价函数的构造: g(d)定义为从源s到结点d所走的路径长度: g(d) = g(p) + C[p][d], 这里p为d的前驱结点,C[p][d]为p到d的距离。 h(d)定义为0。于是f(d) = g(d)。 源s的评价函数f(s) = 0。 评价函数的下界为0;上界初始时为∞,以后不断用取得的更短路径的长度来替代。 分支限界法求最短路径举例 界限(Bounding) 评价函数f(d)关系着算法的效率乃至成败。 因为在大多数问题中f(d)只是个估计值,所以单靠f(d)是不够的。通常还要设计它的上下界函数U(d)和L(d)。 L(d)≤f(d)≤U(d)。 所谓分支限界法就是通过评价函数及其上下界函数的计算,将状态空间中不可能产生最佳解的子树剪去,减少搜索的范围,提

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档