分支限界法 java_算法——分支限界法(装载问题)
回溯法的求解目标是找出解空间中满足约束条件的所有解,想必之下,分支限界法的求解目标则是找出满足约束条件的一个解,或是满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
另外还有一个非常大的不同点就是,回溯法以深度优先的方式搜索解空间,而分支界限法则以广度优先的方式或以最小耗费优先的方式搜索解空间。
分支限界法的搜索策略
在当前节点(扩展节点)处,先生成其所有的儿子节点(分支),然后再从当前的活节点(当前节点的子节点)表中选择下一个扩展节点。为了有效地选择下一个扩展节点,加速搜索的进程,在每一个活节点处,计算一个函数值(限界),并根据函数值,从当前活节点表中选择一个最有利的节点作为扩展节点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。分支限界法解决了大量离散最优化的问题。
选择方法
1.队列式(FIFO)分支限界法
队列式分支限界法将活节点表组织成一个队列,并将队列的先进先出原则选取下一个节点为当前扩展节点。
2.优先队列式分支限界法
优先队列式分支限界法将活节点表组织成一个优先队列,并将优先队列中规定的节点优先级选取优先级最高的下一个节点成为当前扩展节点。如果选择这种选择方式,往往将数据排成最大堆或者最小堆来实现。
例子:装载问题
有一批共n个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。
可证明,采用如下策略可以得到一个最优装载方案:先尽可能的将第一艘船装满,其次将剩余的集装箱装到第二艘船上。
代码如下:
//分支限界法解装载问题//子函数,将当前活节点加入队列
template
void EnQueue(Queue &Q, Type wt, Type &bestw, int i, intn)
{if(i == n) //可行叶结点
{if(wt>bestw) bestw =wt ;
}else Q.Add(wt) ; //非叶结点
}//装载问题先尽量将第一艘船装满//队列式分支限界法,返回最优载重量
templateType MaxLoading(Type w[],Type c,intn)
{//初始化数据
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的时候,可以将右子树剪去。因为最优值不可能出现在下面了。
改进代码如下:
分支限界法解装载问题的改进//分支限界法解装载问题//装载问题先尽量将第一艘船装满//队列式分支限界法,返回最优载重量
templateType MaxLoading(Type w[],Type c,intn)
{//初始化数据
Queue Q; //保存活节点的队列
Q.Add(-1); //-1的标志是标识分层
int i=1; //i表示当前扩展节点所在的层数
Type Ew=0; //Ew表示当前扩展节点的重量
Type bestw=0; //bestw表示当前最优载重量//搜索子集空间树
while(true)
{//检查左儿子
Type wt=Ew+w[i]; //wt为左儿子节点的重量
if(wt<=c) //若装载之后不超过船体可承受范围
if(wt>bestw) //更新最优装载重量
{
bestw=wt;if(i
}//将右儿子添加到队列
if(Ew+r>bestw&&i
Q.Add(Ew);
Q.Delete(Ew);//取下一个节点为扩展节点并将重量保存在Ew
if(Ew==-1) //检查是否到了同层结束
{if(Q.IsEmpty()) return bestw; //遍历完毕,返回最优值
Q.Add(-1); //添加分层标志
Q.Delete(Ew); //删除分层标志,进入下一层
i++;
r-=w[i]; //剩余集装箱重量
}
}
}
用处
分支限界法解决了大量离散最优化问题。
分支限界法 java_算法——分支限界法(装载问题)相关推荐
- 分支限界法 java_算法java实现–分支限界法–单源最短路径问题 | 学步园
单源最短路径问题的java实现(分支限界法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8900872 ...
- 分支限界法 java_分支限界法装载问题java
1.问题描述:已知有N个物品和一个可以容纳M重量的背包,每种物品I的重量为WEIGHT,一个只能全放入或者不放入,求解如何放入物品,可以使背包里的物品的总效益最大. 2.设计思想与分析:对物品的选取与 ...
- 装载问题-分支限界法(队列式分支限界法,优先队列式分支限界法)
问题描述 有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且 ∑i=1nwi≤c1+c2\sum^n_{i=1}w_i≤c_1+c_2i=1∑n ...
- 分支限界法实现最优装载c++_分支限界法
晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...
- 分支限界法 tsp java_基于分支限界法的旅行商问题(TSP)一
//分支限界法 #include#include#include#include const int INF = 100000;const int MAX_N = 22;using namespace ...
- 两道关于回溯法,分支限界法的算法题
1.最小重量机器设计问题:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得.设 wij 是从供应商j处购得的部件 i 的重量, cij 是相应的价格.试设计一个算法,给出总价格 ...
- 布线问题分支限界法java_大型布线:Java云应用程序缺少的技术
布线问题分支限界法java 您是否曾经想过,为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务? 我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 (跳 ...
- 单源最短路径-分支限界法-优先队列式分支限界法-Dijkstra
问题描述: 给定一个带权有向图G = (V, E), 其中每条边的权是非负实数.另外,还给定V中的一个顶点,称为源.现在要计算源到所有其他各定点的最短长度.这里路的长度是指路上各边权之和.这个问题通常 ...
- 逆序对java_算法导论学习||查找逆序对
查找逆序对很简单,自己变成就是几行,思路也是十分简单.但是题目要求用递归的方法,和合并排序很相似,网上也有很多人提供具体的程序,但是我对这种递归排序还是不能清晰得理解,所以在这里就不贴出来了,只放上了 ...
最新文章
- 学会 IDEA REST Client后,postman就可以丢掉了...
- linux /proc/net/tcp 文件分析
- 宝马3系m套件清单图_穿上套件我就不认识你了?华晨宝马1系新老对比
- C2248编译错误的原因和解决--VC6向VC7.1迁移真是累死人,N多编译错误
- win10分辨率不能调整_Win10系统分辨率不能修改怎么办?屏幕分辨率的调节方法...
- 使用Kakapo.js进行动态模拟
- python 发送邮件附件及文字信息
- Rman 非catalog恢复
- 使用VSCode创建Java项目
- 2.PCIe协议分析
- 杀死一只知更鸟的方法教会了我如何成为一名混乱大师
- Android Studio如何连接手机设备
- P3324 [SDOI2015]星际战争二分答案+网络流
- a19_Python文件I/O---学习笔记
- TCP的FIN/RST Cookie
- hihocoder01串
- 我好像解决部分猫盘刷群晖后掉IP的问题了
- Sylvester不等式证明
- 移动安全--45--MobSF-v3.0源代码分析(一)
- STM32之GPIO工作模式
热门文章
- 自研芯片重构云上算力革新,满足用户所有负载的需求!
- Chat AI和ChatGPT都是人工智能技术,在应用场景、技术原理和使用方法等方面存在一些差别
- 永久免费内网穿透不限制速度
- cifar10_input的distorted_inputs功能介绍
- iOS小技能:app信息查询(应用内调转到app store进行评论)
- PL/SQL Developer操作界面查看oracle数据库版本
- 「JavaSE」- GUI编程
- 24考研!8个因素看你适合考什么专业
- 新的 TLS 加密破坏攻击也会影响新的 TLS 1.3 协议
- 关于压缩图片存储在区块链上的思考