我正在尝试为这个问题提出合理的算法:
假设你有一堆球。每个球至少有一种颜色,但也可以是多色的。每个球都有一个重量和一个与之相关的值。还有一堆盒子,每个盒子只有一种颜色。每个盒子都有最多可以容纳的球。我们的目标是在保持一定总重量 W 的同时最大化方框中的价值总和,唯一的规则是:
为了将球放在一个盒子里,它必须至少有一个盒子的颜色
(例如,您可以将蓝色和绿色球放入蓝色框或绿色框中,但不能放入红色框中。)
我已经进行了一些研究,这看起来与背包问题类似,也类似于匈牙利算法可以解决,但我似乎无法将其减少到任何一个问题。
我只是好奇是否有某种动态编程算法可以解决这类问题,使其在多项式时间内可以解决,或者只是伪装的旅行商问题。如果我知道最多有X种颜色会有用吗?任何帮助是极大的赞赏。如果它有帮助,我也可以用变量名称来形式化这个问题。谢谢!
这是一个简单的例子:
最大重量: 5
球:
1个红球 - (值= 5,重量= 1)
1个蓝色球 - (值= 3,重量= 1)
1个绿色/红色/蓝色球 - (值= 2,重量= 4)
1个绿色/蓝色球 - (值= 4,重量= 1)
1个红色/蓝色球 - (值= 1,重量= 1)
箱:
1红(持1球)
1蓝色(持有2个球)
1绿色(持球1球)
最佳解决方案:
红色框中的红球蓝色球和蓝色框中的红色/蓝色球
绿色框中的绿色/蓝色球总值:13(5 + 3 + 1 + 4)
总重量:4(1 + 1 + 1 + 1)
注意:即使绿色/红色/蓝色球比红色/蓝色球更有价值,它的重量也会让我们超过极限。
修改
一个澄清点:具有相同颜色组合的球不一定具有相同的重量和值。例如,你可以有一个值为3且重量为1的红色球和另一个值为2且重量为5的红色球。
编辑2:
如果它有助于我们提出动态编程算法,我们可以假设整数权重和值。
答案 0 :(得分:5)
这至少和背包问题一样复杂 - 考虑所有球都是红色并且只有一个红色框的情况。
如果具有相同颜色组合的球必须具有相同的重量和值,请考虑具有红色/蓝色,红色/绿色等球和仅一个红色框的情况。
答案 1 :(得分:5)
如果盒子的数量没有限制,那么通过从3-partition减少这个问题是非常NP的难度(设置n / 3个框并使所有的东西彩虹色,值=重量)
如果框的数量是常数,则通过动态编程得到伪多项式时间算法,其中每个DP状态包括每个框的填充程度。
答案 2 :(得分:3)
背包减少如下。鉴于你的背包实例,你创建了一个球和箱子问题的实例:对于背包实例的每个项目,你有一个与项目具有相同重量和价值的球。然后你有一个代表背包的盒子。球和盒子都是蓝色的。盒子的容量是背包问题中给出的限制。鉴于您的问题的解决方案,我们在框中有一组球,其总重量最多是背包限制,并且其总值最大化。
答案 3 :(得分:3)
这个问题是NP完全的,因为它包含了背包问题。
也就是说,它不仅仅与背包问题类似:如果有一个碗,所有球都有碗的颜色,碗中球的最大数量是球的总数,那么问题就在于背包问题。
如果算法可以在多项式时间内解决这个问题,它可以解决多项式时间内的任何背包问题。但是,由于背包问题是NP完全的,这个问题也是如此。
答案 4 :(得分:0)
在这种情况下你能做的最好就是得到最优解的近似值 - 背包问题在多项式时间本身是无法解决的。如果你能为它生成一个好的算法,你可能仍然能够获得好的(尽管不能保证是最优的)多项式时间。