算法设计与分析_第6章_分支限界法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
13 1 2 3 8 4 C’(X)= C’(13) =5+0=5 7 6 5
L=(2,4,7,8,9,11)
10
分支限界法的基本思想
分支限界法与回溯法比较
(1)求解目标 回溯法的求解目标是找出解空间树中满足约束条件的所 有解,而分支限界法的求解目标则是找出满足约束条件 的一个解,或是在满足约束条件的解中找出在某种意义 下的最优解。 (2)搜索方式的不同 回溯法以深度优先的方式搜索解空间树,而分支限界法 则以广度优先或以最小耗费优先的方式搜索解空间树。
P=45 P=50
优先级定义:由已装袋的物品价值 加上剩下的最大单位重量价值的 26 物品装满剩余容量的价值和
0-1背包问题
分支限界搜索过程
while (i != n+1) { Typew wt = cw + w[i]; if (wt <= c) { 可行性约束 // 左儿子结点为可行结点 if (cp+p[i] > bestp) bestp = cp+p[i]; AddLiveNode(up, cp+p[i], cw+w[i], true, i+1);}//加入活结点队列 up = Bound(i+1); // 检查当前扩展结点的右儿子结点 if (up >= bestp) 上界约束 // 右子树可能含最优解 AddLiveNode(up, cp, cw, false, i+1); // 取下一个扩展节点(略)} 将一个新的活结 点插入到子集树 和优先队列中 i+1: 层数 // 非叶结点 cw:当前装包重量 cp: 当前装包价值
11
分支限界法的基本思想
不同点 回溯法 分支限界法 求解目标 找出树中满足约束条件 找出满足约束条件的一个解或找
的所有解 出使目标函数达到极大(小)的最 优解
广度优先或最小耗费优先 搜索方式 深度优先 扩展结点 多次机会成为扩展结点: 每个活结点只有一次机会成为扩 扩展结点变为活结点后 又可成为扩展结点 展结点
算法从图G的源顶点s和空优先队列开始。结点s被 扩展后,它的儿子结点被依次插入堆中。 此后,算法从堆中取出具有最小当前路长的结点作 为当前扩展结点,并依次检查与当前扩展结点相邻 的所有顶点。 如果从当前扩展结点i到顶点j有边可达,且从源出 发,途经顶点i再到顶点j的所相应的路径的长度小 于当前最优路径长度,则将该顶点作为活结点插入 到活结点优先队列中。 这个结点的扩展过程一直继续到活结点优先队列为 空时为止。
6
分支限界法的基本思想
实例——8-拼块游戏问题
输入: 具有8 个编号小方块的魔方 输出: 移动系列, 经过这些移动, 魔方达到目标状态
2 1 7
8 6
3 4 5
1 8 7
2 6
3 4 5
初始状态
目标状态
7
分支限界法的基本思想
FIFO队列式分支限界法
. 2 3 1 8 4 7 6 5 2 . 3 1 8 4 7 6 5 2 3 . 1 8 4 7 6 5 2 8 3 1 . 4 7 6 5 1 2 3 7 8 4 . 6 5 1 2 3 . 8 4 7 6 5 1 2 3 8 . 4 7 6 5 1 8 7 2 6 3 4 5
3
分支限界法的基本思想
分支限界方法找最优解的效率比回溯法 高。 原因在于
采用了最小代价估值函数指导搜索,在活节 点表中,选择有最小代价估值的节点作为扩 展节点。即总是向最有可能获得最优解的子 树上扩展。 并且采用限界函数U杀死活节点表中不可能 成为最优解的节点,提高算法的效率。
4
分支限界法的基本思想
比回溯法多的两个条件
对于一棵解空间树上的每一个节点所代表的部分解, 要计算出通过这个部分解繁衍出的任何解在目标函 数上的最佳值边界 目前求得的最佳解的值
算法会为每一节点x计算一个界,任何可能在以x 为根的子树中生成的结点所给出的解,其值都不 可能超出这个界. 如果边界值不能超越最佳解,这个节点就是一个 没有希望的节点. 这就是分支限界法的主要思 想
13
单源最短路径问题
问题描述
下图是用优先队列式分支限界法解有向图G的单源最短 路径问题产生的解空间树。其中,每一个结点旁边的数 字表示该结点所对应的当前路长。
B A
14
单源最短路径问题
15
单源最短路径问题
问题描述
下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解 空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。
算法设计与分析
第6章 分支限界法
1
学习要点
理解分支限界法的剪枝搜索策略 掌握分支限界法的算法框架
队列式(FIFO)分支限界法 优先队列式分支限界法
通过应用范例学习分支限界法的设计策略
单源最短路径问题 装载问题; 0-1背包问题; 最大团问题; 旅行售货员问题 批处理作业调度问题
2
分支限界法的基本思想
19
单源最短路径问题
算法描述
c;图的邻接矩阵
while (true) { for (int j = 1; j <= n; j++) if ((c[E.i][j]<inf)&&(E.length+c[E.i][j]<dist[j])) { // 顶点i到顶点j可达,且满足控制约束 dist[j]=E.length+c[E.i][j]; prev[j]=E.i; // 加入活结点优先队列 MinHeapNode<Type> N; Length: 优先队 N.i=j; 列的优先级 N.length=dist[j]; H.Insert(N); } try {H.DeleteMin(E);} // 取下一扩展结点 catch (OutOfBounds) {break;} // 优先队列空 }
目标状态
8
分支限界法的基本思想
优先队列式分支限界法
“有智能”的排序函数C( )—最小代价估计函 数: C’(X)=从初始状态到X所移动的次数+还未 到位的数字方块数。 从初始状态到X所移动的次数是实际耗费的 代价,还未到位的数字方块数表示至少还要 移动的次数。 2 8 3 1 2 3
1 7 6 4 5 8 7 6 4 5
顶点i和j间有边,且此 路径长小于原先从原点 到j的路径长
20
单源最短路径问题
Dijkstra算法
贪心选择扩展顶点集合S
取点 加点 wenku.baidu.com权
活结点队列:最小堆H
广度优先 最短路径优先级优先 最小堆
剪枝 分支限界法
21
0-1背包问题
给定n种物品和一背包。物品i的重量是 wi,其价值为vi,背包的容量为C。问应 如何选择装入背包的物品,使得装入背 包中物品的总价值最大?
23
0-1背包问题
优先队列式分支限界法的基本思想
首先,要对输入数据进行预处理,将各物品依其单 位重量价值从大到小进行排列。 算法首先检查当前扩展结点的左儿子结点的可行性。 如果该左儿子结点是可行结点,则将它加入到子集 树和活结点优先队列中。 当前扩展结点的右儿子结点一定是可行结点,仅当 右儿子结点满足上界约束时才将它加入子集树和活 结点优先队列。当扩展到叶节点时为问题的最优值。 结点的优先级由已装袋的物品价值加上剩下的最大 单位重量价值的物品装满剩余容量的价值和。
// 检查当前扩展结点的左儿子结点
27
装载问题
有一批共n个集装箱要装上2艘载重量分 别为c1和c2的轮船,其中集装箱i的重量 为wi,且
装载问题 确定是否有一个合理的装载方案可将这n个集装箱装上这2艘 轮船。如果有,找出一种装载方案。 容易证明,如果一个给定装载问题有解,则采用下面的策略 可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满; (2)将剩余的集装箱装上第二艘轮船。
5
分支限界法的基本思想
常见的两种分支限界法
根据从活结点表中获取下 一扩展结点的不同方式
(1)队列式分支限界法 按照队列先进先出(FIFO)或者后进先出(LIFO) 原则选取下一个结点为扩展结点。 不足:对结点的选择规则相当死板,具有一定的 “盲 目”性。这种选择规则不利于快速检索到一个能够到达 答案的结点。 (2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的结点 成为当前扩展结点。常用方法是LC(Least Cost)方法。 对活结点使用一个“有智能”的排序函数C()来选取下一 个结点,往往可以加快获取答案的速度。 最大优先队列:使用最大堆,体现最大效益优先 最小优先队列:使用最小堆,体现最小费用优先
B A
16
单源最短路径问题
结点A控制结点B
剪枝策略
如果解空间树中以结点A为根的子树中所含的解优于以结点B为根的子树 中所含的解,则称结点A控制结点B,以结点B为根的子树可以剪去。
B A
17
单源最短路径问题
算法思想: 解此问题的优先队列式分支限界法 用一极小堆来存储活结点表。其优先级是结点 所对应的当前路长。
28
装载问题
队列式分支限界法
在算法的while循环中,首先检测当前扩展 结点的左儿子结点是否为可行结点。如果是 则将其加入到活结点队列中。 然后将其右儿子结点加入到活结点队列中 (右儿子结点一定是可行结点)。 2个儿子结点都产生后,当前扩展结点被舍 弃。
18
单源最短路径问题
剪枝策略
在算法扩展结点的过程中,一旦发现一个结 点的下界不小于当前找到的最短路长,则算 法剪去以该结点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。 从源顶点s出发,2条不同路径到达图G的同 一顶点。由于两条路径的路长不同,因此可 以将路长长的路径所对应的树中的结点为根 的子树剪去。
树结点的 生成最近一个有希望结 选择其中最有希望的结点,并生成 它的所有子女 生成顺序 点的单个子女 方向性: 活结点表,搜索朝着解空 行进方向 随机性
间树上有最优解的分支推进
12
单源最短路径问题
问题描述
以一个例子来说明单源最短路径问题:在下 图所给的有向图G中,每一边都有一个非负 边权。要求图G的从源顶点s到目标顶点t之 间的最短路径。
25
0-1背包问题
实例
n=3,C=30,w={16,15,15},p={45,25,25}
优先队列式分支限界法的基本思想
优先队列 A, level=1 B, level=2
68.38,45 68.38,45 50,45 50,45
E, level=3 C, level=2 F, level=2 C, level=3 L, level=4 K, level=4 K, level=4
3
4
L=(3,2,4)
5
5
6
5
7
6
L=(5,6,2,4,7)
8
6
8 3 2 1 4 7 6 5
9
7
2 8 3 10 2 3 7 1 4 1 8 4 5 7 6 5 6 5 12 1 2 3 8 4 5 7 6 5
11 2 3 1 8 4 7 7 6 5
L=(6,2,4,7,8,9) L=(10,2,4,7,8,9,11) L=(12,2,4,7,8,9,11)
24
0-1背包问题
实例
n=3,C=30,w={16,15,15}, p={45,25,25} 优先队列式分支限界法的基本思想
使用最大堆 上界 up = 68.3 Bound(int i)实现 下界 L = 45 贪心算法实现 bestp为当前最优值,则 L=45 ≤ bestp ≤ up=68.3
9
初始状态 C’(X)=C’(1)=0+4=4
目标状态 C’(X)=s+0=s
1
4
2 8 3 1 6 4 7 5 2 8 3 1 4 7 6 5 2 3 1 8 4 7 6 5 4
6
优先队列
L=(1)
2 8 3 1 6 4 7 5 2 8 3 1 4 7 6 5
2
6
2 8 3 1 6 4 7 5 2 8 3 1 4 7 6 5
输入:C>0, wi>0, vi>0, 1≤ i≤n 输出:(x1, x2, …, xn), xi∈{0, 1}, 满足
22
0-1背包问题
实例
n=3,C=30,w={16,15,15},p={45,25,25} 可行性约束函数: FIFO队列式分支限界法的基本思想
A
B,C E,F,G K,L,M,N,O P=45 P=50 P=25 P=25 P=0
分支限界法常以广度优先或以最小耗费(最大 效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会 成为扩展结点。
活结点一旦成为扩展结点,就一次性产生其所有儿 子结点。 在这些儿子结点中,导致不可行解或导致非最优解 的儿子结点被舍弃,其余儿子结点被加入活结点表 中。 此后,从活结点表中取下一结点(最有利的)成为当 前扩展结点,并重复上述结点扩展过程。这个过程 一直持续到找到所需的解或活结点表为空时为止。