找出是否存在多个方程的解(在N中)

时间:2014-05-21 21:01:21

标签: linear-algebra

考虑以下等式:

X > Y  

X + Y > 7  

Y <= 10  

X >= 0  

Y >= 0  

我想知道是否存在满足所有这些(自然数)的解决方案。

我不关心确切的解决方案,我只是想知道是否有解决方案

我读过有关Microsoft Solver Foundation或其他线性编程库的文章,但我不确定他们是否可以解决这样的问题。

特别是我不确定能否解决每一方都有变量的方程式,如

X > Y, or X + Y > Z  

大多数例子的形式如下:

X * 10 + Y * 30 > constant  

我需要能够解决最多4-8个变量的系统,所有变量都在0-100

范围内

我有另一个重要的限制,图书馆需要快速。我需要能够在0,00001秒内解决类似7个方程的系统

1 个答案:

答案 0 :(得分:0)

有趣的问题。感觉很像整数背包问题。

首先,变量是否在每一方都是无关紧要的,因为像

这样的等式
X + Y > Z

可以改写为

X + Y - Z > 0

因此,我们假设所有约束都是格式

(const1 * var1) + ... + (const8 * var8) > const

为了支持更少的变量,只需使用值0作为其中一个常量。

可视化的方法是将2个变量的情况视为确定“&#39;线”的凸包。对应于约束。因此,每个约束都可以绘制为2D线,并且只允许在线的一侧使用值。

为了对3个变量进行可视化,它与“#”平面的凸包是否相同。由约束确定的内容中包含任何网格点(&#39;自然数&#39;)。

在这种情况下的问题是解决方案应该只有自然数:这使得正常的线性代数不可能,因为强加了网格。我不知道有任何图书馆支持这些限制。

但是自己编写一个解决方案并不困难:想法是通过积极修剪来尝试每个数字来找到解决方案。

因此在您的示例中:测试0到100范围内的所有X.现在转到下一个变量,并根据约束确定自由变量的有效范围。计算出x == 8:那么y的范围是:

  • 0 .. 7因为约束x&gt; ÿ
  • 0 .. 100,因为约束x + y&gt; 7(因为x已经是8)
  • 0 .. 9因为约束y&lt; 10

...我们对所有约束重复这一点。 y的最终约束是0 .. 7,因为这是最严格的约束。现在对剩余的未绑定变量重复此过程,如果找到至少一个解决方案,则完成。

我希望这段代码大约有100行动态编程;计算时间在很大程度上取决于输入并且变化很大。

例如,一组需要很长时间的方程式:

A + B + C + D + E + F + G + H > 400.5
A + B + C + D + E + F + G + H < 400.6

作为一个人,我们可以推断出,既然我们需要自然数,那么这些方程就没有解决方案。然而,使用上述方法不能修剪该解决方案,在得出没有拟合H之前,必须测试A ... G的所有组合。因此,它将关注所有可能性。不是很愉快,但不可避免。