考虑以下等式:
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个方程的系统
答案 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的范围是:
...我们对所有约束重复这一点。 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的所有组合。因此,它将关注所有可能性。不是很愉快,但不可避免。