分枝定界方法

分枝定界法(branch and bound)是一种求解整数规划问题的最常用算法,是一种搜索与迭代的方法。

通俗说法:

分枝定界算法始终围绕着一颗搜索树进行的,主要流程就是分枝+定界。

我们可以将原问题看作搜索树的根节点,从这里出发,分枝定界的含义就是将大的问题分割成小的问题。大问题可以看成是搜索树的父节点,分割出来的小问题就是父节点的子节点,一直分割到最小问题为叶子节点。分枝的过程就是不断给树增加子节点的过程。

定界就是在分枝的过程中检查子问题的上下界(如果问题是找最大值就定上届,最小值就定下界),如果子问题不能产生比当前最优解还要优的解,那么砍掉整个的这一支。直到所有子问题都不能产生一个更优的解时,算法结束。

  1. A为根节点,表示整个解空间ω
  2. JKLMNOPQ为叶子节点,表示某一个具体的解
  3. BCDEFGHI为中间节点,表示解空间ω的某一部分子空间

具体流程:

  1. A分枝BCDE,按照优先级排序;

  2. B分枝FGHI,按照优先级排序;

  3. F分枝JKLM,按照优先级排序;

  4. 在叶子节点上,计算JKLM的目标函数最大值,记为best_score(初始值为负无穷);

  5. 返回上一层G,计算G的目标函数值,与best_score比较:

    若best_score依旧最大,则对G进行剪枝,继续计算H的目标函数值;

    若G的目标函数值大于best_score,则对G进行分枝NOPQ,计算NOPQ的目标函数最大值,与best_score比较,更新best_score;

分枝定界在相关方法中的应用——结合多分辨率栅格

算法流程:1. 节点选择; 2. 分枝规则; 3. 上界计算

节点选择:

深度优先搜索:Depth-First-Search (DFS)

深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次

广度优先搜索(宽度优先搜索):Breadth-First-Search(BFS)

广度优先搜索是连通图的一种遍历算法这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。属于盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。基本过程,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。一般用队列数据结构来辅助实现BFS算法。

分枝规则:

按照地图分辨率构造树形结构:假设有一张4×4的地图,我们降低其分辨率,每2×2的格子合并成一个,得到一张2×2的地图,再降低其分辨率,得到一张1×1的地图。这样,地图被分成了三层,如下图所示。

具体实现

**分枝:**先从根节点开始遍历,把它拆分成4个子格子。这4个子格子分别计算score,并由高到低排序。从中选出分数最高的格子,进一步拆分成4个子格子。假设这4个子格子已经到了叶子节点,也就是达到了真实地图的分辨率。此时计算出的4个子格子的score代表了真实的位姿评分,找出其最大值,记作best_score。只有叶子节点的score是真实评分,其它格子的score都是上界。

**定界:**第二层未曾探索的3个格子的score是否大于best_score,如果是,继续分支,当遇到score大于best_score的叶子节点时,更新best_score;如果否,直接将这个格子及其所有子格子剪枝。因为格子的评分代表了其子格子评分的上界,如果上界都小于best_score,就不可能再有子格子的评分大于它了。

搜索树中的每一个节点,都表示为一个正方形的搜索框。对于中间节点,分枝为四个子节点。

上界计算:

如何使格子的评分是其子格子的评分上界?

一个位姿的评分是用该位姿下所有激光束(beams)的命中点(hit point)的评分相加得到的。

**暴力搜索:**用三层for循环,把每一个位姿都拿出来算一遍BBS评分,找到最大值。

**最大值的和:**对每一根激光束,都取一个搜索框范围内与他对应的位姿,使这根激光束的评分Mnearest最大,把每一个评分累加,求和。这个就是中间节点的评分上界,即位姿评分的上界,为每个命中点(hit point)的评分的上界之和。

**和的最大值:**对每一个位姿,计算该位姿下,所有激光束的所有激光束(beams)的命中点的评分,累加求和,在这些和中找最大值(这也就是BBS公式,代表最细分辨率上的得分,分枝定界并没有真正的去求解所有枚举情况的目标函数BBS值)

**采用预计算网格方法:**通过构造多分辨率地图,把地图中每个格子的概率用其附近区域内的最大概率代替,使得每一个节点的评分可以在对应分辨率地图中查询得到。不同分辨率的地图事先计算好。越低分辨率的地图,在越大的范围里求最大值,格子中的概率越接近1。

总结

分枝定界进行分枝的过程,是不断提高搜索精度的过程。

