最近在看cartographer算法,其中的闭环优化使用到了branch and bound(分支定界)算法,这里简单记录一下:

分支定界算法是一种求解离散最优化问题的计算分析方法。它是由R.J.达金和兰德-多伊格在20世纪60年代初提出的。这种方法通常仅需计算和分析部分允许解,即可求得最优解。因此在求解分派问题和整数规划问题时常用此法。

基本方法 求解一个约束条件较多的问题A,可以暂缓考虑部分条件,变换成问题B,先求B的最优解(解松弛问题)。B的最优解一定比 A的好(或相当)。再将原来暂缓考虑的部分条件逐步插入问题B中,得到B的若干子问题,称为分枝。求解这些子问题,淘汰较差的解,直到所有暂缓考虑的部分条件全部插入为止。这时求得的最优解就是问题A的最优解。

简单的说,分支定界算法的主要思想是用数的节点表示所有可能的子集,根节点表示所有可能的解,叶节点表示所有的解。

盗一张图:

个人理解:上图中最上面的代表的就是根节点,它包含了所有可能的解;然后我们分枝得到1、2、3,这些代表可能的子集;而每一个子集又可能存在很多可能的解,这些解可以继续分枝,也就是第三层…直到所有的子集都不可再分,这时候我们就找到了最优解。

简单举个栗子:

求下面方程的最优解:

首先我们假设一个下界:0。即我们现在认为方程的最优解为0,然后我们对X3做分枝:0、1、2;解一个二维极值问题,分别得到当X3=0、1、2时的方程最优解:

可以得到三个分枝的上界分别为12.75、12.2、12。它们都优于初始值0,所以我们认为这三个分枝中都存在一个最优解。然后我们再进行第二层分枝。对X2分别取值0、1。

由于当X3=1,X2=1时无解;X3=2,X2=1时无解,所以我们可以剪去这两个分枝;剩下的还有四个节点,我们对这四个节点再次进行分枝:

根据最后的六个解我们可以知道最优解为x1=x2=0,x3=2,此时:
max 4x1+9x2+6x3=12

感觉其实差不多就是穷举?

感觉有点问题啊,不是说分枝定界么,分枝有了定界呢?????

仔细查看了各种参考文档,大概理解了一些,总结一下分支定界的基本思路:

1、先不考虑原问题的整数限制,求解相应的松弛问题,若求得最优解,检查它是否符合整数约束条件;如符合整数约束条件,即转下一步。
2、定界。在各分枝问题中,找出目标函数值最大者作为整数规划最优值的上界记为Up,从已符合整数条件的分枝中,找出目标函数值最大者作为下界,记为Lo 。
3、分枝。按照一定原则对子集分枝,这里感觉有点不太清楚,因为看了几个分枝的都有点不完全一样。
4、应用对目标函数估界的方法,或对某一分枝重要性的了解,确定出首先要解的某一分枝的后继问题,并解此问题。若所获得的最优解符合整数条件,则就是原问题的解,若不符合整数条件,再回到第二步,并参照第四步终止后继问题。这里大概的意思:对每个分枝继续求最优解,如果该最优解符合所有约束,则认为该解就是原问题的最终解(是不是快了点?),如果不满足所有约束,则继续执行第二步。

再回过头去看一下上面的问题,首先第一步还是分枝,我们对X3分枝:
此时我们可以知道上界为12.75。同时我们查看它的整数解,当x1=x2=0,x3=2时为其全约束下的解,则根据第二步,我们得到下界12。所有我们判定最优解区间:12<=x<=12.75

然后我们再对x2进行分枝,并求得各个分枝下的最优解:

这时候我们可以看到很多分枝下的最优解都是小于下界的,那么在这种情况下我们可以认定该分枝下不存在比现有解更好的解,该分支可以不用再考虑,也就是剪枝。同时在第二层中我们可以得出最优解为12.2,在给定约束下的最优解不可能比这个更大,所以更新上界为12.2,同时整数解也就是下界还是12。更新区间:12.2<=x<=12。再去除一些不可能存在更优解的分枝后我们继续分枝求得第三次的分枝,这里其实应该是叶,因为已经不可再分:

这样子应该差不多了吧?个人觉得分支定界算法的两块核心主要在于一个好的分枝以及一个好的定界,感觉像是屁话。

在高维求解中,如何确定一个分枝感觉还是很重要的,因为这里我的解只可能是0、1、2所以采用了一种枚举的方式分枝,但如果我的解是0-9999中任意一个数都可能是最优解,那么显然我不可能去列出10000个分枝去分别求一遍,所以它的分枝应该是需要遵循一定的约束条件的。比如下面参考链接一中的例子,它将分枝从最优解的位置分开,分成大于最优解以及小于最优解的两个部分,这是其中的一种分枝方式,但应该不是最好的方式,待研究。

第二点就是定界问题了,一个好的下界能使我的整个计算量下降非常多,比如上面的例子中,当我把下界定为12的时候我做完第二次分枝后直接排除了三分之二的分枝,也就是剪枝达到了三分之二。这意味着我下一步的计算量间接提高了三倍。如果我选的不是这样一个下界,或者说我的式子特殊一点,分枝之后所有的最优解都不是整数解,那么我应该怎么确定这个下界?直接取0?那我就意味着所有的分枝都需要再计算一遍了,这个定界很显然就没有作用了。

