最大化多个桶总和?

时间:2013-06-06 07:13:16

标签: java c++ algorithm data-structures

有180个球。

有70个桶。

每个球的值取决于它所在的桶:

ball1 = { 1, 14, 2, 3, 4 ... } //70 values in total for each bucket
ball2 = { 24, 2, 23, 2, 5 ... }
...

每个铲斗都有一个可以携带的最大球数,但70个铲斗的总球数 可携带的是180,即所有180个球将完全适合。 (每个桶必须携带至少1个球)

{bucket1, 3} {bucket2, 1} { bucket3, 2} {bucket4, 1} ...

你如何最大限度地放置球?

我试图暴力破解,并在计算排列数后迅速后悔。

2 个答案:

答案 0 :(得分:5)

这似乎是一个二分图最大权重匹配问题。棘手的部分是如何构造二分图,以便我们可以应用多项式时间算法来解决问题。

为了使问题更容易,请说我们有3个球和2个桶:

Ball 1: {1, 10},
Ball 2: {9, 20},
Ball 3: {7, 9};

Bucket 1: 2
Bucket 2: 1

我想构建如下图:

enter image description here

主要思想是构建一个双图,使得节点的左侧部分代表球,而另一部分是桶的节点。并且我们提供与每个桶的容量一样多的节点,现在我们可以应用最大权重匹配算法来解决我们的问题。

答案 1 :(得分:2)

由于复杂性,这是一种问题,最好通过“我可以在固定的时间内实现什么样的最佳结果”方法来解决。如果你需要真正的全局最大值,那将不适合你。

我的第一种方法是模拟退火

1)随意放置球(每个铲斗约束中至少有一个球)

2)计算目标函数(你必须已经从暴力方法中得到这个)

3)考虑操作,比如随机交换两个球,将一个球移动到另一个桶中(如果约束允许的话)。

4)重新计算目标函数

5)如果目标函数更好,总是接受变化,但也(并且这很重要),如果目标函数更差并且衰减exp的概率也接受变化( - 恒定*时间)。 (这就是温度函数)。

6)再次回合。

这种方法可以让好的水桶粘在一起,并且在早期阶段,允许状态从局部最大值反弹。这里的科学是为'常数'找出一个很好的价值。

请参阅http://en.wikipedia.org/wiki/Simulated_annealing