整个分枝树的最底层的所有枚举情况,便是最高搜索精度的枚举集合,便是暴力匹配搜索范围的全部整搜索空间。

【cartographer】(2)分枝定界算法相关推荐

  1. 贪心算法和分枝定界算法的区别

    1.贪心算法 贪心算法(贪婪算法)就是在对问题进行求解时,总是做出当前看起来最优的选择,就是不从整体上进行考虑,只是得到局部意义上的最优解.贪心不是对问题都能得到全局最优解,关键在于贪心策略的选择. ...

  2. Cartographer分枝定界算法比喻理解

    Cartographer的代码非常紧凑,为了加深自己的理解和印象,尝试用比喻的方法去描述出来,欢迎大家交流指正. BnB比喻: 一家公司,有多个职位等级(对应多分辨率地图),现在要评项目奖金. 符合以 ...

  3. 算法分支定界法C语言程序,常用算法大全-分枝定界

    任何美好的事情都有结束的时候.现在我们学习的是本书的最后一章.幸运的是,本章用到的大部分概念在前面各章中已作了介绍.类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构 ...

  4. 分枝定界图解(含 Real-Time Loop Closure in 2D LIDAR SLAM论文部分解读及BB代码部分解读)

    分枝定界图解 网上对分枝定界的解读很多都是根据这篇必不可少的论文<Real-Time Loop Closure in 2D LIDAR SLAM>来的. 分枝定界是一种深度优先的树形搜索方 ...

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

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

  6. Python 实现整数线性规划:分枝定界法(Branch and Bound)

    今天做作业,要实现整数线性规划的分枝定界法算法.找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚.规范,所以在此记录.如有错误,请指正. from scipy.optimize import ...

  7. 分枝定界法解0/1背包问题

    分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...

  8. 分枝定界法求哈密尔登回路问题的由表及里

    刻苦努力的奋斗,终于有了学习成果,虽然写出的仅仅是非常拙略,功能单一的,简单的小程序代码,但不失为在代码学习的进步.总算是有了含有自己智慧在其中的结晶.其实这段代码能够顺利完成,虽然是独立完成,但终究 ...

  9. Python整数规划—分枝定界法

    分枝定界法可用于解纯整数或混合的整数规划问题.在本世纪六十年代初由 Land Doig 和 Dakin 等人提出的.由于这方法灵活且便于用计算机求解,所以现在它已是解 整数规划的重要方法.目前已成功地 ...

最新文章

  1. java基础-static
  2. SAP S/4 HANA新变化-信用管理
  3. 对于HR通常提的一些问题的总结
  4. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  5. 检索数据_5_给字段取个有意义的名字
  6. maven项目和普通项目转换
  7. Linux Ubuntu 安装编译Opencv 3.4.3 C++开发环境
  8. linux如何判断网线插入_快速鉴定网线质量的常用方法
  9. 腾讯“立知”被指抄袭“即刻” APP,目前已被下线
  10. Q96:PT(3.5):木纹纹理(Wood Texture)
  11. [转]SecureCRT使用配置详细图文教程
  12. 【数据分享】全国357个城市历年空气质量数据(2013-2021)
  13. java编译命令是什么_java编译命令,java的编译命令是什么?
  14. LIVE MINI ESP32开发板教程系列(四)NeoPixel + ws2812b实现炫彩显示
  15. 获取URL中的一级域名
  16. ijkplayer 代码走读之 h264 解封装器应用详解
  17. 嵌入式 Linux下检索字符串命令grep
  18. VS2010开发的winform程序在XP系统打不开的原因(与ico图标像素有关)
  19. 琵琶行----白居易
  20. X Server移植指导之三 输出层移植 (XServer Porting Guide)

热门文章

  1. fanuc机器人试题_FANUC机器人建立part carrier和跟踪参数的方法
  2. 实时公交小程序开发有哪些功能和优势?
  3. 排队叫号机自助取票机取号机医院大厅排队排号叫号系统
  4. python数据分析案例简单实战项目(二)--零售商品数据分析
  5. 我的.emacs(Ubuntu版)(二十二)
  6. 全球销量第一iPhone 11为何能打败安卓手机?
  7. 模板化的网站建设,搭建微信小程序,就是这么简单
  8. AI数字人提供线上线下场景应用,世优BOTA构建车企虚拟人新体验
  9. (翻譯) 註解程式碼的13個建議 (C/C++)
  10. Java多线程---单例模式(有趣易懂版)