当前位置:文档之家› 分支限界法

分支限界法


EnQueue(Q, Ew, bestw, i, n); // x[i] = 0
Q.Delete(Ew);
// 取下一扩展结点
if (Ew == -1) {
// 同层结点尾部
if (Q.IsEmpty())
return bestw;
Q.Add(-1);
// 同层结点尾部标志
Q.Delete(Ew);
另外,为了确保右子树成功剪枝,应该在算法 每一次进入左子树的时候更新bestw的值。
27
装载问题
3. 算法的改进
提前更新bestw
// 检查左儿子结点 Type wt = Ew + w[i]; // 左儿子结点的重量
if (wt <= c) { // 可行结点
if (wt > bestw) bestw = wt;
class QNode {QNode *parent;
bool LChild; Type weight;
// 指向父结点的指针 // 左儿子标志 // 结点所相应的载重量
29
装载问题
4. 构造最优解
找到最优值后,可以根据parent回溯到根结点,找到 最优解。
// 构造当前最优解 for (int j = n - 1; j > 0; j--) {
第六章 分支限界法
理解分支限界法的剪枝搜索策略。 掌握分支限界法的算法框架
队列式(FIFO)分支限界法 优先队列法
通过应用范例学习分支限界法的设计策略。
单源最短路径问题 装载问题; 布线问题 0-1背包问题; 最大团问题; 旅行售货员问题 电路板排列问题 批处理作业调度问题
4
分支限界法的基本思想
在分支限界法中,每一个活结点只有一次机会 成为扩展结点。活结点一旦成为扩展结点,就一次 性产生其所有儿子结点。在这些儿子结点中,导致 不可行解或导致非最优解的儿子结点被舍弃,其余 儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展 结点,并重复上述结点扩展过程。这个过程一直持 续到找到所需的解或活结点表为空时为止。
// 取下一扩展结点
catch (OutOfBounds) {break;} // 优先队列空
}}
20
单源最短路径问题
Dijakstra算法和分支限法在解决该问题的异同:
Dijakstra算法:每一步的选择为当前步的最优,复杂度 为O(n2)。
分支限算法:每一步的扩散为当前耗散度的最优。
队列式分支限界法的搜索解空间树的方式类似于解空间树的 宽度优先搜索,不同的是队列式分支限界法不搜索以不可行 结点(已经被判定不能导致可行解或不能导致最优解的结点) 为根的子树。按照规则,这样的结点不被列入活结点表。
目标函数的界[40, 100],一般解空间树中第i层的各结 点,代表对物1~i的选择,可这样定限界函数:
ub=V+(W-w)*(vi+1/wi+1)
已装入价值
剩余容量
剩下物品最大单位价值vi+1/wi+1
的积
可参考板书视图
10
0/1背包的分支限界法过程
2. 总结 从0/1背包问题的搜索过程可看出:与回溯法相 比,分支限界法可根据限界函数不断调整搜索 方向,选择最可能得最优解的子树优先进行搜 索找到问题的解。
对这r1个孩子结点分别估算可能的目标函 数bound(x1),其含义:以该结点为根的子
x2
.r.1.
树所有可能的取值不大于bound(x1),即:
x2 bound(x1)≥bound(x1,x2)≥…≥ bound(x1,…,xn)
12
分支限界法的设计思路
若某孩子结点的目标函数
值超出目标函数的下界,
A->E->Q->M
21
单源最短路径问题
Dijakstra算法和分支限法在解决该问题的异同:
优先队列式分支限界法的搜索方式是根据活结点的优先级确 定下一个扩展结点。结点的优先级常用一个与该结点有关的 数值p来表示。最大优先队列规定p值较大的结点点的优先级 较高。在算法实现时通常用一个最大堆来实现最大优先队列, 体现最大效益优先的原则。类似地,最小优先队列规定p值 较小的结点的优先级较高。在算法实现时,常用一个最小堆 来实现,体现最小优先的原则。采用优先队列式分支定界算 法解决具体问题时,应根据问题的特点选用最大优先或最小 优先队列,确定各个结点点的p值。
3
分支限界法的基本思想
分支限界法常以广度优先或以最小耗费 (最大效益)优先的方式搜索问题的解空间 树。对已处理的各结点根据限界函数估算目 标函数的可能取值,从中选取使目标函数取 得极值(极大/极小)的结点优先进行广度优 先搜索不断调整搜索方向,尽快找到解。
特点:限界函数常基于问题的目标函数,适 用于求解最优化问题。
2
分支限界法的基本思想
分支限界法与回溯法
(1)求解目标:回溯法的求解目标是找出解空间 树中满足约束条件的所有解,而分支限界法的求解 目标则是找出满足约束条件的一个解,或是在满足 约束条件的解中找出在某种意义下的最优解。 (2)搜索方式的不同: 回溯法以深度优先的方式搜索解空间树; 而分支限界法则以广度优先或以最小耗费优先的方 式搜索解空间树。
// 取下一扩展结点
i++;}
// 进入下一层
}
26
装载问题
3. 算法的改进
结点的左子树表示将此集装箱装上船,右子树 表示不将此集装箱装上船。设bestw是当前最优解; ew是当前扩展结点所相应的重量;r是剩余集装箱 的重量。则当ew+rbestw时,可将其右子树剪去, 因为此时若要船装最多集装箱,就应该把此箱装 上船。
dist[j]=E.length+c[E.i][j]; prev[j]=E.i; // 加入活结点优先队列 MinHeapNode<Type> N;
顶点i和j间有边,且此路 径长小于原先从源点到j
的路径长
N.i=j;
N.length=dist[j];
H.Insert(N);}
try {H.DeleteMin(E);}
18
单源最短路径问题
3. 剪枝策略
下图是用优先队列式分支限界法解有向图G的 单源最短路径问题产生的解空间树的剪枝情况。
经过不同
的路径到
达相同的
顶点
A
A优于B,B可剪枝 B
19
单源最短路径问题
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可达,且满足控制约束
(2)回溯求解TSP也是盲目的(虽有目标函数,也 只有找到一个可行解后才有意义)
7
解空间树的动态搜索
分支限界法首先确定一个合理的限界函数,并根据限 界函数确定目标函数的界[down, up]; 然后按照广度优先策略遍历问题的解空间树,在某一 分支上,依次搜索该结点的所有孩子结点,分别估算 这些孩子结点的目标函数的可能取值(对最小化问题, 估算结点的down,对最大化问题,估算结点的up)。 如果某孩子结点的目标函数值超出目标函数的界,则 将其丢弃(从此结点生成的解不会比目前已得的更 好),否则入待处理表。
17
单源最短路径问题
3. 剪枝策略
在算法扩展结点的过程中,一旦发现一个结点的下界 不小于当前找到的最短路长,则算法剪去以该结点为根的 子树。
在算法中,利用结点间的控制关系进行剪枝。从源顶点s 出发,2条不同路径到达图G的同一顶点。由于两条路径的 路长不同,因此可以将路长长的路径所对应的树中的结点 为根的子树剪去。
5
分支限界法的基本思想
常见的两种分支限界法
(1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个
结点为扩展结点。 (2)优先队列式分支限界法
按照优先队列中规定的优先级选取优先级最高 的结点成为当前扩展结点。
6
解空间树的动态搜索
(1)回溯求解0/1背包问题,虽剪枝减少了搜索 空间,但整个搜索按深度优先机械进行,是盲目 搜索(不可预测本结点以下的结点进行的如何)。
// 加入活结点队列
右儿子剪枝
// 检查右儿子结点
if (Ew + r > bestw && i < n) Q.Add(Ew); // 可能含最优解
Q.Delete(Ew); // 取下一扩展结点
if (i < n) Q.Add(wt);
}
28
装载问题
4. 构造最优解
为了在算法结束后能方便地构造出与最优值相 应的最优解,算法必须存储相应子集树中从活结点 到根结点的路径。为此目的,可在每个结点处设置 指向其父结点的指针,并设置左、右儿子标志。
11
分支限界法的设计思路
设求解最大化问题,解向量为X=(x1,…,xn),xi的取值 范围为Si,|Si|=ri。在使用分支限界搜索问题的解空间 树时,先根据限界函数估算目标函数的界[down, up], 然后从根结点出发,扩展根结点的r1个孩子结点,从 而构成分量x1的r1种可能的取值方式。
x1
8
0/1背包的分支限界法过程
1. 问题描述
容量w=10
物品 重(w) 价(v) 价/重(v/w)
1
4
40
10
2
7
42
6
3
5
25
5
4
3
12
4
贪心法的解(1,0,0,0),价值为40,可作为0/1背包的下界。
相关主题