第6章-分支限界v1.0
合集下载
第六章 分支限界法.ppt

得到的解 继续搜索
13
单源最短路径问题
1. 问题描述
下面以一个例子来说明单源最短路径问题:在下 图所给的有向图G中,每一边都有一个非负边权。要 求图G的从源顶点s到目标顶点t之间的最短路径。
14
单源最短路径问题
1. 问题描述
下图是用优先队列式分支限界法解有向图G的 单源最短路径问题产生的解空间树。其中,每一个结 点旁边的数字表示该结点所对应的当前路长。
// 取下一扩展结点
i++;}
// 进入下一层
}
26
装载问题
3. 算法的改进
结点的左子树表示将此集装箱装上船,右子树 表示不将此集装箱装上船。设bestw是当前最优解; ew是当前扩展结点所相应的重量;r是剩余集装箱 的重量。则当ew+rbestw时,可将其右子树剪去, 因为此时若要船装最多集装箱,就应该把此箱装 上船。
(2)回溯求解TSP也是盲目的(虽有目标函数,也 只有找到一个可行解后才有意义)
7
解空间树的动态搜索
分支限界法首先确定一个合理的限界函数,并根据限 界函数确定目标函数的界[down, up]; 然后按照广度优先策略遍历问题的解空间树,在某一 分支上,依次搜索该结点的所有孩子结点,分别估算 这些孩子结点的目标函数的可能取值(对最小化问题, 估算结点的down,对最大化问题,估算结点的up)。 如果某孩子结点的目标函数值超出目标函数的界,则 将其丢弃(从此结点生成的解不会比目前已得的更 好),否则入待处理表。
A->E->Q->M
21
单源最短路径问题
Dijakstra算法和分支限法在解决该问题的异同:
优先队列式分支限界法的搜索方式是根据活结点的优先级确 定下一个扩展结点。结点的优先级常用一个与该结点有关的 数值p来表示。最大优先队列规定p值较大的结点点的优先级 较高。在算法实现时通常用一个最大堆来实现最大优先队列, 体现最大效益优先的原则。类似地,最小优先队列规定p值 较小的结点的优先级较高。在算法实现时,常用一个最小堆 来实现,体现最小优先的原则。采用优先队列式分支定界算 法解决具体问题时,应根据问题的特点选用最大优先或最小 优先队列,确定各个结点点的p值。
13
单源最短路径问题
1. 问题描述
下面以一个例子来说明单源最短路径问题:在下 图所给的有向图G中,每一边都有一个非负边权。要 求图G的从源顶点s到目标顶点t之间的最短路径。
14
单源最短路径问题
1. 问题描述
下图是用优先队列式分支限界法解有向图G的 单源最短路径问题产生的解空间树。其中,每一个结 点旁边的数字表示该结点所对应的当前路长。
// 取下一扩展结点
i++;}
// 进入下一层
}
26
装载问题
3. 算法的改进
结点的左子树表示将此集装箱装上船,右子树 表示不将此集装箱装上船。设bestw是当前最优解; ew是当前扩展结点所相应的重量;r是剩余集装箱 的重量。则当ew+rbestw时,可将其右子树剪去, 因为此时若要船装最多集装箱,就应该把此箱装 上船。
(2)回溯求解TSP也是盲目的(虽有目标函数,也 只有找到一个可行解后才有意义)
7
解空间树的动态搜索
分支限界法首先确定一个合理的限界函数,并根据限 界函数确定目标函数的界[down, up]; 然后按照广度优先策略遍历问题的解空间树,在某一 分支上,依次搜索该结点的所有孩子结点,分别估算 这些孩子结点的目标函数的可能取值(对最小化问题, 估算结点的down,对最大化问题,估算结点的up)。 如果某孩子结点的目标函数值超出目标函数的界,则 将其丢弃(从此结点生成的解不会比目前已得的更 好),否则入待处理表。
A->E->Q->M
21
单源最短路径问题
Dijakstra算法和分支限法在解决该问题的异同:
优先队列式分支限界法的搜索方式是根据活结点的优先级确 定下一个扩展结点。结点的优先级常用一个与该结点有关的 数值p来表示。最大优先队列规定p值较大的结点点的优先级 较高。在算法实现时通常用一个最大堆来实现最大优先队列, 体现最大效益优先的原则。类似地,最小优先队列规定p值 较小的结点的优先级较高。在算法实现时,常用一个最小堆 来实现,体现最小优先的原则。采用优先队列式分支定界算 法解决具体问题时,应根据问题的特点选用最大优先或最小 优先队列,确定各个结点点的p值。
第六章 分支与界限

