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

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

对比回溯法

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

分支限界法的搜索策略

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

选择方法

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

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

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

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

例子:装载问题

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

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

代码如下:

1 //分支限界法解装载问题 2  3 //子函数,将当前活节点加入队列 4 template
5 void EnQueue(Queue
&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
17 Type MaxLoading(Type w[],Type c,int n)18 {19 //初始化数据20 Queue
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); //取下一个节点为扩展节点并将重量保存在Ew35 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  ,如需转载请自行联系原作者

你可能感兴趣的文章
3分钟看懂linux磁盘划分
查看>>
vim 向上向下匹配
查看>>
MySQL DBA面试总结
查看>>
Linux-LAMP 默认页,虚拟主机
查看>>
Node.js 特点
查看>>
Linux-日志管理
查看>>
MySQL数据库系统
查看>>
Android Studio 提示帮助文档 一直显示:fetching documentation
查看>>
新 Terraform 提供商: F5 Networks, Nutanix, 腾讯云, Helm
查看>>
SpringBoot框架简介及搭建
查看>>
拯救 Java Code Style 强迫症
查看>>
PDF文档怎样在线合并?
查看>>
大侦探福老师——幽灵Crash谜踪案
查看>>
一个故事告诉你什么才是好的程序员
查看>>
python subprocess模块 监控子进程的2种方式 忙等待和立即返回同时设置子进程超时...
查看>>
Java 网络编程
查看>>
科略教育—《只有规则和制度,才能遏制人性的阴暗》
查看>>
IT兄弟连 JavaWeb教程 JSP语法
查看>>
C# DllImport的用法
查看>>
ASM 详解
查看>>