我可以使用 Alloy 来解决类似线性规划的问题吗?

Can I use Alloy to solve linear programming like problems?

我想找到一组数值方程的解,我想知道是否可以使用 Alloy。

我发现关于 alloy 的有限信息似乎表明(至少对我而言)可以做到,但我没有发现类似问题的例子。

这当然不容易,所以在投入时间和金钱之前,我想知道这是否可行。

简化示例:

(1) a + b = c, (2) a > b, (3) a > 0, (4) b > 0,  (5) c > 0 

一个解决方案是

a = 2, b = 1, c = 3

任何关于 Alloy 或更好的工具/解决方案的可用性的见解将不胜感激。

亲切的问候,

保罗.

Alloy 专门用作关系约束求解器。虽然它可以执行非常简单的线性规划,但您可能需要查看像 MiniZinc 这样的专用工具。

Daniel Jackson 不鼓励使用 Alloy 来解决数字问题。原因是 Alloy 使用 SAT 求解器,这不能很好地扩展,因为它严重限制了可用整数的范围。默认情况下 Alloy 使用 4 位整数:-8..7。 (这可以用 运行 命令放大,但当然会减慢找到答案的速度。)不使用数字的心态也影响了语法,没有很好的数字运算符。 IE。添加是 5.plus[6].

也就是说,您的问题看起来像:

pred f[a,b,c : Int] {
    a.plus[b] = c 
    a > b
    a > 0
    b > 0
    c > 0 
}

run f for 4 int

答案可以在评估器或文本视图中找到。我得到的第一个答案是 a=4, b=1, c=5.

Alloy 是在 2010 年左右开发的,从那时起,SMT 求解器的工作方式类似于 SAT 求解器,但也可以处理数值问题。 Alloy 可以使用我认为的那些求解器。会很好,因为这种语言非常好用,缺少数字是一个真正的问题。

更新https://github.com/AlloyTools/models/blob/master/puzzle/einstein/einstein-wikipedia.als

添加了约束拼图