4
• 在整个搜索过程中,每遇到一个活结点,就对它的各个孩 子结点进行目标函数可能取得值得估算,然后把以此来更 新表结点:丢弃不再需要的结点,加入新的结点。再从表 中选取“界”取极值的结点,并重复上述过程。 • 随着过程的不断深入,结点表中所估算的目标函数的极值, 越来越接近问题的解。当搜索到一个叶子结点时,如果对 该结点所估算的目标函数的值就是结点表中最大或最小值, 那么沿叶子结点到根结点的路径确定的解就是问题的解。
∞ 5 20 10 23
25 ∞ 16 51 9
41 18 ∞ 25 7
32 31 7 ∞ 11
28 26 1 6 ∞
13
14
6.2.1 费用矩阵的行归约(列归约)
• 费用矩阵c的第i行(或第j列)中的每个元素减去一个正常 数lhi(或chj),得到一个新的费用矩阵,使得新矩阵中第i 行(或第j列)中的最小值为0,称为费用矩阵的行归约 (列归约),称lhi为行归约常数,称chj为列归约常数。 0 0 1 2 3 4 1 2 3 4 0
∞ 13 3 43 4 0
0 2
3 lh0=3 4
13 ∞ 19 0
0 2 ∞ 0
0 0 0 ∞
∞ 0 19 4 16
0 ∞ 15 45 2
16 13 ∞ 19 0
3 22 2 ∞ 0
3 21 0 0 ∞
的选择中,必然包含第i行 的最小元素和第j列的最小 元素(除cij之外的)。
ch1=2
25 26
0 ∞ 15 45 2
16 13 ∞ 19 0
3 22 2 ∞ 0
3 21 0 0 ∞
h lhi ch j
j 0
3 4
∞ 5 20 10 23
• 在整个搜索过程中,每遇到一个活结点,就对它的各个孩 子结点进行目标函数可能取得值得估算,然后把以此来更 新表结点:丢弃不再需要的结点,加入新的结点。再从表 中选取“界”取极值的结点,并重复上述过程。 • 随着过程的不断深入,结点表中所估算的目标函数的极值, 越来越接近问题的解。当搜索到一个叶子结点时,如果对 该结点所估算的目标函数的值就是结点表中最大或最小值, 那么沿叶子结点到根结点的路径确定的解就是问题的解。
∞ 5 20 10 23
25 ∞ 16 51 9
41 18 ∞ 25 7
32 31 7 ∞ 11
28 26 1 6 ∞
13
14
6.2.1 费用矩阵的行归约(列归约)
• 费用矩阵c的第i行(或第j列)中的每个元素减去一个正常 数lhi(或chj),得到一个新的费用矩阵,使得新矩阵中第i 行(或第j列)中的最小值为0,称为费用矩阵的行归约 (列归约),称lhi为行归约常数,称chj为列归约常数。 0 0 1 2 3 4 1 2 3 4 0
∞ 13 3 43 4 0
0 2
3 lh0=3 4
13 ∞ 19 0
0 2 ∞ 0
0 0 0 ∞
∞ 0 19 4 16
0 ∞ 15 45 2
16 13 ∞ 19 0
3 22 2 ∞ 0
3 21 0 0 ∞
的选择中,必然包含第i行 的最小元素和第j列的最小 元素(除cij之外的)。
ch1=2
25 26
0 ∞ 15 45 2
16 13 ∞ 19 0
3 22 2 ∞ 0
3 21 0 0 ∞
h lhi ch j
j 0
3 4
∞ 5 20 10 23
第6章 分支限界法

