标准的 0/1 背包问题要求每个物品的重量都不依赖于其他物品,因此动态规划是解决该问题的一种有效算法。但现在我遇到了一个类似但是扩展了的问题:
新物品的重量取决于已经放入背包中的先前物品。
例如,我们有五个物品 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 背包变体,但只有一个非常通用的答案可用,并且没有关于这个背包问题的名称的答案。
现有的解决方案:
我还读过一篇关于DBMS优化的论文,其中他们将相关项作为一个组合项进行背包问题求解。如果将这种技术应用到我们的例子中,那么背包中的项将是a
、bc
、d
、e
,因此这四个项之间就没有依赖关系了。然而,很容易构造一个不会得到最优结果的例子,比如当“具有较小重量和效益”的物品与“具有较大重量和效益”的物品分组时。在这个例子中,“小”物品不应该被选择,但却与“大”物品一起被选择。
问题:
是否有任何有效的求解技巧可以得到最优解,或者至少有一些误差保证?或者我对模型化这个问题的方向是错误的吗?