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

Posted

技术标签:

【中文标题】带有多个袋子和只有重量的物品的背包【英文标题】:Knapsack with multiple bags and items having only weight 【发布时间】:2014-05-15 21:44:16 【问题描述】:

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

问题:

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

袋子大小相同。也想知道如何解决大小不等的袋子。

我阅读的大多数解决方案都是试图解决一个 0/​​1 背包的重量和价值。我应该认为重量和价值相同吗?我在正确的轨道上吗?

这不是作业问题。

【问题讨论】:

袋子大小一样吗? 是的,这些包的大小相同。也想知道如何解决大小不等的袋子。 那不应该是装袋N的问题,装袋后剩下的货物1N-1?大小不等(可能)更难。 我应该考虑重量和价值相同吗? 你是不是在尝试使用最少的包数(每个包的最大空间有点不清楚)? 【参考方案1】:

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

通过简单地按它们的大小降序排序,然后将每个项目插入到列表中具有足够剩余空间的第一个 bin 中,我们得到 11/9 OPT + 6/9 bins(其中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.2<sup>maxItemsPerBag</sup>)

在 1 个包的情况下,这基本上是 the subset sum problem。为此,您可以将权重与值视为相同,并使用背包算法求解,但这对于多个袋子来说效果不太好。

为什么不呢?考虑袋子大小为16 的物品5,5,5,9,9,9。如果您只求解子集总和,那么您将在一个袋子中留下5,5,5,在每个袋子中留下9(总共4 袋子),而不是在三个袋子中的每个袋子中留下5,9

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

【讨论】:

值得一提的是,虽然通常很难得到精确的解决方案,但存在一个简单的 11/9 OPT + 1 近似值(可以在多项式时间内推广为 (1+eps)OPT + 1为常数 eps) @Jonathan 设置权重 = 利润会产生子集和问题,正如 Dukeling 所提到的,这显然不能解决多个 bin 的问题 @Jonathan 考虑袋子大小为16 的物品5,5,5,9,9,9。如果您只解决子集总和,则在一个袋子中留下5,5,5,在每个袋子中留下9(总共4 袋子),而不是在每个3 袋子中留下5,9。背包已经是一个难题——如果使用它不会给你一个最佳的解决方案,你不妨使用答案中提到的贪婪方法。 @Jonathan 对它们进行排序(按递减顺序)得到9,9,9,5,5,5。然后将 3 个 9 一个一个地插入单独的袋子中(因为它们不能放入同一个袋子中)。然后插入 5 个 - 前 5 个与第 9 个一起放入第一个袋子中,所以它进入了那里。第二个 5 不适合第一个袋子,但适合第二个袋子。第三个 5 不适合前两个袋子,所以进入第三个。因此,我们最终在 3 个袋子中的每个袋子中都有 5,9 @Jonathan 用于装箱的排序/贪心算法并不总是产生最佳结果,因此有理由认为另一种非最佳算法有时可能会产生更好的结果。正如我在回答中提到的,背包是一个难题 - 对于中等大小的问题,找到每个袋子的最佳解决方案将需要 非常 长时间,或者您也为此使用近似算法 - 在任何一种情况下,排序/大多数时候可能会首选贪婪算法。

以上是关于带有多个袋子和只有重量的物品的背包的主要内容,如果未能解决你的问题,请参考以下文章

0-1 背包,因体重不足和超重情况而受到处罚

动态规划——背包问题

查找背包中携带的物品

背包问题

算法学习——动态规划3

0-1背包(动态规划)