我正在使用Microsoft Solver Foundation和F#实现图形着色问题的解决方案。最近我发现了这篇文档:
解释了如何使用C#实现这一点。我试图翻译这个,但添加约束有问题。在C#中它非常简单:
model.AddConstraints("borders",
be != de, be != fr, be != nl, de != fr, de != nl);
然而,对F#的有文化翻译不起作用:
// WRONG !!
model.AddConstraints("borders",
be <> de, be <> fr, be <> nl, de <> fr, de <> nl);
过了一会儿,我在Term类中找到了一个函数,可以用它代替:
model.AddConstraints("borders1", Term.op_Inequality(be, de)) |> ignore
然而,使用这个“Term.op_Inequality”非常不方便。有没有办法更好地解决我的问题?
答案 0 :(得分:4)
快速解决方法是重新定义!=
运算符。它将覆盖其他!=
运算符,因此最好将其保持在尽可能小的范围内。
例如,我会将其保存在solve
函数中:
let solve args =
...
let (!=) (x: Decision) (y: Decision) = Term.op_Inequality(x, y)
model.AddConstraints("borders",
be != de, be != fr, be != nl, de != fr, de != nl) |> ignore
...
如果您需要多次!=
重载,则应将Decision
包装在F#区分联合中,并以F#方式定义所有运算符。
我在Who owns the Zebra example with MSF上使用上面的快速修复程序。代码为available here,可能对您有所帮助。