第十三章 分支限界法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通常g(d)的构造较易,h(d)的构造较难。
5. 优先队列分支限界算法的设计思想(模式)
首先,确定一个合理的限界函数,并根据限界函数 确定问题的目标函数的界[down, up]; 然后,按照广度优先策略遍历问题的解空间树:
– 当搜索到达一个扩展结点时,一次性扩展它的所有孩 子,估算每一个孩子结点的目标函数的上(下)界值(又 称为耗费函数值); – 将那些满足约束条件且耗费函数值不超过目标函数的 界的孩子,插入活结点表H中,再从H表中取耗费函 数值极大(小)的下一结点同样扩展; – 直到找到所需的解或H表为空为止。 – 对于H中的叶子结点
13.5.2 0-1背包问题
分析:问题的解可表示为n元向量{x1, x2, ... xn }, xi{0,1},则可用排序树表示解空间, 在树中做广 度优先搜索。 n – 约束条件: wi xi W
i 1
– 目标函数: V max vi xi
i 1
1 1 2 1 4 1 8 0 9 1 10 0 5 0 11 1 12 6 1 0 3 0 7
13.4 分支限界法
1. 分支限界法与回溯法的不同
a. 搜索策略的不同:回溯法以深度优先的方 式搜索解空间树;
● 回溯法采用深度优先的方式,朝纵深方向搜 索,直至达到问题的一个可行解,或经判断沿此 路径不会达到问题的可行解或最优解时,停止向 前搜索,并沿原路返回到该路径上最后一个还可 扩展的结点。从该结点出发朝新的方向纵深搜索。
81 55 47 5 3 2 5 35 2
这不是最短周游路线,需要修改上界后继续搜索。
算法
Input:图G=(V,E),顶点编号为1到n; Output:从1顶点出发的最短巡回旅行路线。
1. 设定目标函数的限界down=0,up=∞ 2. 计算初始结点1的f(1)=0,将初始结点插入最小堆H; 3. while (H ≠Φ) 4. { 5. 从H中做DELETEMIN的操作,用p带回相应结点; 6. 产生p的所有满足约束条件的后继结点d并计算f(d); 7. while 对每个结点d 8. { if f(d)<up then 9. { if d是叶子结点 then 10. { up=f(p); 11. 删除活结点表(最小堆H)中函数值大于up值的结点; 12. if (H=Φ) then 13. 从叶子结点沿parent指针输出解,退出; 14. } 15. else 将d结点插入最小堆H中; 16. } 17. } 18. }
第五部分 克服困难性
第十三章 回溯法和分支限界法 (二)
第十三章 回溯法和分支限界法(二)
13.4 分支限界法 13.5 分支限界法的应用 13.5.1 单源最短路径问题 13.5.2 0/1背包问题 13.5.3 旅行商问题 13.5.4 指派问题 13.5.5 批处理作业问题
本章采用知识发明的第一条线,即方 法——应用为主线安排内容。
h(d)定义为0。于是f(d) = g(d)。 源s的评价函数f(s) = 0。 限界函数的下界为0;上界初始时为∞,以后不断 用取得的更短路径的长度来替代。
单源最短路径问题为极小优化问题,因此可用一个 极小堆来存储活结点表。
Input:有向图G; Output:从源点s到终点t的最短路径长度。
H={2, 3} 4 × w=11 无效解
x2=1
2 w=4, v=40 ub=76
x1=1
x1=0
3 w=0, v=0 ub=60
x2=0
5 w=4, v=40 ub=70
H={5, 3}
6 w=9, v=65 ub=69 8 w=12 无效解
x4=1
x3=1
7 w=4, v=40 ub=64 9 w=9, v=65 ub=65
3. 算法
1. 设定目标函数的限界down=0,up=∞ 2. 计算初始结点1的f(1)=0,将初始结点插入最小堆H; 3. while (H ≠Φ) 4. { 5. 从H中做DELETEMIN的操作,用p带回相应结点; 6. 产生p的所有满足约束条件的后继结点d并计算f(d); 7. while 对每个结点d 8. { if f(d)<up then 9. { if d是叶子结点 then 10. { up=f(p); 11. 删除活结点表(最小堆H)中函数值大于up值的结点; 12. if (H=Φ) then 13. 从叶子结点沿parent指针输出解,退出; 14. } 15. else 将d结点插入最小堆H中; 16. } 17. } 18. }
13.5.2 旅行商问题
30 30 6 5 4 10
6 4 5 10 20 20
算法思路: 设周游路线从结点1开始,解为元组X=(1,x2,...xn) xi{2,...,n}. 则解空间树为排列树,在树中做广度优先搜 索。 约束条件: xi xj ,i j; 目标函数:解向量对应的边权之和∑Cij
x4=0
x3=0
H={6, 7, 3}
×
H={9, 7, 3}
V=65 X=(1, 0, 1, 0)
算法
Input:n个物品的价值和重量,背包容量w; Output:装入背包的物品及最大价值。 1. 设定目标函数的限界down=40,up=100 2. 计算初始结点1的f(1)=100,将初始结点插入最大堆H; 3. while (H ≠Φ) 4. { 5. 从H中做DELETEMAX的操作,用p带回相应结点; 6. If p是叶子结点 then 7. 输出当前最优值,并从叶子结点沿parent指针输出解,退出; 8. Else 9. { 产生p的所有满足约束条件的后继结点d,并计算f(d); 10. if f(d)>down then 11. { 将d结点插入最大堆H中; 12. if d是叶子结点 then 13. { down=f(d); 14. 删除活结点表(最大堆H)中函数值小于down值的结点; 15. } 16. } 17. } 18. }
30 11
6 26 14
4 24
25
25
59
分支限界法求TSP的搜索
0 1 ∞ 25 40 31 27 5 ∞ 17 30 25 19 15 ∞ 6 1 9 50 24 ∞ 6 22 8 7 10 ∞
25 2
42 3 55 4 50
40 3 31 4
27 5
34 3 37 4 找到了第一条周游路 49 40 87 61 4 2 3 线1→5→3→4→2→1, 3 4 2 52 65 90 2 其长度为95。
ub v (W w) (vi 1 wi 1 )
这里g(d)=v (已经装入背包的物品价值) h(d)=(W-w)×(vi+1/wi+1) (剩余容量全部装入可 选物品中单位价值最大的物品达到的最大价值) 背包问题为极大优化问题,因此可用一个极大堆来 存储活结点表。
实例:假设有4个物品,其重量分别为(4, 7, 5, 3),价值分别为(40, 42, 25, 12),背包容量 W=10。将给定物品按单位重量价值从大到小排 序,结果如下:
2 3 4 7 3 2 9 2 2 3 4 5 4 2 2 o2
2 1
2
2. 算法思想
单源最短路径问题的限界函数的构造: f(d)=g(d)+h(d) g(d)定义为从源s到结点d所走的路径长度:
g(d) = g(p) + C[p][d] 这里p为d的前驱结点,C[p][d]为p到d的距离。
• 其耗费函数值是极值(极大或极小),则该叶子结点对应的解就 是问题的最优解; • 否则,调整问题的目标函数的界为该叶子结点的耗费函数值, 然后丢弃H表中超出目标函数界的结点,再次选取结点继续扩 展。
13.5 分支限界法的应用 13.5.1 单源最短路径问题
1. 问题描述
下面以一个例子来说明单源最短路径问题:在 下图所给的有向图G中,每一边都有一个非负 边权。要求图G的从源顶点s到目标顶点t之间 的最短路径。
●
4. 限界函数的构造
限界函数要能够提供一个评定候选扩展结点的 方法,以便确定哪个结点最有可能在通往目标 的最佳路径上。 一个限界函数f(d)通常可以由两个部分构成: ⑴从开始结点到结点d的已有耗损值g(d);⑵再 从结点d到达目标的期望耗损值h(d)。即:
f(d) = g(d) + h(d)
n
0
13
1 14
0 15
限界函数的确定: 下界:应用贪心法求得近似解为(1, 0, 0, 0),获得的 价值为v1,这可以作为0/1背包问题的下界。 上界:考虑最好情况,背包中装入的全部是第1个 物品且可以将背包装满,则可以得到一个非常简单的上 界的计算方法:ub=W×(v1/w1)。于是,得到了目标函数 的界[v1 , ub]。 限界函数为:
限界函数: f(d)=g(d)+h(d) g(d)定义为从结点1到结点d所走的路径长度; h(d)定义为0。于是f(d) = g(d)。 限界函数的下界为0;上界初始时为∞。
旅行商问题为极小优化问题,因此可用一个极小堆 来存储活结点表。
1. 旅行商问题的队列分支限界法 2. 旅行商问题的优先队列分支限界法
b. 分支限界法不仅通过约束条件, 而且可通 过目标函数的限界来减少无效搜索。
2. 分支限界法的基本思想
分支限界法常以广度优先或以最小耗费(最 大效益)优先的方式搜索问题的解空间树。 ● 在分支限界法中,每一个活结点只有一次机 会成为扩展结点。活结点一旦成为扩展结点,就 一次性产生其所有儿子结点。在这些儿子结点中, 导致不可行解或导致非最优解的儿子结点被舍弃, 其余儿子结点被加入活结点表中。 此后,从活结点表中取下一结点成为当前扩 展结点,并重复上述结点扩展过程。这个过程一 直持续到找到所需的解或活结点表为空时为止。
物品 1 2 3 4 重量(w) 4 7 5 3 价值(v) 40 42 25 12 价值/重量(v/w) 10 6 5 4
分支限界法求解0/1背包问题:
ub v (W w) (vLeabharlann Baidu 1 wi 1 )
1 w=0, v=0 ub=100 目标函数范围:[40, 100]
W=10 wi=(4, 7, 5, 3) vi= (40, 42, 25, 12) vi/wi=(10, 6, 5, 4)
●
优先队列式分支限界法的搜索方式是根据 活结点的优先级确定下一个扩展结点。结点的优 先级常用一个与该结点有关的限界函数值p来表 示。 ● 最大优先队列规定p值较大的结点的优先级 较高。在算法实现时通常用一个最大堆来实现最 大优先队列,体现最大效益优先的原则。 ● 最小优先队列规定p值较小的结点的优先级 较高。在算法实现时,常用一个最小堆来实现, 体现最小优先的原则。 采用优先队列式分支限界算法解决具体问题 时,应根据问题的特点选用最大优先或最小优先 队列,确定各个结点的p值。
● 分支限界法则以广度优先或以最小耗费优先 的方式搜索解空间树,将活结点存放在一个特殊 的表中。其策略是:在扩展结点处,先生成其所 有的儿子结点,将那些导致不可行解或导致非最 优解的儿子舍弃,其余儿子加入活结点表中。此 后,从活结点表中按照一定的规则取出一个结点 作为当前扩展结点。并重复上述结点扩展过程。
归约矩阵以及约数
前面的搜索的效率不高,几乎要搜索全部的状态空间。 其原因是评价函数以及上下界的估计太低。为了设计 求解TSP问题的更好的评价函数,先定义其代价矩阵 的归约矩阵和约数。 给定代价矩阵C,从C的任何行i(或列j)的各元素中减 去此行(或此列)的最小元素的值r(i)(或r’(j)),称为对i 行(或j列)的归约。将C的各行和各列都归约后的矩阵 称为C的归约矩阵。和数 r = ∑i≤n r(i) + ∑i≤n r’(j) 称为C的约数。
3. 常见的两种分支限界法 ● 队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个 节点为扩展节点。 ● 优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最 高的节点成为当前扩展节点。
队列式分支限界法的搜索解空间树的方式 类似于解空间树的宽度优先搜索,不同的是队列 式分支限界法不搜索已不可行结点(已经被判定 不能导致可行解或不能导致最优解的结点)为根 的子树。按照规则,这样的结点不被列入活结点 表。