分支限界法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
为何称为分支限界法? ※ 分支 在扩展结点处,先生成其所有的儿子结点(分支),然 后再从当前的活结点表中选择下一个扩展结点。 ※ 限界 为了有效地选择下一扩展结点,加速搜索进程,在每个 活结点处,计算一个函数值(限界),并根据函数值,从 当 前活结点表中选择一个最有利的结点作为扩展结点,使搜 索 朝着解空间树上有最优解的分支推进,一遍尽快找出一个 最 优解。
7
例:0-1背包问题,w=[16,15,15],p=[45,25,25],c=30
队列式分支限界法搜索解空间树与广度优先 遍历的区别:前者不搜索以不可行结点为根 的子树。
队列式分支限界法:用一个队列来存储活结点表。(196页)
A入队→B,C入队(并且舍弃A)→E入队(D不可行,舍弃)→F,G入队→J 不可行,舍弃,K是可行的叶结点,是一个可行解→L,M均为可行叶结点, 得到相应的可行解→N,O可行叶结点,得相应可行解→活结点队列空
6.2 单源最短路径问题
3. 剪枝策略
在算法扩展结点的过程中,一旦发现一个结点的下界不 小于当前找到的最短路长,则算法剪去以该结点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。从源顶点 s出发, 2条不同路径到达图 G的同一顶点。由于两条路径的 路长不同,因此可以将路长长的路径所对应的树中的结点为 根的子树剪去。
6
堆
具有n个元素的序列(h1,h2,...,hn),当且仅当满足 (hi>=h2i,hi>=h2i+1)或(hi<=h2i,hi<=h2i+1) (i=1,2,...,n/2)时称之为堆。
可以用完全二叉树来表示堆,根据根大于或小于其子 结点,可以分为大根堆、小根堆。 堆可以高效地表示某些动态优先链表,结点的值对应 于事件的优先级,一个事件的优先级可以在任何时间改 变。例如在仿真中的事件链表或操作系统的任务链表。 分支限界通过相关计算决定接下来应该选择哪个结点 进行搜索,并用一个优先链表保存那些已经生成但还未 查看的结点,所以用堆来表示比较理想。
分支限界法
1
6.1 分支限界法的基本思想
1. 分支限界法与回溯法的不同
(1)求解目标: 回溯法:找出解空间树中满足约束条件的所有解; 分支限界法:找出满足约束条件的一个解,或是在满足约 束条件的解中找出在某种意义下的最优解。 (2)搜索方式的不同:
回溯法:深度优先的方式搜索解空间树;
分支限界法则:广度优先或以最小耗费优先的方式搜索解 空间树。
例:4城市旅行商问题
1
6 4 10 30
2
5
3ቤተ መጻሕፍቲ ባይዱ
20
4
队列式分支限界法:用一个队列来存储活结点表。(197页)
B入队→C,D,E入队(并且舍弃B)→F,G入队(并且舍弃C)→H,I入队(并 且舍弃D)→ J,K入队(并且舍弃E) → ……
优先队列式分支限界法:用最小堆实现优先队列,优先级 为结点的当前费用。(198页)
11
6.2 单源最短路径问题
2. 算法思想
用最大堆还是最小堆存储活结点表? 其优先级是结点所对应的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s被扩展 后,它的儿子结点被依次插入堆中。此后,算法从堆中取出 具有最小当前路长的结点作为当前扩展结点,并依次检查与 当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶 点j有边可达,且从源出发,途经顶点i再到顶点j的所相应 的路径的长度小于当前最优路径长度,则将该顶点作为活结 点插入到活结点优先队列中。这个结点的扩展过程一直继续 到活结点优先队列为空时为止。 12
B入堆→C,D,E入堆(并且舍弃B)→J,K入堆(并且舍弃E)→……
9
6.2 单源最短路径问题
1. 问题描述
下面以一个例子来说明单源最短路径问题:在下图所给的有 向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目 标顶点t之间的最短路径。
10
6.2 单源最短路径问题
下图是用优先队列式分支限界法解有向图G的单源最 为什么解空间树中没有列出所 短路径问题产生的解空间树。其中,每一个结点旁边的 有的路径?(通过限界,剪枝) 数字表示该结点所对应的当前路长。
优先队列式分支限界法:用最大堆实现优先队列,优先级 为活结点所获得的价值。(197页)
A入堆→B,C入堆(并且舍弃A)→E入堆(D不可行,舍弃)→J不可行, 舍弃,K是可行的叶结点,是一个可行解→ F,G入堆→ L,M均为可行叶结 点,得到相应的可行解→N,O可行叶结点,得相应可行解→活结点堆空
8
3
6.1 分支限界法的基本思想
2. 分支限界法基本思想 *广度优先或以最小耗费(最大效益)优先的方式 每一个活结点只有一次机会成为扩展结点。活结点一旦成 为扩展结点,就一次性产生其所有儿子结点。在这些儿子结 点中,导致不可行解或导致非最优解的儿子结点被舍弃,其 余儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展结点,并重
问题:优先级如何规定?
5
例如背包问题 优先队列中规定的结点优先级常用一个与该结点相关的 数值p表示。 最大优先队列:规定p值较大的结点优先级高,体现最 例如旅行商问题 大效益优先的原则,常用最大堆来实现。 最小优先队列:规定p值较小的优先级高,体现最小费 用优先的原则,常用最小堆来实现。
用优先队列式分支限界法求解时,应根据具体问题的特 点确定选用最大优先队列或最小优先队列表示解空间的活 结 点表。
13
6.2 单源最短路径问题
算法描述:教材200页
while (true) { // 搜索问题的解空间 for (int j=1;j<=n;j++)
if(a[enode.i][j] < Float.MAX_VALUE && enode.length+a[enode.i][j] < dist[j])
复上述结点扩展过程。这个过程一直持续到找到所需的解或 活结点表为空时为止。
4
6.1 分支限界法的基本思想
3. 常见的两种分支限界法
(1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为扩展节 点。 (2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节点成为 当前扩展节点。
为何称为分支限界法? ※ 分支 在扩展结点处,先生成其所有的儿子结点(分支),然 后再从当前的活结点表中选择下一个扩展结点。 ※ 限界 为了有效地选择下一扩展结点,加速搜索进程,在每个 活结点处,计算一个函数值(限界),并根据函数值,从 当 前活结点表中选择一个最有利的结点作为扩展结点,使搜 索 朝着解空间树上有最优解的分支推进,一遍尽快找出一个 最 优解。
7
例:0-1背包问题,w=[16,15,15],p=[45,25,25],c=30
队列式分支限界法搜索解空间树与广度优先 遍历的区别:前者不搜索以不可行结点为根 的子树。
队列式分支限界法:用一个队列来存储活结点表。(196页)
A入队→B,C入队(并且舍弃A)→E入队(D不可行,舍弃)→F,G入队→J 不可行,舍弃,K是可行的叶结点,是一个可行解→L,M均为可行叶结点, 得到相应的可行解→N,O可行叶结点,得相应可行解→活结点队列空
6.2 单源最短路径问题
3. 剪枝策略
在算法扩展结点的过程中,一旦发现一个结点的下界不 小于当前找到的最短路长,则算法剪去以该结点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。从源顶点 s出发, 2条不同路径到达图 G的同一顶点。由于两条路径的 路长不同,因此可以将路长长的路径所对应的树中的结点为 根的子树剪去。
6
堆
具有n个元素的序列(h1,h2,...,hn),当且仅当满足 (hi>=h2i,hi>=h2i+1)或(hi<=h2i,hi<=h2i+1) (i=1,2,...,n/2)时称之为堆。
可以用完全二叉树来表示堆,根据根大于或小于其子 结点,可以分为大根堆、小根堆。 堆可以高效地表示某些动态优先链表,结点的值对应 于事件的优先级,一个事件的优先级可以在任何时间改 变。例如在仿真中的事件链表或操作系统的任务链表。 分支限界通过相关计算决定接下来应该选择哪个结点 进行搜索,并用一个优先链表保存那些已经生成但还未 查看的结点,所以用堆来表示比较理想。
分支限界法
1
6.1 分支限界法的基本思想
1. 分支限界法与回溯法的不同
(1)求解目标: 回溯法:找出解空间树中满足约束条件的所有解; 分支限界法:找出满足约束条件的一个解,或是在满足约 束条件的解中找出在某种意义下的最优解。 (2)搜索方式的不同:
回溯法:深度优先的方式搜索解空间树;
分支限界法则:广度优先或以最小耗费优先的方式搜索解 空间树。
例:4城市旅行商问题
1
6 4 10 30
2
5
3ቤተ መጻሕፍቲ ባይዱ
20
4
队列式分支限界法:用一个队列来存储活结点表。(197页)
B入队→C,D,E入队(并且舍弃B)→F,G入队(并且舍弃C)→H,I入队(并 且舍弃D)→ J,K入队(并且舍弃E) → ……
优先队列式分支限界法:用最小堆实现优先队列,优先级 为结点的当前费用。(198页)
11
6.2 单源最短路径问题
2. 算法思想
用最大堆还是最小堆存储活结点表? 其优先级是结点所对应的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s被扩展 后,它的儿子结点被依次插入堆中。此后,算法从堆中取出 具有最小当前路长的结点作为当前扩展结点,并依次检查与 当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶 点j有边可达,且从源出发,途经顶点i再到顶点j的所相应 的路径的长度小于当前最优路径长度,则将该顶点作为活结 点插入到活结点优先队列中。这个结点的扩展过程一直继续 到活结点优先队列为空时为止。 12
B入堆→C,D,E入堆(并且舍弃B)→J,K入堆(并且舍弃E)→……
9
6.2 单源最短路径问题
1. 问题描述
下面以一个例子来说明单源最短路径问题:在下图所给的有 向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目 标顶点t之间的最短路径。
10
6.2 单源最短路径问题
下图是用优先队列式分支限界法解有向图G的单源最 为什么解空间树中没有列出所 短路径问题产生的解空间树。其中,每一个结点旁边的 有的路径?(通过限界,剪枝) 数字表示该结点所对应的当前路长。
优先队列式分支限界法:用最大堆实现优先队列,优先级 为活结点所获得的价值。(197页)
A入堆→B,C入堆(并且舍弃A)→E入堆(D不可行,舍弃)→J不可行, 舍弃,K是可行的叶结点,是一个可行解→ F,G入堆→ L,M均为可行叶结 点,得到相应的可行解→N,O可行叶结点,得相应可行解→活结点堆空
8
3
6.1 分支限界法的基本思想
2. 分支限界法基本思想 *广度优先或以最小耗费(最大效益)优先的方式 每一个活结点只有一次机会成为扩展结点。活结点一旦成 为扩展结点,就一次性产生其所有儿子结点。在这些儿子结 点中,导致不可行解或导致非最优解的儿子结点被舍弃,其 余儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展结点,并重
问题:优先级如何规定?
5
例如背包问题 优先队列中规定的结点优先级常用一个与该结点相关的 数值p表示。 最大优先队列:规定p值较大的结点优先级高,体现最 例如旅行商问题 大效益优先的原则,常用最大堆来实现。 最小优先队列:规定p值较小的优先级高,体现最小费 用优先的原则,常用最小堆来实现。
用优先队列式分支限界法求解时,应根据具体问题的特 点确定选用最大优先队列或最小优先队列表示解空间的活 结 点表。
13
6.2 单源最短路径问题
算法描述:教材200页
while (true) { // 搜索问题的解空间 for (int j=1;j<=n;j++)
if(a[enode.i][j] < Float.MAX_VALUE && enode.length+a[enode.i][j] < dist[j])
复上述结点扩展过程。这个过程一直持续到找到所需的解或 活结点表为空时为止。
4
6.1 分支限界法的基本思想
3. 常见的两种分支限界法
(1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为扩展节 点。 (2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节点成为 当前扩展节点。