源最短路径问题的优先队 列式分支限界法用一极小堆来存储 活结点表。 活结点表。 其优先级是结点所对应的当前路长。 优先级是结点所对应的当前路长。
16
算法从图G的源顶点s和空优先队列开始。 算法从图G的源顶点s和空优先队列开始。 结点s被扩展后,它的儿子结点被依次插入堆中。 结点s被扩展后,它的儿子结点被依次插入堆中。 此后, 此后,算法从堆中取出具有最小当前路长的结点 作为当前扩展结点, 作为当前扩展结点,并依次检查与当前扩展结点 相邻的所有顶点。 相邻的所有顶点。 如果从当前扩展结点i到顶点j有边可达, 如果从当前扩展结点i到顶点j有边可达,且从源 出发,途经顶点i再到顶点j 出发,途经顶点i再到顶点j的所相应的路径的长 度小于当前最优路径长度, 度小于当前最优路径长度,则将该顶点作为活结 点插入到活结点优先队列中。 点插入到活结点优先队列中。 这个结点的扩展过程一直继续到活结点优先队列 为空时为止。 为空时为止。
r=14, p=45 不可解 r=14, r=15, p=45 p=25 r=30, p=0
不可解
r=14, p=45
r=0, p=50
7
用队列式分支限界法解此问题时,用一个队列 用队列式分支限界法解此问题时,用一个队列 来存储活结点表。 来存储活结点表。
不可解
队头 B C E F
不可解 G K L M N O
第6章 分支界限法
学习要点
• 理解分支限界法的剪枝搜索策略。 理解分支限界法的剪枝搜索策略。 • 掌握分支限界法的算法框架 (1)队列式(FIFO)分支限界法 队列式(FIFO)分支限界法 (2)优先队列式分支限界法 • 通过应用范例学习分支限界法的设计策略。 通过应用范例学习分支限界法的设计策略。
11
16
算法从图G的源顶点s和空优先队列开始。 算法从图G的源顶点s和空优先队列开始。 结点s被扩展后,它的儿子结点被依次插入堆中。 结点s被扩展后,它的儿子结点被依次插入堆中。 此后, 此后,算法从堆中取出具有最小当前路长的结点 作为当前扩展结点, 作为当前扩展结点,并依次检查与当前扩展结点 相邻的所有顶点。 相邻的所有顶点。 如果从当前扩展结点i到顶点j有边可达, 如果从当前扩展结点i到顶点j有边可达,且从源 出发,途经顶点i再到顶点j 出发,途经顶点i再到顶点j的所相应的路径的长 度小于当前最优路径长度, 度小于当前最优路径长度,则将该顶点作为活结 点插入到活结点优先队列中。 点插入到活结点优先队列中。 这个结点的扩展过程一直继续到活结点优先队列 为空时为止。 为空时为止。
r=14, p=45 不可解 r=14, r=15, p=45 p=25 r=30, p=0
不可解
r=14, p=45
r=0, p=50
7
用队列式分支限界法解此问题时,用一个队列 用队列式分支限界法解此问题时,用一个队列 来存储活结点表。 来存储活结点表。
不可解
队头 B C E F
不可解 G K L M N O
第6章 分支界限法
学习要点
• 理解分支限界法的剪枝搜索策略。 理解分支限界法的剪枝搜索策略。 • 掌握分支限界法的算法框架 (1)队列式(FIFO)分支限界法 队列式(FIFO)分支限界法 (2)优先队列式分支限界法 • 通过应用范例学习分支限界法的设计策略。 通过应用范例学习分支限界法的设计策略。
11
六章分支限界法

(2)搜索方式的不同:回溯法以深度优先的方式搜索解 空间树,而分支限界法则以广度优先或以最小耗费优先 的方式搜索解空间树。
6.1 分支限界法的基本思想
分支限界法与回溯法
• 回溯与分支限后评估这个部分
解: – 如果加上剩下的分量也不可能求得一个解,就不再生
首先把物品按照P(i)/W(i)≥P(i+1)/W(i+1)的衡量标准排序, 以此顺序读入物品。并且定义一个大小为物品多少的解向量X, X的一个分量就代表某个物品的装入情况。
6.2 0-1背包问题 (0-1 Knapsack Problem)
[问题描述] 设有n个物体和一个背包,物体i的重量为wi , 价值为pi ,背包的载荷为M,找一个装载方案,使得能放入 背包的物体总价值最高。
6.1 分支限界法的基本思想
(用于求解最优化问题)
目标函数限界U: 初始U可取,若x*是任一答案结点,且 c(x*)<U, 则更新U=c(x*), x*为已知答案结点值最小者。当搜索 到结点x,而c(x)>U时, x将不必扩展(剪枝)。
活动结点表: 通常采用优先队列方式组织, c(x)小者优先。
6.1 分支限界法的基本思想
E-结点一直保持到死为止的状态生成方法导致分枝-限 界方法(branch-and-bound)。
6.1 分支限界法的基本思想
分支限界法常以广度优先或以最小耗费(最大效 益)优先的方式搜索问题的解空间树。对已处理的 各结点根据限界函数估算目标函数的可能取值,从 中选取使目标函数取得极值(极大/极小)的结点 优先进行广度优先搜索不断调整搜索方向,尽快 找到解。
• 然而,如果评价函数选择得好,采用分支限界法可 能有一个小得多的常数因子。
• 好的评价函数应该有一个尽可能高的下界估计和一 个尽可能低的上界估计,从而使得搜索空间能够得 到有效的压缩,从而提高效率。
6.1 分支限界法的基本思想
分支限界法与回溯法
• 回溯与分支限后评估这个部分
解: – 如果加上剩下的分量也不可能求得一个解,就不再生
首先把物品按照P(i)/W(i)≥P(i+1)/W(i+1)的衡量标准排序, 以此顺序读入物品。并且定义一个大小为物品多少的解向量X, X的一个分量就代表某个物品的装入情况。
6.2 0-1背包问题 (0-1 Knapsack Problem)
[问题描述] 设有n个物体和一个背包,物体i的重量为wi , 价值为pi ,背包的载荷为M,找一个装载方案,使得能放入 背包的物体总价值最高。
6.1 分支限界法的基本思想
(用于求解最优化问题)
目标函数限界U: 初始U可取,若x*是任一答案结点,且 c(x*)<U, 则更新U=c(x*), x*为已知答案结点值最小者。当搜索 到结点x,而c(x)>U时, x将不必扩展(剪枝)。
活动结点表: 通常采用优先队列方式组织, c(x)小者优先。
6.1 分支限界法的基本思想
E-结点一直保持到死为止的状态生成方法导致分枝-限 界方法(branch-and-bound)。
6.1 分支限界法的基本思想
分支限界法常以广度优先或以最小耗费(最大效 益)优先的方式搜索问题的解空间树。对已处理的 各结点根据限界函数估算目标函数的可能取值,从 中选取使目标函数取得极值(极大/极小)的结点 优先进行广度优先搜索不断调整搜索方向,尽快 找到解。
• 然而,如果评价函数选择得好,采用分支限界法可 能有一个小得多的常数因子。
• 好的评价函数应该有一个尽可能高的下界估计和一 个尽可能低的上界估计,从而使得搜索空间能够得 到有效的压缩,从而提高效率。
算法 第6章 分枝限界法

