背包有多个袋子和只有重量的物品

时间:2014-05-15 21:44:16

标签: algorithm knapsack-problem

我正在尝试解决这个问题,我想知道是否有已知的现有算法/解决方案来解决这个问题。

问题:

  

我有n个袋子和n个物品(相同或不同的重量)填入这个袋子。这些袋子中的每一个都有一定的重量限制,并且需要将n个物品放入这些袋子中,以便我可以使用每个袋子中的最大空间。

袋子大小相同。还想知道如何解决不同尺寸的袋子。

我读过的大部分解决方案都试图解决一个重量和价值都在0/1的背包。我应该考虑重量和价值吗?我是在正确的轨道上吗?

这不是一个家庭作业问题。

1 个答案:

答案 0 :(得分:10)

这被称为the bin packing problem(NP-hard)。

通过简单地按递减顺序对递减顺序进行排序,然后将每个项目插入列表中第一个具有足够剩余空间的bin中,我们得到11/9 OPT + 6/9个bin(其中OPT是bin的数量用于最佳解决方案)。这样可以轻松地将O(n²)O(n log n)与高效实施相结合。

就最佳解决方案而言,没有一种动态编程解决方案与背包问题一样众所周知。 This resource有一个选项 - 基本理念是:

D[{set}] = the minimum number of bags using each of the items in {set}

Then:

D[{set1}] = the minimum of all D[{set1} - {set2}] where set2 fits into 1 bag
                                                  and is a subset of set1
     

上面的数组索引实际上是一个集合 - 将其视为设置为值的映射,位图或多维数组,其中每个索引为1或0以指示是否包含与该维度对应的项目或不。

     

链接资源实际上考虑了多种类型,可以多次出现 - 我从中得出了上述解决方案。

     

运行时间在很大程度上取决于可装入行李的物品数量 - 它将是O(minimumBagsUsed.2maxItemsPerBag)

对于1个包,这基本上是the subset sum problem。为此,您可以将重量与值相同并使用背包算法进行求解,但这对于多个行李箱来说效果不会很好。

为什么不呢?考虑包大小为5,5,5,9,9,9的商品16。如果您只是解决子集总和,则您只需将5,5,5放在一个包中,9放在一个包中(总共4个包),而不是5,9每袋3个。

子集和/背包已经是一个难题 - 如果使用它不会给你一个最佳解决方案,你也可以使用上面的排序/贪婪方法。