【问题标题】:Algorithm to approximate an optimal solution for an integer allocation pro­blem近似整数分配问题的最优解的算法
【发布时间】:2014-12-03 12:05:06
【问题描述】:

我有以下问题:

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

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

【问题讨论】:

  • 让我想起了布尔可满足性,这通常是 NP 完全的,我认为这里同样适用。在这种情况下,您可能会得到一个很好的快速近似值,O(N^2) 或更好。您可能要考虑猜测最高金额将是多少,然后尝试查看是否可能。猜测的总和与实际总和相比越高,就越容易找到有效的(如果不是最优的)解决方案。
  • 你有什么样的限制?例如每个和中有多少项,有多少个和,有多少个变量,一个变量在一个和中可以重复多少次?
  • @PeterdeRivaz 在我所拥有的具体实例中,每个变量都有一个总和,其中仅包含该变量以及其他一些总和。大约一半的变量只出现一次(在它们单独出现的总和中)。我的具体实例有大约 25 个变量和 52 个总和。每个和的加数不超过 3 个。在每个总和中,每个变量出现的频率不超过两次。如果对您有帮助,我可以写下实例。
  • 不确定有什么好的算法,但您可以尝试使用整数优化工具,例如glpsol
  • 我会尝试使用约束求解器(例如 z3)。 MIP 求解器不能很好地处理所有不同的约束。

标签: algorithm mathematical-optimization discrete-mathematics diophantine


【解决方案1】:

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

顺便说一句,对于您的示例,它给出了以下结果:

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。 请注意,两者都是 Bags,因为它们包含不同的总和。 我们可以从 Tail 中的每个总和中减去 a,以便所有总和保持不同(即 Tail 仍然是 Bag)。这样我们就得到了两个没有变量a的包。

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

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

如何计算c?这个想法是计算它的 invalid 值,然后取不是 invalid 并且等于或大于d 的最小值。使用条件 HeadSum != TailSum + c => c != HeadSum - TailSum 计算 无效 值很简单。对于尾和和头和的每个组合,我们得到所有 无效 值。

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

PS 如果有人提供更好的解决方案,那就太好了,因为我认为我的算法有点近似(但很好的近似),甚至更好地证明它。 最糟糕的是N! 复杂性,因为排列,我仍然不知道如何摆脱它。

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 2012-11-13
    • 1970-01-01
    • 2021-10-15
    • 2014-09-07
    • 1970-01-01
    • 2023-03-28
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多