逼近整数分配问题的最优解的算法

时间:2014-12-03 12:05:06

标签: algorithm mathematical-optimization discrete-mathematics diophantine

我有以下问题:

  

给定一组变量之和,如{a + b,b + c,c + d,a + a + d,b},找到变量的正整数值,使得所有和都是不同的并且是最高和尽可能小。

是否有算法可以找到或近似解决这类问题?

1 个答案:

答案 0 :(得分:1)

我创建了一个可能的solution and an implementation in C#。希望这是你需要的。如果有人证明它是正确/不正确但它的工作原理和结果看起来是正确的,这将是很好的。理论细节如下。它的复杂性大约是O(N!*M^3*Log2(N)),其中N是变量的数量,M是所有求和的总和数。

BTW,对于你的例子,它给出了这个结果:

c=3, a=2, d=2, b=1
{a+b=3; b+c=4; c+d=5; a+a+d=6; b=1}
max=6

<强>更新

算法理论。

假设变量是有序的,例如a >= b >= c >= .... 假设一组总和是 Bag ,如果其中的所有总和都是不同的。 Bag中的所有总和可以分为两组:不包含变量a的总和和包含变量的总和。让我们将第一组称为 Head ,将第二组称为 Tail 。 请注意,两者都是包,因为它们包含不同的总和。 我们可以从Tail中的每个总和中减去a,以便所有总和保持不同(即Tail仍然是一个Bag)。这样我们就得到两个包都没有变量a

类似地,我们从两个包中排除变量b并获得四个包。 我们对每个变量重复此操作,直到我们得到最后一个变量的总和(假设它是d)。 d的最小值为1。

之后我们可以返回上一步,并在尾部的总和中包含变量c。请记住,我们有许多对头尾,需要加入它们。为此,我们将c添加到每个尾部的每个总和中,以便尾部的总和必须与头部不同。

如何计算c?我们的想法是计算其无效值,然后获取非无效的最小值,并且等于或大于d。使用条件HeadSum != TailSum + c =&gt;计算无效值是微不足道的。 c != HeadSum - TailSum。对于尾总和和总和的每个组合,我们得到所有无效的值。

折叠所有对头尾并计算每个变量,我们得到案例a >= b >= c >= d的解决方案。 然后我们为a >= b >= c >= d的每个排列计算一个解,并找到最小的一个。

PS如果有人提供更好的解决方案会很棒,因为我认为我的算法在某种程度上是近似的(但是很好的近似),甚至可以更好地证明它。 最糟糕的是N!复杂因为排列,我仍然不知道如何摆脱它。