【发布时间】:2016-12-16 12:44:13
【问题描述】:
标准的 0/1 背包要求每件物品的重量独立于其他物品。那么 DP 是一种有效的求解算法。但是现在我遇到了一个类似但扩展了这个问题,即
新项目的重量取决于之前已经存在的项目 背包。
例如,我们有5个项目a、b、c、d和e,重量为w_a、...、w_e。项目b 和c 具有权重依赖性。
当b 已经在背包中时,物品c 的重量将小于w_c,因为它可以与b 共享一些空间,即weight(b&c) < w_b + w_c。对称地,当c已经在背包中时,b的权重会小于w_b。
这种不确定性导致原始 DP 算法失败,因为它依赖于以前迭代的正确性,而现在可能不正确。我已经阅读了一些关于背包的论文,但它们要么具有受利润(二次背包问题)的依赖性,要么具有遵循随机分布的可变权重(随机背包问题)。我也知道上一个问题1/0 Knapsack Variation with Weighted Edges,但是只有一个非常笼统的答案,没有关于这个背包的名字的答案。
一个现有的解决方案:
我还在a paper 中阅读了一个关于 DBMS 优化的近似解决方案,他们在其中group the related items as one combined item for knapsack。如果在我们的示例中使用这种技术,背包的项目将是a、bc、d、e,因此这四个项目中的任何两个项目之间没有更多的依赖关系。然而,很容易构造一个没有得到最佳结果的例子,比如an item with "small weight and benefit" is grouped with another item with "large weight and benefit"。在这个例子中,“小”项不应该在解决方案中被选中,而是与“大”项一起被选中。
问题:
是否有任何一种有效的解决技术可以获得最佳结果,或者至少有一些错误保证?还是我在建模这个问题时采取了错误的方向?
【问题讨论】:
-
您的问题似乎遭到了反对。我不太同意反对者的观点,但这可能是因为您询问是否对此问题进行了任何研究,这可能被解释为要求“场外资源”,而这与主题无关。
-
@samgak 感谢您的评论。我已经修改了我的问题,以便更加关注任何可能的解决方案。
-
这个问题是being discussed on Meta。
-
您可以尝试背包的标准 B&B 方法,在计算上限和下限时,您只需根据背包上已经存在的物品更新物品的重量(不应该那么复杂)。
-
@PaddyXu 写下你自己的答案并解释上限/下限计算并将其标记为已接受,这将是一个更好的答案,我只是说“尝试定制的 B&B。” i> ;)
标签: algorithm knapsack-problem