我遇到问题:
有多个背包
有一组固定的项目,您可以说SuperSet
每个背包都有specific subset
个项目
一件物品只能放入一个背包中,不能重复使用
每个项目对于不同的背包都有不同的值
每件商品的重量相同,但根据背包的价值不同
现在我需要以最终背包总数最高的方式分配物品。
一些其他细节:
The Multiple Subset Sum Problem with non identical bins
,但我正在搜索答案 0 :(得分:3)
这是具有特定放松的maximum generalized assignment problem(每个项目的权重相同,但值根据bin而不同)。
这种放松很重要:由于每件物品的重量相同,但根据背包的价值不同,您可以根据物品的重量将每个背包的容量除以“1”来将所有重量标准化。
现在它变成了多个子集和问题,略有不同:每个背包的容量都不同。
这个问题已经在1999年的“A PTAS for the Multiple Subset Sum Problem with different knapsack capacities”[Caprara,Kellerer,Pferschy]中进行了研究,其中给出了多项式时间(1-ε) - 近似算法。另一种近似方案在“Approximating the 0–1 Multiple Knapsack Problem with Agent Decomposition and Market Negotiation”[Smolinski] 2003中给出。
精确算法在1985年的“ALGORITHM 632 - A Program for the 0-1 Multiple Knapsack Problem”[Martello,Toth]中给出。可以找到Fortran(抱歉......)代码here。
答案 1 :(得分:0)
这是Knapsack问题的一个更复杂的版本,这意味着它是NP完整的,这意味着没有任何解决方案可以保证快速可接受。另一方面,更复杂可能使得更容易找到最佳解决方案。
基本思想是这样的:你从空容器开始。只要一个项目适合第一个容器,就可以在那里添加它。然后将项添加到第二个容器,依此类推。这为您提供了可能不是最佳的解决方案。所以你回溯最后一步并添加一个不同的项目。如果找不到更好的解决方案,则回溯最后两个步骤,依此类推。为了省去尝试无论如何都无法工作的各种组合,你总是试图计算你可能达到的值的上限,并且如果上限没有超过已知的最佳解决方案,则继续检查。
将物品放入第一个容器时,将每个物品放入该容器而不是另一个容器中,检查每件物品的收益。按重量增益对所有项目进行排序。例如,如果某个项目在第一个容器中的值为40,而在另一个容器中的值为20,并且重量为2个单位,则如果将其放入第一个容器中,则每个单位的值为10。任何容器中值为40的项目都可以放在任何位置。所以你先将这些物品放入第一个产生增益的容器中(这个想法是这可能会给你一个很好的解决方案,如果你有一个一个好的解决方案那么你可以删除不太好的来自搜索的解决方案)。
不要试图让你的代码快速运行。尽量使其易于修改。那是因为我不知道我的想法有多好(这只是我想开始的想法)。因此,您创建示例,尝试算法的工作情况,然后您想出如何更轻松地找到好的解决方案的想法。如果您保持代码易于修改,那么您可以轻松地尝试更好的想法。