branch and bound(分支定界)算法

最近在看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
  • 16
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶执念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值