个人理解,且看且批判。

另外链接二中提到了几条特殊情况,感觉挺有道理:

1、松弛问题没有可行解,则原问题也没有可行解;

2、松弛问题的最优解恰好全取整数,则该最优解也是其对应的子问题的最优解;

3、松弛问题的最大值小于现有的下界z,则无论其最优解是否取整数值,都将对应的子问题剪枝;

https://www.cnblogs.com/xiaofanke/p/9498820.html
https://blog.csdn.net/u013007900/article/details/45915067

branch and bound(分支定界)算法相关推荐

  1. 分支定界算法理解(摘抄)

    解释一 分支定界算法(Branch and bound,简称为 BB.B&B, or BnB)始终围绕着一颗搜索树进行的. 我们将原问题看作搜索树的根节点.从这里出发,分支的含义就是将大的问题 ...

  2. 分支定界算法在中学排课问题中的应用

    分支定界算法在中学排课问题中的应用 摘要:在本文中我们主要研究了带约束有教案的中学排课程表问题.首先我们得到了有关该问题的中学课程表必须满足的几个条件,因为该排课程表问题是一个NP难解的问题,因此该问 ...

  3. 5.1 基于分支定界算法的单机调度

    原创文章,禁止转载.抄袭或用于报告.交流等学术或商业用途 全文(其它章节内容) https://blog.csdn.net/qq_38757869/article/details/106885769 ...

  4. 分支定界算法 matlab,分支定界法----整数规划matlab

    分支定界法的思想是:首先确定目标值的上下界 发布人:chengxu0921 发布时间:2008-7-21 18:16:27 新闻类别:分支-界限法 例1:设有A,B,C,D,E 5人从事j1,j2,j ...

  5. tsp 分支界限 java_干货 | 10分钟教你用branch and bound(分支定界)算法求解TSP旅行商问题...

    在此之前,先给大家讲讲最重要的一个点,搜索树的节点定义,节点定义了原问题的solution和子问题的solution.Node节点定义如下: public class Node {private Ar ...

  6. branch and bound(分支定界)算法-基础概念

    网址1:干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇 网址2:运筹优化学习10:分支定界算法求解整数规划问题及其Matlab实现

  7. branch and bound(分支定界)算法求解TSP旅行商问题

    转载自:分枝定界算法求解TSP 整个程序如下所示: 其中各个模块说明如下: - Timer:计时用. - TSPInstanceReader:TSPLIB标准算例读取用. - PriorityQueu ...

  8. 分支定界---branch and bound

    分支定界-branch and bound 定义 分支定界算法始终围绕着一颗搜索树进行的,我们将原问题看作搜索树的根节点,从这里出发,分支的含义就是将大的问题分割成小的问题.大问题可以看成是搜索树的父 ...

  9. 分支定界方法(branch and cut,branch and price的基础)

    目录 1.基础版的分支定界算法(假设是min问题) 2.分支定界算法的步骤及其注意事项 2.1 具体的分支定界方法的步骤: 2.2 迭代过程,也就是分支定界方法的核心操作: 2.3 分支策略: 2.4 ...

最新文章

  1. 模拟实现智能指针auto_ptr,scoped_ptr,shared_ptr
  2. Mysql的int类型探究
  3. 在线实时大数据平台Storm集成redis开发(分布锁)
  4. windows sdk 学习笔记(8)
  5. 51nod 1274 最长递增路径(DP)
  6. Java经典算法50道题
  7. 编程必会的100个代码大全,建议收藏
  8. html5页面风格,H5页面设计风格大盘点!
  9. java队列和栈 共同_java 栈和队列的模拟--java
  10. 手机上好用的记事本工具
  11. scipy.sparse求稀疏矩阵前k个特征值
  12. FPGA基础实验:点亮LED
  13. Java基础——狂神说
  14. 最简单的基于FFMPEG+SDL的音频播放器
  15. 天地图与Arcgis互调服务
  16. 节点操作之创建和添加节点
  17. 王道考研计算机网络第五章——传输层
  18. Java Integer128陷阱详解
  19. C语言没有string类型
  20. Freeline使用指南,完美亲测,能跑起来,增量编译速度飞起来

热门文章

  1. Hikari源码分析
  2. 2021年强迫症福音CentOS7零警告安装Oracle11g
  3. Shell之函数及流程控制语序
  4. (附源码)计算机毕业设计ssm蛋糕店会员管理系统
  5. 【电磁】基于 Biot-Savart 定律模拟沿螺旋(螺线管或环形)电流回路的磁场附matlab代码
  6. JAVA设计驾驶员信息管理系统_基于jsp的大连驾驶员信息查询-JavaEE实现大连驾驶员信息查询 - java项目源码...
  7. 讲座《微信之道:至简》总结
  8. DNGuard HVM Release
  9. 刷题记录:牛客NC14975方块与收纳盒
  10. MYSQL抛出异常+禁止删除触发器、同步插入触发器