分支定界算法

分支定界算法1 概念 分支定界算法 Branchandbou 简称为 BB B amp B orBnB 始终围绕着一颗搜索树进行的 我们将原问题看作搜索树的根节点 从这里出发 分支的含义就是将大的问题分割成小的问题 大问题可以看成是搜索树的父节点 那么从大问题分割出来的小问题就是父节点的子节点了 分支的过程就是不断给树增加子节点的过程 而定界就是在分支的过程中检查子问题的上下界 如果子问题不能产

1、概念:
分支定界算法(Branch and bound,简称为 BB、B&B, or BnB)始终围绕着一颗搜索树进行的,我们将原问题看作搜索树的根节点,从这里出发,分支的含义就是将大的问题分割成小的问题。大问题可以看成是搜索树的父节点,那么从大问题分割出来的小问题就是父节点的子节点了。分支的过程就是不断给树增加子节点的过程而定界就是在分支的过程中检查子问题的上下界,如果子问题不能产生一比当前最优解还要优的解,那么砍掉这一支。直到所有子问题都不能产生一个更优的解时,算法结束。

2、例子:
用BB算法求解下面的整数规划模型
在这里插入图片描述
因为求解的是最大化问题,我们不妨设当前的最优解BestV为-INF,表示负无穷。


  1. 首先从主问题分出两支子问题:
    在这里插入图片描述
    通过线性松弛求得两个子问题的upper bound为Z_LP1 = 12.75,Z_LP2 = 12.2。由于Z_LP1 和Z_LP2都大于BestV=-INF说明这两支有搞头,继续往下

  2. 从节点1和节点2两个子问题再次分支,得到如下结果:
    在这里插入图片描述
    子问题3已经不可行,无需再理。子问题4通过线性松弛得到最优解为10,刚好也符合原问题0的所有约束,在该支找到一个可行解,更新BestV = 10。
    子问题5通过线性松弛得到upper bound为11.87>当前的BestV = 10,因此子问题5还有戏,待下一次分支。而子问题6得到upper bound为9
    <当前的bestv =="" 10,那么从该支下去找到的解也不会变得更好,所以剪掉!<="" p="">



  3. 对节点5进行分支,得到:
    在这里插入图片描述
    子问题7不可行,无需再理。子问题8得到一个满足原问题0所有约束的解,但是目标值为4
    <当前的bestv=10,所以不更新bestv,同时该支下去也不能得到更好的解了。< p="">


  4. 此时,所有的分支遍历都完成,我们最终找到了最优解。
    在这里插入图片描述
    3、算法过程(以最小化问题minimize f(x)为例)
    1、使用启发式,找到优化问题的解决方案xh。 存储其值,B = f(x_h)。 (如果没有启发式可用,则将B设置为无穷大。)B将表示到目前为止找到的最佳解,并将用作候选解的上界。
    2、初始化队列以保存部分解决方案,但不分配任何问题变量。
    3、循环直到队列为空:
    3.1从队列中取出一个节点N.
    3.2如果N代表单个候选解x和f(x)

    3.3否则,在N上分支以产生新的节点Ni。 对于每个新节点:

    3.3.1如果下线(N_i)> B,则什么都不做; 由于此节点的下限大于问题的上限,因此它永远不会导致最优解,并且可以被丢弃。
    3.3.2否则,将Ni存入队列。









其实代码该过程描述也很明了了。第1步可以用启发式找一个当前最优解B出来,如果不想也可以将B设置为正无穷。对于一个最小化问题而言,肯定是子问题的lower bound不能超过当前最优解,不然超过了,该子问题就需要剪掉了。

第2第3步主要是用队列取构建一个搜索树进行搜索,具体的搜索方式由queue这个数据结构决定的。

