带有多个袋子和只有重量的物品的背包
Posted
技术标签:
【中文标题】带有多个袋子和只有重量的物品的背包【英文标题】:Knapsack with multiple bags and items having only weight 【发布时间】:2014-05-15 21:44:16 【问题描述】:我正在尝试解决这个问题,我想知道是否有已知的现有算法/解决方案可以解决这个问题。
问题:
我有 n 个袋子和 n 件物品(重量相同或不同)要装进这些袋子。这些袋子中的每一个都有一定的重量限制,并且需要将 n 件物品放入这些袋子中,以便我可以使用每个袋子中的最大空间。
袋子大小相同。也想知道如何解决大小不等的袋子。
我阅读的大多数解决方案都是试图解决一个 0/1 背包的重量和价值。我应该认为重量和价值相同吗?我在正确的轨道上吗?
这不是作业问题。
【问题讨论】:
袋子大小一样吗? 是的,这些包的大小相同。也想知道如何解决大小不等的袋子。 那不应该是装袋N
的问题,装袋后剩下的货物1
到N-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 用于装箱的排序/贪心算法并不总是产生最佳结果,因此有理由认为另一种非最佳算法有时可能会产生更好的结果。正如我在回答中提到的,背包是一个难题 - 对于中等大小的问题,找到每个袋子的最佳解决方案将需要 非常 长时间,或者您也为此使用近似算法 - 在任何一种情况下,排序/大多数时候可能会首选贪婪算法。以上是关于带有多个袋子和只有重量的物品的背包的主要内容,如果未能解决你的问题,请参考以下文章