0/1背包具有相关物品重量?

时间:2016-08-10 08:37:29

标签: algorithm knapsack-problem

标准0/1背包要求每件物品的重量独立于其他物品。然后DP是解决方案的有效算法。但是现在我遇到了类似但是这个问题的扩展,那个

  

新商品的重量取决于之前的商品   背包。

例如,我们有5个项abcde,重量为{{ 1}},...,w_a。项目w_eb具有权重依赖性。

c已经在背包中时,项b的权重将小于 <{1}},因为它可以与{{1}共享一些空间即c。对称地,当w_c已经在背包中时,b的权重将小于weight(b&c) < w_b + w_c

这种不确定性导致原始DP算法失败,因为它取决于先前迭代的正确性,现在可能无法纠正。我已经阅读了一些关于背包的文章,但是它们要么依赖于利润二次背包问题),要么具有随机分布的可变权重(随机背包问题)。我也知道上一个问题1/0 Knapsack Variation with Weighted Edges,但是只有一个非常通用的答案,并没有回答这个背包的名称是什么。

一个现有解决方案:

我还在a paper中阅读了一个关于DBMS优化的近似解决方案,其中c。如果在我们的示例中使用此技术,则背包的项目将为bw_bgroup the related items as one combined item for knapsacka,因此这四个中的任意两个之间不再存在依赖关系项目。但是,很容易构造一个无法获得最佳结果的示例,例如bc时。在此示例中,不应在解决方案中选择“小”项,而是与“大”项一起选择。

问题:

是否有任何有效的解决方法可以获得最佳结果,或者至少有一些错误保证?或者我是否采取了错误的方向来模拟这个问题?

3 个答案:

答案 0 :(得分:6)

你能否拥有abcbcde这些内容?可能有一个约束条件bbc不能同时放在背包中,cbc同样如此?我的理解是,这将是一个正确的解决方案,因为任何具有bc的解决方案都可以通过bc(根据定义)替换两者来改进。对会员资格的限制应该处理任何其他情况。

答案 1 :(得分:1)

这是一个非常有趣的问题,我一直在研究这个问题。首先要考虑的是依赖项目权重/值的二元背包问题根本不是微不足道的。您可以考虑使用贝叶斯网络,马尔可夫模型和其他类似技术来解决此问题。尽管如此,对这个问题的任何实际方法都必须对优化模型或其输入做出一些假设。以下是使用依赖于值的项目来制定二元背包问题的示例。 https://arxiv.org/pdf/1702.06662.pdf

在这项工作中,作者提出使用模糊图建模输入(与值相关的依赖关系),然后使用提出的整数线性编程模型来解决优化问题。该作品的扩展版本已被接受发布,并将很快在线提供。

如果您需要更多信息,请随时与我联系。如果需要,我还可以为您提供模型的源代码。

答案 2 :(得分:1)

最后,我设法用@Holt提出的B&amp; B方法来解决问题。以下是关键设置:

(0)在运行B&amp; B算法之前,将所有项目分组取决于它们的依赖性。一个分区中的所有项目都与同一组中的所有其他项目具有权重相关性,但与其他组中的项目无关。

B&amp; B的设置:

(1)上限:假设当前项目具有最小权重,即假设存在所有依赖项。

(2)下限:假设当前项目具有最大权重,即假设所有依赖项都不存在。

(3)当前重量:计算实际当前重量。

通过使用我们在步骤0中获得的组,可以在线性时间内完成所有上述计算。具体来说,在获得这些权重时,仅扫描当前组中的项目(当前项目所在的组)是足够 - 其他组中的项目与当前项目没有依赖关系,因此不会更改当前项目的实际权重。