:B&B是围绕着一颗搜索树进行的,那么对于一棵树而言就有很多种搜索方式
1)Breadth-first search (BFS):广度优先搜索,就是横向搜索,先搜索同层的节点。再一层一层往下。这种搜索可以用FIFO queue实现
2)Depth-first search (DFS):深度优先搜索,就是纵向搜索,先一个分支走到底,再跳到另一个分支走到底。这种搜索可以用LIFO queue也就是实现。
3)Best-First Search:最佳优先搜索,最佳优先搜索算法是一种启发式搜索算法(Heuristic Algorithm),其基于广度优先搜索算法,不同点是其依赖于估价函数对将要遍历的节点进行估价,选择代价小的节点进行遍历,直到找到目标点为止。这种搜索可以用优先队列priority queue来实现


:本文转载自
https://mp.weixin..com/s?__biz=MzI3NTkyODIzNg==&mid=&idx=1&sn=d420a9ab0a7c07aeb&chksm=eb7c0063dc0b8975d64931b5b35e971f6cf78972fbdc7705bb2f16ebba39a2402f2025eff8c9&mpshare=1&scene=1&srcid=&sharer_sharetime=45&sharer_shareid=0de8e83807&key=5c697a296e1d5a5c0aba9025fae36affa28405e30ce73943ae79c9507ddefec2f7f4109c201f2611d1e2f31645c71b84a0e797baf3f823a74aa6a2be0758d93c87f32996af02f012ee77ae1a2&ascene=1&uin=MjYzMDA1MzAyMQ%3D%3D&devicetype=Windows+10&version=&lang=zh_CN&pass_ticket=x2YOENqmw1WX%2BbY2oMQM2%2FvgZw9bCyJdvL36g%2Fad0MnNoTVOTcP2gVVONuueS7VV

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216770.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:06
下一篇 2026年3月18日 上午11:06


相关推荐

  • 前端单元测试总结_javascript单元测试

    前端单元测试总结_javascript单元测试1.为什么需要单元测试正确性:测试可以验证代码的正确性,在上线前做到心里有底自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到

    2022年8月2日
    11
  • pytorch lstm时间序列预测问题踩坑「建议收藏」

    这里写目录标题1.做时间序列问题2.问题1.数据集自己做,为多个输入对应多个或一个输出2.损失函数注意:不能用交叉熵nn.CrossEntropyLoss()3.准确率1.做时间序列问题2.问题1.数据集自己做,为多个输入对应多个或一个输出2.损失函数注意:不能用交叉熵nn.CrossEntropyLoss()nn.CrossEntropyLoss()要求target目标值即真实值是标签,是torch.int64类型数据,即整数,不允许小数,如果输入小数会强行取整,应该用nn.MSELo

    2022年4月16日
    45
  • pycharm设置语言_pycharm设置语言

    pycharm设置语言_pycharm设置语言不要为看不懂设置而烦恼了,这篇文章教你如何更改PyCharm的语言。

    2022年8月29日
    6
  • 批处理删除文件夹

    批处理删除文件夹使用 DOS 指令编写批处理文件来删除指定名称的文件夹 例如 VisualStudio 生成的工程目录下有很多 vs 文件夹 会占用很多内存 如果有很多个 VS 工程中的 vs 文件夹想删除 通过批处理指令可以实现快速删除 效果

    2026年3月20日
    1
  • shell中find的用法_grep用法linux

    shell中find的用法_grep用法linuxfind命令的一般格式:findpathname-options[-exec]pathname是find命令所查找的目录路径-exec对匹配的文件执行该参数所给出的shell命令-options选项参数:-name按照文件名查找文件-perm按照文件权限来查找文件-user按照文件属主来

    2022年10月15日
    4
  • mysql latin1 中文_mysql 的 latin1 支持中文

    mysql latin1 中文_mysql 的 latin1 支持中文初学者往往会犯糊涂 mysql 的默认字符集 latin1 是否支持中文 初步分析表明 是的 确实支持中文 是初步的结论 只做了初步的分析 1 先来看看 latin1 参考百度百科 Latin1 是 ISO 8859 1 的别名 有些环境下写作 Latin 1 ISO 8859 1 编码是单字节编码 向下兼容 ASCII 其编码范围是 0x00 0xFF 0x0

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号