5
分支限界法的基本思想
堆的补充知识
堆的定义
满足下列性质的数列{R1, R2, …, Rn}被称为堆
Ri R2i (1) Ri R2i 1
或
(2)
Ri R2i Ri R2i 1
i 1, 2,,[n 2]
若满足条件(1)则称最小堆; 若满足条件(2)则称最大堆。
解空间树:
9
0-1背包问题
设有n个物体和一个背包, 物体i的重量为wi , 价值为vi, 背包的承 重量为c, 若将物体i (1 i n)装入背包, 则有价值为vi . 目标是找到一个方案, 使得能放入背包的物体总价值最高。
当n=3时, 问题的解空间树:
10
0-1背包问题
例:n=3,w=[16,15,15],v=[45,25,25],c=30 队列式分支限界法:
6
分支限界法的基本思想
堆对应一棵完全二叉树,如
最小堆
最大堆
7
分支限界法的基本设有n个物体和一个背包, 物体i的重量为wi , 价值为vi, 背包的承 重量为c, 若将物体i (1 i n)装入背包, 则有价值为vi . 目标是找到一个方案, 使得能放入背包的物体总价值最高。
此后,从活结点表中取下一结点成为当前扩展结点,并重 复上述结点扩展过程。这个过程一直持续到找到所需的解 或活结点表为空时为止。
3
分支限界法的基本思想
从活结点表中选择下一扩展结点的不同方式导致不同的分支 限界法。
常见的两种分支限界法:
(1)队列式(FIFO)分支限界法 将活结点表组织成一个队列,并按队列先进先出(FIFO)原 则选取下一个结点为当前扩展结点。 (2)优先队列式分支限界法 将活结点表组织成一个优先队列,并按照优先队列中规定的 优先级选取优先级最高的结点成为当前扩展结点。
分支限界法

