分支定界法改良背包
Posted
技术标签:
【中文标题】分支定界法改良背包【英文标题】:Modified knapsack with branch and bound method 【发布时间】:2017-11-06 11:16:32 【问题描述】:所以我遇到的问题是:有一组 N 个类别的对象,每个类别中有 M 个对象,每个对象都有指定的值和权重。我们必须从每个类别中选择一个对象,以便权重
【问题讨论】:
这有点太宽泛了。您需要先尝试一下,如果仍然遇到问题,请发布您的代码。 这就是问题所在 - 我不确定我是否理解这种方法在这种情况下应该如何工作 所以你的问题与 python 无关... 利用谷歌的力量,看看en.wikipedia.org/wiki/Branch_and_bound,也许这会提供一些见解:compalg.inf.elte.hu/~tony/Oktatas/SecondExpert/… 这是 70 年代 Sinha 和 Zoltners 解决的多项选择背包问题。 Here 是原始参考。如果你用谷歌搜索,你会发现更多的东西。 【参考方案1】:算法应该做什么的简短示例。
假设您有 4 个项目 [(weight, value)]= [(3, 5),(8, 10),(1, 2),(4, 5)]
。
首先按重量对它们进行排序= [(1, 2),(12, 20),(4, 5),(9, 10)]
最大重量为 16。
从第一个项目开始制作一个树,您可以在其中投放广告或删除项目。 在树中的每一层计算权重、值和仍然留在三者中的值。如果分支中的值 left + value 小于您找到的最大值,则关闭该分支。如果重量超过大声,您也可以关闭分支。
下面是它应该如何工作的示意图。
(value) (0)
(weight) (0)
(value left) (37)
add drop
(1,2) <------- ------>
(2) (0)
(1) (0)
(35) (35)
(20,12) ---------------------------------------------------------------
(22) (2) (20) (0)
(13) (1) (12) (0)
(15) *(15) (15) *(15)
(4,5) -----------------------------------------------------------------------
(27) (22) (25) (20)
(17) (13) (16) (12)
**(10) (10) (10) (10)
(9,10) ---------------------------------------------------------------------------
(31) (20) (35) (25) (30) (20)
(22) (13) (25) (16) (21) (12)
**(0) (0) **(0) (0) **(0) (0)
win
*
分支被关闭,因为 value+value left
**
由于重量大于大声重量,因此分支已关闭。
与蛮力方法相比,这种方法的好处是可以减少计算量。通过启动每个重量值最高的项目,您很可能会快速关闭分支并减少计算时间。
希望这会有所帮助
【讨论】:
以上是关于分支定界法改良背包的主要内容,如果未能解决你的问题,请参考以下文章