背包分支和绑定

Posted

技术标签:

【中文标题】背包分支和绑定【英文标题】:Knapsack Branch and Bound 【发布时间】:2013-12-11 14:05:06 【问题描述】:

我有以下数据:

item   weight   value   value/weight
1      5        40      8
2      2        10      5
3      6        30      5
4      1        12      12
5      2        18      9

容量为 10。 如何继续计算节点 0 的上限? 我正在计算节点 0 的上限,如下所示:

ub = v + [W-w] * [v/w]
ub = 0 + [10] * [8] = 80

或者我是否需要按价值/重量的降序对项目进行排序,分别为 12、9、8、5、5?然后计算上限? 或者我做得对,没有排序,计算上限并继续下一项?

在没有排序的方法中,我认为不会在节点 0 处获得最大上限。

ub = 0 + [10] * [12] = 120 // if sorted

已经感谢您的帮助。

【问题讨论】:

我假设这是您要解决的 0-1 背包?你如何计算你的上限? (有许多边界启发式方法 - 如果对项目进行排序,有些会提高性能,有些则不会) 是的,它是一个 0-1 背包。我选择一个项目,或者我不选择。我计算的上限仅取决于我接下来要选择的项目以及如果我将其乘以袋子中剩余的容量,我将拥有多少价值。我发现,一个排序的项目列表将在初始检查时给我一个很大的上限,然后我可以根据这些上限继续处理其他项目。谢谢顺便说一句。 【参考方案1】:

节点零的上限是分数背包的贪心解。 只需取出具有最高价值/重量比的元素并继续插入它,直到没有空间或完全插入它。然后重复这个过程。

【讨论】:

以上是关于背包分支和绑定的主要内容,如果未能解决你的问题,请参考以下文章

C# 分支定界法 01背包问题

分支定界法改良背包

算法---分支限定0/1背包--蚁群算法

分支定界背包 Java

背包分支定界错误结果

0-1背包问题之分支界限法