分支限界法|Branch and Bound Method(0-1背包问题)

分支限界法

分支限界法(BB或B&B)是一个离散和组合优化问题的算法设计范式,以及一般的实值的问题。分支限界算法是通过状态空间搜索对候选解进行系统枚举的一种算法。

分支与约束(BB或B&B)算法最早是由A. H. Land 和 A. G. Doig在1960年提出的离散规划算法。它是求解各种优化问题的最优解的一种通用算法,特别适用于离散优化和组合优化。一个分支限界算法由一个系统的所有候选解的枚举组成,其中利用被优化量的上下界估计,求出大量的无果候选解子集。

总则

基本思想

分支限界算法作为求解离散问题全局优化的一种方法,通常是NP难度的,它在给定问题的整个解空间中寻找最优解。通过求解一个轻松的问题,部分的解决方案被认为对于每个离散变量,分支和限定,创建两个新的节点,因此解决方案空间划分成一组较小的子集和获得每个节点的相对的上界和下界。由于潜在解的数量呈指数增长,显式枚举通常是不可能的,因此,对要优化的函数使用界限,并结合当前找到的最佳解的值,使得分支限界算法只能隐式地搜索解空间的一部分。

分支限界法|Branch and Bound Method(0-1背包问题)_第1张图片分支限界法|Branch and Bound Method(0-1背包问题)_第2张图片

分支策略

根据Gupta和Ravindran的研究,通常有两种分支方法:

1)在具有最小边界的节点上进行分支搜索所有节点,找到最小边界的节点,并将其设置为下一个分支节点。优点:一般检查子问题较少,节省计算时间。缺点:通常需要更多的存储空间。

2)在新创建的具有最小边界的节点上进行分支搜索新创建的节点,找到绑定最小的节点,并将其设置为下一个分支节点。优点:节省存储空间。缺点:需要更多的分支计算,因此计算效率较低。

0-1背包

给定两个整数数组val[0..n - 1]和wt [0 . .n-1],分别表示与n个项目相关的值和权重。求 val[] 的最大值子集,使该子集的权值之和小于或等于背包容量W。

让我们探讨解决这个问题的所有方法。一种贪心的方法是按每单位权重值的递减顺序选择项目。贪心法只适用于背包问题,对0/1背包可能不能得到正确的结果。
对于0/1背包问题,可以使用动态规划(DP)。DP时,我们使用尺寸为n×w的二维表。如果项目权重不是整数,则DP解决方案不起作用。

由于DP解决方案并不总是有效,所以解决方案是使用蛮力。对于n项,生成2n个解,检查每个解是否满足约束条件,保存满足约束条件的最大解。这个解可以表示为树。

分支限界法|Branch and Bound Method(0-1背包问题)_第3张图片

我们可以使用回溯来优化蛮力解决方案。在树的表示中,我们可以对树做DFS。如果我们到了一个解决方案不再可行的地步,就没有必要继续探索下去。在给定的示例中,如果我们有更多的项目或更小的背包容量,回溯将会更有效。

分支限界法|Branch and Bound Method(0-1背包问题)_第4张图片

基于回溯的解决方案通过忽略不可行的解决方案比暴力解决方案更有效。如果我们知道每个节点都有一个最佳可能解子树的界,那么我们可以做得更好(而不是回溯)。如果子树中的best比当前的best差,我们可以忽略这个节点及其子树。因此,我们计算每个节点的界(最佳解),并在研究该节点之前将其与当前的最佳解进行比较。下图中使用的示例边界是,A向下可以得到315美元,B向下可以得到275美元,C向下可以得到225美元,D向下可以得到125美元,E向下可以得到30美元。

分支限界法|Branch and Bound Method(0-1背包问题)_第5张图片

由于不可行解的存在,忽略了红结点,黑节点被忽略,因为通过它们的最佳解决方案比当前解决方案更糟糕

分枝定界法是一种非常有用的求解方法,但在最坏的情况下,我们需要完整地计算整个树。最好的情况是,我们只需要完全计算出穿过树的一条路径,然后对其余的部分进行修剪。

如何为0/1背包找到每个节点的界?

其思想是利用贪心方法为分数背包问题提供了最佳解决方案这一事实。为了检验某个节点是否能给出更好的解,我们使用贪心方法(通过节点)计算最优解。如果用贪心法计算的解本身大于目前最好的解,那么我们就不能通过节点得到更好的解

  1. 将所有项目按单位权重值的比值递减顺序排序,以便使用贪心方法计算上限。
  2. 初始化最大利润,maxProfit = 0
  3. 创建一个空队列Q。创建决策树的虚拟节点,并将其排队到q。
  4. 虚拟节点的利润和权重为0。在Q不为空时执行下列操作。
  5. 从q中提取一个项目,让提取的项目为u。计算下一级节点的利润。
  6. 如果利润大于maxProfit,则更新maxProfit。
  7. 计算下一级节点的界。如果bound大于maxProfit,则向Q添加下一级节点。
  8. 在不考虑下一层节点的情况下,将下一层节点作为解决方案的一部分,向队列中添加一个节点,但不考虑下一层节点的权重和利润。

输入:/ /首先在每一个对物品的重量

//第二件事是项目的价值项目

arr[] = {{2, 40}, {3.14, 50}, {1.98, 100},{5, 95}, {3, 30};

背包容量W = 10

输出:最大可能利润= 235

下图为说明。项目是考虑按值/权重排序。

分支限界法|Branch and Bound Method(0-1背包问题)_第6张图片

代码见原文:分支限界01背包问题

总结

重要的是要认识到混合整数线性规划是NP-hard。粗略地说,这意味着解决混合整数线性程序所需的工作量随着问题的大小呈指数增长。虽然分支限界算法不太可能必须生成每个可能的节点,但是对于一个大问题,即使只需要探索潜在节点数量的一小部分,也可能是资源密集型的。

同时,采用多种技术可以加快分支限界算法的搜索速度。利用启发式算法寻找可行解,提高了混合整数线性规划解的上界。切割平面可以减少搜索空间,从而提高混合整数线性规划解的下界。当使用切割平面时,分支限界算法也称为分枝定界算法。预处理可以减小问题的规模,提高问题的可解性。

漫画趣谈分支限定:分支限界漫画版

相关文献:分支限界法

动态展示:BranchAndBound

分支限界--n后问题:n-queen

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构与算法)