博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法——分支限界法
阅读量:7121 次
发布时间:2019-06-28

本文共 1853 字,大约阅读时间需要 6 分钟。

对比回溯法

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

分支限界法的搜索策略

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

选择方法

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

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

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

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

例子:装载问题

有一批共n个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。

可证明,采用如下策略可以得到一个最优装载方案:先尽可能的将第一艘船装满,其次将剩余的集装箱装到第二艘船上。

代码如下:

//分支限界法解装载问题//子函数,将当前活节点加入队列template
void EnQueue(Queue
&Q, Type wt, Type &bestw, int i, int n) { if(i == n) //可行叶结点 { if(wt>bestw) bestw = wt ; } else Q.Add(wt) ; //非叶结点}//装载问题先尽量将第一艘船装满//队列式分支限界法,返回最优载重量template
Type MaxLoading(Type w[],Type c,int n){ //初始化数据 Queue
Q; //保存活节点的队列 Q.Add(-1); //-1的标志是标识分层 int i=1; //i表示当前扩展节点所在的层数 Type Ew=0; //Ew表示当前扩展节点的重量 Type bestw=0; //bestw表示当前最优载重量 //搜索子集空间树 while(true) { if(Ew+w[i]<=c) //检查左儿子 EnQueue(Q,Ew+w[i],bestw,i,n); //将左儿子添加到队列 //将右儿子添加到队列 即表示不将当前货物装载在第一艘船 EnQueue(Q,Ew,bestw,i,n); Q.Delete(Ew); //取下一个节点为扩展节点并将重量保存在Ew if(Ew==-1) //检查是否到了同层结束 { if(Q.IsEmpty()) return bestw; //遍历完毕,返回最优值 Q.Add(-1); //添加分层标志 Q.Delete(Ew); //删除分层标志,进入下一层 i++; } }}

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

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

改进代码如下:

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

 

 

用处

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

 

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

转载地址:http://dhsel.baihongyu.com/

你可能感兴趣的文章
nefu 115
查看>>
drf版本控制 和django缓存,跨域问题,
查看>>
SVN环境搭建详解(来源网络)
查看>>
设备驱动基础学习--字符驱动实现
查看>>
sourceinsight安装记录
查看>>
PHP函数索引-F
查看>>
数组[]
查看>>
C++学习之基本概念
查看>>
el captain设置环境变量
查看>>
Educational Codeforces Round 37 A B C
查看>>
UVA 129 Krypton Factor(DFS 回溯)
查看>>
小程序(一)
查看>>
POJ 2689
查看>>
java 继承 String类
查看>>
开始gentoo之旅
查看>>
【python+flume+kafka+spark streaming】编写word_count入门示例
查看>>
HDU1693 Eat The Trees(插头dp)
查看>>
VR+時尚
查看>>
部署Hadoop高性能集群
查看>>
zabbix Maintenance维护周期
查看>>