算法——分支限界法

简介:

对比回溯法

  • 回溯法的求解目标是找出解空间中满足约束条件的所有解,想必之下,分支限界法的求解目标则是找出满足约束条件的一个解,或是满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
  • 另外还有一个非常大的不同点就是,回溯法以深度优先的方式搜索解空间,而分支界限法则以广度优先的方式或以最小耗费优先的方式搜索解空间。

分支限界法的搜索策略

在当前节点(扩展节点)处,先生成其所有的儿子节点(分支),然后再从当前的活节点(当前节点的子节点)表中选择下一个扩展节点。为了有效地选择下一个扩展节点,加速搜索的进程,在每一个活节点处,计算一个函数值(限界),并根据函数值,从当前活节点表中选择一个最有利的节点作为扩展节点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。分支限界法解决了大量离散最优化的问题。

选择方法

1.队列式(FIFO)分支限界法

队列式分支限界法将活节点表组织成一个队列,并将队列的先进先出原则选取下一个节点为当前扩展节点。

2.优先队列式分支限界法

优先队列式分支限界法将活节点表组织成一个优先队列,并将优先队列中规定的节点优先级选取优先级最高的下一个节点成为当前扩展节点。如果选择这种选择方式,往往将数据排成最大堆或者最小堆来实现。


例子:装载问题

有一批共n个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。
可证明,采用如下策略可以得到一个最优装载方案:先尽可能的将第一艘船装满,其次将剩余的集装箱装到第二艘船上。

代码如下:

复制代码
 1 //分支限界法解装载问题
 2 
 3 //子函数,将当前活节点加入队列
 4 template<class Type>
 5 void EnQueue(Queue<Type> &Q, Type wt, Type &bestw, int i, int n) 
 6 {
 7     if(i == n)     //可行叶结点
 8     {     
 9         if(wt>bestw) bestw = wt ;
10     }
11     else Q.Add(wt) ; //非叶结点
12 }
13 
14 //装载问题先尽量将第一艘船装满
15 //队列式分支限界法,返回最优载重量
16 template<class Type>
17 Type MaxLoading(Type w[],Type c,int n)
18 {
19     //初始化数据
20     Queue<Type> Q;    //保存活节点的队列
21     Q.Add(-1);    //-1的标志是标识分层
22     int i=1;    //i表示当前扩展节点所在的层数
23     Type Ew=0;    //Ew表示当前扩展节点的重量
24     Type bestw=0;    //bestw表示当前最优载重量
25     
26     //搜索子集空间树
27     while(true)
28     {
29         if(Ew+w[i]<=c)    //检查左儿子
30             EnQueue(Q,Ew+w[i],bestw,i,n);    //将左儿子添加到队列
31         
32         //将右儿子添加到队列 即表示不将当前货物装载在第一艘船
33         EnQueue(Q,Ew,bestw,i,n);
34         Q.Delete(Ew);    //取下一个节点为扩展节点并将重量保存在Ew
35         if(Ew==-1)    //检查是否到了同层结束
36         {
37             if(Q.IsEmpty()) return bestw;    //遍历完毕,返回最优值
38             Q.Add(-1);    //添加分层标志
39             Q.Delete(Ew);    //删除分层标志,进入下一层
40             i++;
41         }
42     }
43 }
复制代码

 

算法MaxLoading的计算时间和空间复杂度为O(2^n).

上述算法可以改进,设r为剩余集装箱的重量,当Ew+r<=bestw的时候,可以将右子树剪去。因为最优值不可能出现在下面了。

改进代码如下:

分支限界法解装载问题的改进

 

 

用处

分支限界法解决了大量离散最优化问题。

 

参考资料

计算机算法设计与分析/王晓东编著。-3版。-北京:电子工业出版社,2007.5

本文转自 Ron Ngai 博客园博客,原文链接:http://www.cnblogs.com/rond/archive/2012/07/09/2583658.html  ,如需转载请自行联系原作者

相关文章
|
算法 Java C++
【洛谷算法题】P5709-Apples Prologue / 苹果和虫子【入门2分支结构】
【洛谷算法题】P5709-Apples Prologue / 苹果和虫子【入门2分支结构】
|
3月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
49 9
|
4月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【8月更文挑战第2天】决策树算法以其直观性和解释性在机器学习领域中独具魅力,尤其擅长处理非线性关系。相较于复杂模型,决策树通过简单的分支逻辑实现数据分类,易于理解和应用。本示例通过Python的scikit-learn库演示了使用决策树对鸢尾花数据集进行分类的过程,并计算了预测准确性。虽然决策树优势明显,但也存在过拟合等问题。即便如此,无论是初学者还是专家都能借助决策树的力量提升数据分析能力。
45 4
|
7月前
|
算法 JavaScript
算法(分治、贪心、dp、回溯、分支限界)总结
算法(分治、贪心、dp、回溯、分支限界)总结
|
7月前
|
算法 测试技术 编译器
【算法】优先队列式分支限界法,以01背包问题为例
📑 例题:01背包问题 题目链接:采药-洛谷 当洛谷上不让下载测试用例,可以试试:采药-ACWing
583 0
|
存储 算法 搜索推荐
动态规划、回溯搜索、分治算法、分支定界算法
动态规划、回溯搜索、分治算法、分支定界算法
|
算法 Java C++
【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】
【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】
|
算法
文本主题相关的主要算法分支与思考
文本主题相关的主要算法分支与思考
60 0
|
算法 C语言
C语言基础(有关三角形面积,阶乘算法,sqrt,pow函数,海伦公式,gets,getchar,scanf的区别,字符转换,增长率计算,的分支和循环的结构程序设计)
C语言基础(有关三角形面积,阶乘算法,sqrt,pow函数,海伦公式,gets,getchar,scanf的区别,字符转换,增长率计算,的分支和循环的结构程序设计)
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面