【问题标题】:Multiple Knapsack where items can't be reused and have different value for different knapsack多个背包,其中物品不能重复使用,并且对于不同的背包具有不同的价值
【发布时间】:2016-10-28 14:37:40
【问题描述】:

我有一个问题:

  1. 有多个背包

  2. 有一套固定的物品,SuperSet你可以说

  3. 每个背包都有specific subset 的物品

  4. 一件物品只能放入一个背包,不能重复使用

  5. 每个物品对于不同的背包都有不同的价值

  6. 每件物品重量相同,但根据背包不同而不同

现在我需要以我最终的背包总和最高的方式分配物品。

一些额外的细节:

  • 我是程序员而不是算法编写者,所以请原谅我不知道一些细节
  • 语言:任何(首选 C#)
  • 我只需要一个特定的算法来解决我的情况,我会自己编写代码
  • 目前另一种方法是The Multiple Subset Sum Problem with non identical bins,但我正在搜索

一旦 Stack Overflow 也让我得到正确的答案,我将提供赏金,即使它以前也是如此!这里有一个非常关键的修复。

【问题讨论】:

  • value differs according to knapsack - 这似乎是(多个)分配问题
  • @RyanVincent 不,算法问题最好不要使用特定语言。尽管目标范式可能很有用,但通常假定为命令式。
  • @Ryan Vincent 不需要带有algorithm 标签的特定语言。
  • @MBo 请解释一下
  • @Taran Goel 每个物品都可能被分配到具有给定值的特定背包 - 这是assignment problem。但重量限制和其他因素使问题复杂化。

标签: algorithm knapsack-problem


【解决方案1】:

这是maximum generalized assignment problem 具有特定的放松(每件物品的重量相同,但值因箱而异)。

这种放松很重要:由于每件物品的重量相同但值因背包而异,因此您可以通过根据物品重量除以每个背包的容量来将所有重量归一化为“1”。

现在变成了多重子集和问题,略有不同:每个背包的容量不同。

这个问题已经在“A PTAS for the Multiple Subset Sum Problem with different knapsack capacities”[Caprara, Kellerer, Pferschy] 1999 中进行了研究,其中给出了多项式时间 (1 − ε) 逼近算法。另一个近似方案在“Approximating the 0–1 Multiple Knapsack Problem with Agent Decomposition and Market Negotiation”[Smolinski] 2003 中给出。

ALGORITHM 632 - A Program for the 0-1 Multiple Knapsack Problem”[Martello, Toth] 1985 中给出了一个精确的算法。可以在 here 找到 Fortran(抱歉...)代码。

【讨论】:

  • 我无权访问该论文,您可以参考任何其他来源或更好的任何代码实现?我知道我要求很多。/
  • @TaranGoel:查看我的编辑。这是我能找到的最好的。
  • Kongan : 你能帮我解决一个每个背包都有不同的允许物品子集的场景吗?
  • @TaranGoel:这是最大的广义分配问题,其中一些权重 w(item i, bin b) 是无限的。
【解决方案2】:

这是背包问题的一个更复杂的版本,这意味着它是 NP 完全的,这意味着没有可以保证快速的解决方案。另一方面,更复杂可能更容易找到最佳解决方案。

基本想法是这样的:从空容器开始。只要一个项目适合第一个容器,您就可以将它添加到那里。然后将项目添加到第二个容器,依此类推。这为您提供了一个可能不是最佳的解决方案。所以你回溯最后一步并添加一个不同的项目。如果没有找到更好的解决方案,您可以回溯最后两个步骤,依此类推。为了避免尝试各种无论如何都不会起作用的组合,您总是尝试计算您可能达到的值的上限,如果该上限没有超过已知的最佳解决方案,则停止进一步检查。

将物品放入第一个容器时,请检查将每个物品放入该容器而不是另一个容器可以获得多少收益。按重量增加对所有项目进行排序。例如,如果一个项目在第一个容器中的值为 40,在另一个容器中为 20,并且重 2 个单位,那么如果将其放入第一个容器中,则每个单位的值是 10。任何容器中价值为 40 的物品都可以放在任何地方。因此,您首先将项目放入第一个产生收益的容器中(想法是这可能会为您提供一个好的解决方案,如果您有一个好的解决方案,那么您可以删除不太好的解决方案搜索中的解决方案)。

不要试图让你的代码运行得很快。尝试使其易于修改。那是因为我不知道我的想法有多好(这只是我要开始的想法)。因此,您创建样本,尝试算法的运行情况,然后提出如何更轻松地找到好的解决方案的想法。如果您保持代码易于修改,那么您可以轻松尝试更好的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多