• 在子树X中离X最近的那个 在子树X中离X
答案结点到X的路径长度。 答案结点到X的路径长度。
X
a
6
分支限界法的基本思想
用c(·)表示有智力的排序函数,又称为结点成本函数。 c(·)表示有智力的排序函数,又称为结点成本函数。 表示有智力的排序函数 它的定义如下: 它的定义如下: 如果X是答案结点, c(X)是由解空间树的根结点 1. 如果X是答案结点,则c(X)是由解空间树的根结点 到X的成本; 的成本; 如果X不是答案结点且子树X不包含任何答案结点, 2. 如果X不是答案结点且子树X不包含任何答案结点, 则c(X)=∞; 否则c(X)等于子树X c(X)等于子树 3. 否则c(X)等于子树X中具有最小成本的答案结点的 成本。 成本。 但要指出的事,要得到结点成本函数c(·)所用的计算工作量 但要指出的事,要得到结点成本函数 所用的计算工作量 与解原问题具有相同复杂度, 与解原问题具有相同复杂度,这是因为计算一个结点的代价 通常要检索包含一个答案结点的子树X才能确定 才能确定, 通常要检索包含一个答案结点的子树 才能确定,因此要得 到精确的成本函数一般是不现实的。 到精确的成本函数一般是不现实的。在算法中检索活结点的 ˆ 来排出。 次序通常根据能大致估计结点成本函数 c(⋅)来排出。 7
10 0 20 2 20 10 4
∞
∞
10
• •
LC没能达到这个最小成本答案结点的原因在于有两个这样 LC没能达到这个最小成本答案结点的原因在于有两个这样 ˆ ˆ 的节点X 的节点X和Y,当 c ( X ) > c (Y ) 时,却有 c ( X ) < c (Y ) ˆ ˆ 那么, 如果是每对 c ( X ) < c (Y ) 的X、Y都有 c ( X ) < c (Y ) ,那么, LC总会找到一个最小成本答案结点 总会找到一个最小成本答案结点。 LC总会找到一个最小成本答案结点。 12
《算法设计与分析》-第六章 分支限界
例:n=3,w=[16,15,15],p=[45,25,25],c=30 队列式(FIFO)分支限界法
1 1 D 1 H 0 I 1 J B 0 E 0 K 1 L 1 F M 1 N A 0 C 0 G 0 O
6.2
0-1背包问题 背包问题
优先队列式分支限界法 算法的思想
首先,要对输入数据进行预处理,将各物品依其单位重量价值从大 到小进行排列。 在下面描述的优先队列分支限界法中,节点的优先级由已装袋的物 品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。 算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子 结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展 结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才 将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。
6.1 分支限界法的基本思想
3. 常见的两种分支限界法
(两种选择下一个E节点的方法:) (1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为 扩展节点。 (2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节 点成为当前扩展节点。
6.2
Байду номын сангаас
0-1背包问题 背包问题
6.3 回溯法与分支限界法对比
优先队列分支限界法能够有效地减少搜索的结点数目, 从而减少计算时间。因此比较适合于求解目标则是找出 满足约束条件的一个解或最优解;而回溯法则比较适合 于找出解空间树中满足约束条件的所有解。 回溯法比分支限界在占有内存方面具有优势。 – 回溯法占用的内存是O(解空间的最大路径长度),而 分支定界所占的内存为O(解空间的大小)。 对于子集空间,回溯法需O(n)的内存空间,而分 支定界需O(2n) 对于排列空间,回溯法需O(n)的内存空间,而分 支定界需O(n!)
第6章 分支限界法
25
6.2装载问题
while (true) { // 检查扩展结点的左孩子 T wt = Ew + w[i]; // 左孩子的权值 if (wt <= c) { // 可行的左孩子 if (wt > bestw) bestw = wt; // 若不是叶子,则添加到队列 if (i < n) Q.Add(wt); }
12
6.1分支限界法的基本思想
当寻求问题的一个最优解时,可以用剪枝函数来 加速搜索,该函数给出每一个可行结点相应的子 树可能获得的最大价值的上界。如果这个上界不 会比当前最优值更大,则说明相应的子树中不含 问题的最优解,因而可以剪去, 另一方面,我们也可以将上界函数确定的每个结 点的上界值作为优先级,以该优先级的非增序抽 取当前扩展结点,这种策略有时可以更迅速地找 到最优解。
19
6.2装载问题
该算法包含两个函数 MaxLoading函数具体实施对解空间的分支限 界搜索。 EnQueue用于将活结点加入到活结点队列中, 该函数首先检查i是否等于n,如果i=n,则表示 当前活结点为一个叶结点,由于叶结点不会被 进一步扩展,因此不必加入到活结点,如果该 叶结点表示的可行解优于当前最优解,更新最 优解。当i<n时,当前活结点是一个内部结点, 加入到活结点队列中。
21
6.2装载问题
template<class T> void EnQueue( Queue<T> &Q, T wt, T& bestw, int i, int n) //该函数负责加入活结点 { // 如果不是叶结点,则将结点权值w t加入队列Q if (i == n) { // 叶子 if (wt > bestw) bestw = wt; } else Q.Add(wt); // 不是叶子 }
第6章 分支限界法
2. 算法思想
解单源最短路径问题的优先队列式分支限界法用一极小
堆来存储活结点表。其优先级是结点所对应的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s被扩展后, 它的儿子结点被依次插入堆中。
算法每次从堆中取出具有最小当前路长的结点作为当前扩 展结点,并依次检查与当前扩展结点相邻的所有顶点。
class QNode {QNode *parent; // 指向父结点的指针
bool LChild;
Type weight;
// 左儿子标志
// 结点所相应的载重量
找到最优值后,可以根据parent回溯到根节点,找到 最优解。
// 构造当前最优解 for (int j = n - 1; j > 0; j--) { bestx[j] = bestE->LChild; //bestx存储最优解路径 bestE = bestE->parent; //回溯构造最优解 }
直到找到所需的解或活动结点表为空为止
5
分支限界法与回溯法的差别
分支限界法不仅通过约束条件, 而且可通过 目标函数的限界来减少无效搜索.
回溯法是深度优先搜索, 而分支限界法是广 度优先搜索. 采用广度优先搜索策略的目的是: 尽早发现 剪枝点.
6
常见的两种分支限界法
(1)队列式(FIFO)分支限界法 将活结点表组织成一个队列,按照先进先出 (FIFO)原则选取下一个结点为扩展结点。 (2)优先队列式分支限界法
将活结点表组织成一个优先队列,按照规定的优先 级选取优先级最高的结点成为当前扩展结点。
• 算法实现时,通常用极大(小)堆来实现 最大(小)优先队列,提取堆中下一个结 点为当前扩展结点,体现最大(小)费用 优先的原则。 • 极大堆满足一个节点必定不小于其子节点, 极小堆正好相反。 • 极大堆中最大的元素必定是其根节点,堆 排序算法正是根据这个特性而产生的:对 一个序列,将其构造为极大堆,然后将根 节点(数组首元素)和数组的尾元素交换, 之后对除了尾元素之外的序列继续以上过 程,直到排序完成。
第6章__分支限界法
20
算法的改进
节点的左子树表示将此集装箱装上船,右 子树表示不将此集装箱装上船。
设bestw是当前最优解;ew是当前扩展结点所相 应的重量;r是剩余集装箱的重量。则当 ew+rbestw时,可将其右子树剪去,因为此时 若要船装最多集装箱,就应该把此箱装上船。
另外,为了确保右子树成功剪枝,应该在 算法每一次进入左子树的时候更新bestw的 值。
28
优先队列式分支限界法
在优先队列式分支限界法中,一旦有一个叶结 点成为当前扩展结点,则可以断言该叶结点所 相应的解即为最优解。此时可终止算法。 最大优先级队列中的活节点都是互相独立的, 因此每个活节点内部必须记录从子集树的根到 此节点的路径。 一旦找到了最优装载所对应的叶节点,就利用 这些路径信息来计算x 值。
分支限界法
1
提纲
分支限界法的基本思想 装载问题 布线问题 0-1背包问题 小结
2
提纲
分支限界法的基本思想 装载问题 布线问题 0-1背包问题 小结
3
分支限界法的基本思想
分支限界法与回溯法的不同
求解目标
回溯法:所有解 分支限界法:找出满足约束条件的一个解,或是满 足约束条件的解中找出在某种意义下的最优解。 回溯法:深度优先搜索解空间树 分支限界法:广度优先或以最小耗费(最大收益)优先 的方式搜索解空间树。
25
构造最优解
算法EnQueue做如下修改: void EnQueue(…..) {// 如不是叶节点,向Q中添加一个i 层、重量为wt的活节点 // 新节点是E的孩子。当且仅当是左孩子时,ch为true。 if (i == n) // 叶子 { if (wt == bestw) // 目前的最优解 { bestE = E; bestx[n] = ch;} return; } QNode<T> *b; // 不是叶子, 添加到队列中 b = new QNode<T>; b->weight = wt; b->parent = E; b->LChild = ch; Q.Add(b); }
算法的改进
节点的左子树表示将此集装箱装上船,右 子树表示不将此集装箱装上船。
设bestw是当前最优解;ew是当前扩展结点所相 应的重量;r是剩余集装箱的重量。则当 ew+rbestw时,可将其右子树剪去,因为此时 若要船装最多集装箱,就应该把此箱装上船。
另外,为了确保右子树成功剪枝,应该在 算法每一次进入左子树的时候更新bestw的 值。
28
优先队列式分支限界法
在优先队列式分支限界法中,一旦有一个叶结 点成为当前扩展结点,则可以断言该叶结点所 相应的解即为最优解。此时可终止算法。 最大优先级队列中的活节点都是互相独立的, 因此每个活节点内部必须记录从子集树的根到 此节点的路径。 一旦找到了最优装载所对应的叶节点,就利用 这些路径信息来计算x 值。
分支限界法
1
提纲
分支限界法的基本思想 装载问题 布线问题 0-1背包问题 小结
2
提纲
分支限界法的基本思想 装载问题 布线问题 0-1背包问题 小结
3
分支限界法的基本思想
分支限界法与回溯法的不同
求解目标
回溯法:所有解 分支限界法:找出满足约束条件的一个解,或是满 足约束条件的解中找出在某种意义下的最优解。 回溯法:深度优先搜索解空间树 分支限界法:广度优先或以最小耗费(最大收益)优先 的方式搜索解空间树。
25
构造最优解
算法EnQueue做如下修改: void EnQueue(…..) {// 如不是叶节点,向Q中添加一个i 层、重量为wt的活节点 // 新节点是E的孩子。当且仅当是左孩子时,ch为true。 if (i == n) // 叶子 { if (wt == bestw) // 目前的最优解 { bestE = E; bestx[n] = ch;} return; } QNode<T> *b; // 不是叶子, 添加到队列中 b = new QNode<T>; b->weight = wt; b->parent = E; b->LChild = ch; Q.Add(b); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本策略
– 对每一活结点计算一个优先级(某些信息的函数值),并根据这 些优先级; – 从当前活结点表中优先选择一个优先级最高(最有利)的结点作 为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便 尽快地找出一个最优解。 – 再从活结点表中下一个优先级别最高的结点为当前扩展结点,……, 直到找到一个解或活结点队列为空为止。
3 6 D:(1,3,-,-)
7 11 H(1,3,2,-)
9 8 26 14 I(1,3,4,-) J(1,4,2,-) >25
10 24 K(1,4,3,-)
36 21 19 60 29 M(1,2,4,3) N(1,3,2,4) O(1,3,4,2) P(1,4,2,3) Q(1,4,3,2) 25 25 66 >25
13
算法设计与分析
© ZZU
第六章 分支限界
6.2 单源最短路径问题
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]; 顶点i和j间有边,且此 prev[j]=E.i; 路径长小于原先从原点 // 加入活结点优先队列 到j的路径长 MinHeapNode<Type> N; N.i=j; N.length=dist[j]; H.Insert(N);} try {H.DeleteMin(E);} // 取下一扩展结点 catch (OutOfBounds) {break;} // 优先队列空 } }
算法设计与分析
4
© ZZU
第六章 分支限界
分支限界法的搜索策略 按照广度优先的原则,一个活结点一旦成为扩展结 点(E-结点)R后,算法将依次生成它的全部孩子结 点,将那些导致不可行解或导致非最优解的儿子舍 弃,其余儿子加入活结点表中。 然后,从活结点表中取出一个结点作为当前扩展结 点。 重复上述结点扩展过程,直至找到问题的解或判定 无解为止。
5
算法设计与分析
© ZZU
第六章 分支限界
6.1 分支限界法的基本思想
常见的两种分支限界法
(1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点 为扩展节点。活结点表是先进先出队列。 (2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节 点成为当前扩展节点。活结点表是优先权队列。
9 算法设计与分析 © ZZU
第六章 分支限界
6.2 单源最短路径问题
1. 问题描述
下面以一个例子来说明单源最短路径问题:在下图所给的有 向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目 标顶点t之间的最短路径。
10
算法设计与分析
© ZZU
第六章 分支限界
6.2 单源最短路径问题
1. 问题描述
38
算法设计与分析
© ZZU
第六章 分支限界
6.7 旅行售货员问题
1 6 4
30
5
2 10 4
1. 问题描述
3
20
某售货员要到若干城市去推销商品,已知各城市之间的路程(或 旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻 地的路线,使总的路程(或总旅费)最小。 路线是一个带权图。图中各边的费用(权)为正数。图的一条 周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是 这条路线上所有边的费用之和。 旅行售货员问题的解空间可以组织成一棵树,从树的根结点到 任一叶结点的路径定义了图的一条周游路线。旅行售货员问题要在 图G中找出费用最小的周游路线。
42
算法设计与分析
© ZZU
第六章 分支限界
TSP问题
1.队列式分支限界
A:(-,-,-,-) 1 B:(1,-,-,-) 2 30 C:(1,2,-,-) 5 35 F (1,2,3,-) 55 L(1,2,3,4) 59 6 40 G(1,2,4,-)
1 6 3 4
30 5
2 10 4
20 4 4 E:(1,4,-,-)
23 算法设计与分析 © ZZU
第六章 分支限界
6.4 布线问题
1. 算法思想
解此问题的队列式分支限界法从起始位置 a开始将它作 为第一个扩展结点。与该扩展结点相邻并且可达的方格成为 可行结点被加入到活结点队列中,并且将这些方格标记为 1, 即从起始方格a到这些方格的距离为1。
接着,算法从活结点队列中取出队首结点作为下一个扩 展结点,并将与当前扩展结点相邻且未标记过的方格标记为 2,并存入活结点队列。这个过程一直继续到算法搜索到目 标方格b或活结点队列为空时为止。即加入剪枝的广度优先 搜索。
3
4 5 7 26 6 24 11 14 40 G(1,2,4,-) H(1,3,2,-) I(1,3,4,-) J(1,4,2,-) K(1,4,3,-) >25 36 21 19 60 M(1,2,4,3) N(1,3,2,4) O(1,3,4,2) P(1,4,2,3) 25 25 29 Q(1,4,3,2) >25
第六章 分支限界
郑州大学
© ZZU © ZZU
第六章 分支限界
学习要点
理解分支限界法的剪枝搜索策略。 掌握分支限界法的算法框架
(1)队列式(FIFO)分支限界法
(2)优先队列式分支限界法 通过应用范例学习分支限界法的设计策略。 (1)单源最短路径问题;(2)装载问题; (3)布线问题; (4)0-1背包问题;(5)最大团问题;
© ZZU
47
算法设计与分析
12
算法设计与分析
© ZZU
第六章 分支限界
6.2 单源最短路径问题
3. 剪枝策略
在算法扩展结点的过程中,一旦发现一个结点的下界不小 于当前找到的最短路长,则算法剪去以该结点为根的子树。
在算法中,利用结点间的控制关系进行剪枝。从源顶点s出 发, 2条不同路径到达图 G的同一顶点。由于两条路径的路长不 同,因此可以将路长长的路径所对应的树中的结点为根的子树 剪去。
布线问题的解空间是一个图,适合采用队列式分支限界法来解决。从起始位置a开始 将它作为第一个扩展结点。与该结点相邻并且可达的方格被加入到活结点队列中,并 且将这些方格标记为1,表示它们到a的距离为1。接着从活结点队列中取出队首作为 下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为 2,并存入活节 点队列。这个过程一直继续到算法搜索到目标方格 b或活结点队列为空时为止(表示 没有通路)。
下图是用优先队列式分支限界法解有向图G的单源最短路径问 题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对 应的当前路长。
11
算法设计与分析
© ZZU
第六章 分支限界
6.2 单源最短路径问题
2. 算法思想
解单源最短路径问题的优先队列式分支限界法用一极小堆来 存储活结点表。其优先级是结点所对应的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它 的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当 前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相 邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源 出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优 路径长度,则将该顶点作为活结点插入到活结点优先队列中。这 个结点的扩展过程一直继续到活结点优先队列为空时为止。
35 算法设计与分析 © ZZU
第六章 分支限界
6.6 最大团问题 不要求
1. 问题描述
给定无向图G=(V,E)。如果UV,且对任意u,vU有(u,v)E, 则称U是G的完全子图。G的完全子图U是G的团当且仅当U不包含在G的 更大的完全子图中。G的最大团是指G中所含顶点数最多的团。 下图G中,子集{1,2}是G的大小为2的完全子图。这个完全子图 不是团,因为它被G的更大的完全子图{1,2,5}包含。{1,2,5}是 G的最大团。{1,4,5}和{2,3,5}也是G的最大团。
(2)将剩余的集装箱装上第二艘轮船。
15 算法设计与分析 © ZZU
第六章 分支限界
6.4 布线问题
布线问题 :印刷电路板将布线区域划分成n*m个方格阵列。精确的电路布线问题要 求确定连接方格a的中点到方格 b的中点的最短布线方案。在布线时,电路只能沿 直线或直角布线。为了避免线路相交,已布了线的方格做了封锁标记,其他线路不 允许穿过被封锁的方格。
14 算法设计与分析 不讲
1. 问题描述
有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集
装箱i的重量为Wi,且
w
i 1
n
i
c1 c2
装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上 这2艘轮船。如果有,找出一种装载方案。 容易证明:如果一个给定装载问题有解,则采用下面的策略可得到 最优装载方案。 (1)首先将第一艘轮船尽可能装满;
3
算法设计与分析
© ZZU
第六章 分支限界
什么是分支限界法
采用广度优先产生状态空间树的结点, 并使用剪枝函数的方法称为分枝限界法。
–所谓“分支”是采用广度优先的策略,依次 生成扩展结点的所有分支(即:儿子结点)。
–所谓“限界”是在结点扩展过程中,计算结 点的上界(或下界),边搜索边减掉搜索树 的某些分支,从而提高搜索效率
第六章 分支限界
33
算法设计与分析
© ZZU
第六章 分支限界
34
算法设计与分析
© ZZU
第六章 分支限界
6.5