5分支限界法详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
5.3.2 分支限界法示例
(1)单源最短路径问题 (2)布线问题 (3)八数码问题 (4)对称流动推销员问题 (5)非对称流动推销员问题
12
例1:单源最短路径问题
1. 问题描述 在下图所给的有向图G中,每一边都 有一个非负边权。要求图G的从源顶点s 到目标顶点t之间的最短路径。
a=2 b=3 c=4 d=7 e=2 f=9 g=2 h=2 i=6 j=7 k=3 l=5 m=1 n=5 0=8 p=2 q=1 r=2 u=3
9
5.3.1 分支限界法的基本思想
(1)求解目标:
分支限界法的求解目标则是找出满足约束条件的一 个解,或是在满足约束条件的解中找出在某种意义下的 最优解。
(2)搜索方式:
以广度优先或以最小耗费优先的方式搜索解空间 树。
10
分支限界法常以广度优先或以最小耗费(最 大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机 会成为扩展结点。活结点一旦成为扩展结点,就 一次性产生其所有儿子结点。在这些儿子结点中, 导致不可行解或导致非最优解的儿子结点被舍弃, 其余儿子结点被加入活结点表中。 此后,从活结点表中取下一结点成为当前扩 展结点,并重复上述结点扩展过程。这个过程一 直持续到找到所需的解或活结点表为空时为止。
5 分支限界法
1


学习要点
α -β 剪枝技术
分支限界法的剪枝搜索策略 应用范例




(1)流动推销员问题 (2)单源最短路径问题 (3)装载问题; (4)布线问题; (5)0-1背包问题; (6)同顺序加工任务安排问题 (7)八数码问题
2
5.1 图的广度优先遍历
对于图G=(V,E), 从任意一点r开始,依次检查 所有与r有关联的边(r,a1),(r, a2),…,(r,ak),当上面k条 边检查完毕后,再依次检查所有与a1,a2,…,ak相关 联的(a1,a11),(a1,a12),…,(a1,a1m),(a2,a21),(a2,a22),…, (a2,a2m),……,(ak,ak1),(ak,ak2),…,(ak,akm)。依次 类推,直到所有的边被检查,即所有顶点均被访问 为止。
13
用优先队列式分支限界法解有向图G的单源最 短路径问题产生的解空间树。其中,每一个结点旁 边的数字表示该结点所对应的当前路长。
14
2. 算法思想
解单源最短路径问题的优先队列式分支限界法用 一小顶堆来存储活结点表。其优先级是结点所对应 的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s 被扩展后,它的儿子结点被依次插入堆中。此后, 算法从堆中取出具有最小当前路长的结点作为当前 扩展结点,并依次检查与当前扩展结点相邻的所有 顶点。如果从当前扩展结点i到顶点j有边可达,且 从源出发,途经顶点i再到顶点j的所相应的路径的 长度小于当前最优路径长度,则将该顶点作为活结 点插入到活结点优先队列中。这个结点的扩展过程 一直继续到活结点优先队列为空时为止。 15
a=2 b=3 c=4 d=7 e=2 f=9 g=2 h=2 i=6 j=7 k=3 l=5 m=1 n=5 0=8 p=2 q=1 r=2 u=3
16
3. 剪枝策略
在算法扩展结点的过程中,一旦发现一个结 点的下界不小于当前找到的最短路长,则算法剪 去以该结点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。 从源顶点 s 出发, 2条不同路径到达图 G 的同一顶 点。由于两条路径的路长不同,因此可以将路长 长的路径所对应的树中的结点为根的子树剪去。
如果使用邻接表表示图, //队空搜索结束 则循环的总时间代价为 d0 //不空, 出队列 + d1 + … + dn-1 = O(e), 其中的 di 是顶点 i 的度。
}
cout << GetValue (w) << ‘ ’; visited[w] = 1; q.EnQueue (w);
//访问 //进队
}
}
//取顶点 v 的排在 w 后面的下一邻接顶点 } //重复检测 v 的所有邻接顶点 //外层循环,判队列空否
w = GetNextNeighbor (v, w);
如果使用邻接矩阵, 则对于每一个被访问 过的顶点,循环要检 测矩阵中的 n 个元素, 总的时间代价为 O(n2)。
7
5.2α -β 剪枝技术


5
图的广度优先搜索算法: template<class NameType, class DistType> void Graph <NameType, DistType> :: BFS ( int v ) { int * visited = new int[NumVertices]; for ( int i = 0; i < NumVertices; i++ ) visited[i] = 0; //visited 初始化 cout << GetValue (v) << ' '; visited[v] = 1; Queue<int> q; q.EnQueue (v); //访问 v, 进队列
α-β剪枝技术是一种技巧。比如,7根火柴, A、B两人依次从中取出 1根 或 2根 ,但不能不取, 最后一个将 取尽的便是赢家。
8
5.3 分支限界法
通常以广度优先或最小耗费(最大效益) 优先的方式,搜索问题的解空间树。 可以这样理解:分支定界法与广度优先 方法的不同在于,往往不用遍历整个图,而 是将不可能得到解 或 不可能得到最优解的 树枝剪掉(即下界估计),从而提高搜索效 率。 关键:下界估计
6
Hale Waihona Puke while ( !q.IsEmpty ( ) ) { v = q.DeQueue ( ); int w = GetFirstNeighbor (v);
//取顶点 v 的第一个邻接顶点 w while ( w != -1 ) { //若邻接顶点 w 存在 if ( !visited[w] ) { //若该邻接顶点未访问过
3
广度优先搜索的示例
广度优先搜索过程
广度优先生成树
广度优先遍历序列:ABCDEFGHI
4

广度优先搜索是一种分层的搜索过程,每向前走一 步可能访问一批顶点。因此,广度优先搜索不是一 个递归的过程,其算法也不是递归的。 为了实现逐层访问,算法中使用了一个队列,以记 忆正在访问的这一层和上一层的顶点,以便于向下 一层访问。 为避免重复访问,需要一个辅助数组 visited [ ],给 被访问过的顶点加标记。
相关文档
最新文档