0/1背包变量很少:哪种算法?

时间:2012-06-22 10:02:54

标签: python algorithm knapsack-problem

我必须使用约束来实现0/1背包问题的解决方案。 在大多数情况下,我的问题很少有变量(~10-20,最多50)。

我从大学回忆一下,有许多算法在很多情况下比蛮力表现得更好(我想的是,例如,分支定界算法)。

由于我的问题相对较小,我想知道在使用复杂的解决方案而不是蛮力时,效率方面是否有明显的优势。

如果有帮助,我用Python编程。

3 个答案:

答案 0 :(得分:1)

如果权重之和足够小,您可以使用伪多项式算法,该算法使用动态编程。你只需计算,你是否可以为每个X和Y获得前Y项的重量X. 这在时间O(NS)中运行,其中N是项目数,S是权重之和。

另一种可能性是使用中间相遇方法。 将项目分成两半并: 对于前半部分,采取每种可能的项目组合(每半部分有2 ^(N / 2)种可能的组合)并将其权重存储在某些集合中。 下半场采取各种可能的项目组合,检查上半部是否有合适的重量组合。 这应该在O(2 ^(N / 2))时间内运行。

答案 1 :(得分:0)

对于10个变量来说,蛮力的东西可以正常工作,但是对于40个变量,你可以获得1000,000,000,000个可能的解决方案,这可能需要很长时间来枚举。我会考虑近似算法,例如多项式时间算法(参见,例如http://math.mit.edu/~goemans/18434S06/knapsack-katherine.pdf)或使用搜索算法,如分支定界,可能还有一个额外的启发式算法。

答案 2 :(得分:0)

强力算法将始终返回最佳解决方案。它们的问题在于,在指数级问题中,它们很快变得不可行。

如果您保证最多有20个变量,那么您将测试不超过100万个解决方案(2 ^ 20 = 1M)。因此,蛮力是可行的,没有其他算法会返回更好的解决方案。

启发式算法很棒,但只有在我们没有完全解决问题的方法时才能使用它们。有一本很棒的书可以帮到你:How to Solve it, by Michalewicz