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

本文介绍了分支限界法(Branch and Bound Method)在解决0-1背包问题中的应用。分支限界法是一种求解离散优化问题的算法,通过状态空间搜索找到最优解。0-1背包问题中,通过动态规划和贪心策略计算节点的界,以避免无效分支,提高求解效率。文章还讨论了不同分支策略的优缺点,并给出一个实例来解释如何找到每个节点的界。
摘要由CSDN通过智能技术生成

分支限界法

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

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

总则

基本思想

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

分支策略

根据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个解,检查每个解是否满足约束条件,保存满足约束条件的最大解。这个解可以表示为树。

i2

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

i4

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

i5

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

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

如何为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

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

branchandbound

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

总结

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

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

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

相关文献:分支限界法

动态展示:BranchAndBound

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

 

 

 

 

 

 

 

Branch and Bound Method 是一种解决最优化问题的算法,它可以用来解决 0-1 背包问题。0-1 背包问题是指在给定的一组物品中,选择一些物品放入背包中,使得背包中物品的总价值最大,但是背包有一个容量限制,即所选物品的总重量不能超过背包的容量。 Branch and Bound Method 的基本思想是将原问题分解成若干子问题,并对每个子问题求出一个上界和一个下界,然后将子问题按照上界排序,优先考虑上界较大的子问题。接着采用深度优先搜索的策略,依次处理各个子问题,对于每个子问题,通过计算其下界和当前最优解的比较,可以剪枝掉一些不必要的搜索路径,从而加速搜索过程。 在 0-1 背包问题中,可以将每个物品看作一个节点,将物品的价值和重量作为节点的属性,在搜索过程中,每次选择一个物品放入背包中或者不放入,得到两个子问题。对于每个子问题,可以计算出一个上界和一个下界,其中上界是指将剩余物品按照单位价值从大到小排序,依次放入背包中,直到背包装满为止所得到的最大价值;下界是指将剩余物品按照单位价值从大到小排序,计算出能够放入背包中的最大价值,加上已经放入背包中的价值,得到一个下界。如果某个子问题的上界小于当前最优解,则可以剪枝掉该子问题。 通过不断进行深度优先搜索和剪枝操作,直到搜索完所有的子问题,得到的最优解即为所求的 0-1 背包问题的最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值