有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} ...
你如何最大限度地放置球?
我试图暴力破解,并在计算排列数后迅速后悔。
答案 0 :(得分:5)
这似乎是一个二分图最大权重匹配问题。棘手的部分是如何构造二分图,以便我们可以应用多项式时间算法来解决问题。
为了使问题更容易,请说我们有3个球和2个桶:
Ball 1: {1, 10},
Ball 2: {9, 20},
Ball 3: {7, 9};
Bucket 1: 2
Bucket 2: 1
我想构建如下图:
主要思想是构建一个双图,使得节点的左侧部分代表球,而另一部分是桶的节点。并且我们提供与每个桶的容量一样多的节点,现在我们可以应用最大权重匹配算法来解决我们的问题。
答案 1 :(得分:2)
由于复杂性,这是一种问题,最好通过“我可以在固定的时间内实现什么样的最佳结果”方法来解决。如果你需要真正的全局最大值,那将不适合你。
我的第一种方法是模拟退火:
1)随意放置球(每个铲斗约束中至少有一个球)
2)计算目标函数(你必须已经从暴力方法中得到这个)
3)考虑操作,比如随机交换两个球,将一个球移动到另一个桶中(如果约束允许的话)。
4)重新计算目标函数
5)如果目标函数更好,总是接受变化,但也(并且这很重要),如果目标函数更差并且衰减exp的概率也接受变化( - 恒定*时间)。 (这就是温度函数)。
6)再次回合。
这种方法可以让好的水桶粘在一起,并且在早期阶段,允许状态从局部最大值反弹。这里的科学是为'常数'找出一个很好的价值。