使用F#在Microsoft Solver中添加约束

时间:2013-08-03 20:54:58

标签: algorithm f# code-translation ms-solver-foundation graph-coloring

我正在使用Microsoft Solver Foundation和F#实现图形着色问题的解决方案。最近我发现了这篇文档:

http://msdn.microsoft.com/en-us/library/ff826354(v=vs.93).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

解释了如何使用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”非常不方便。有没有办法更好地解决我的问题?

1 个答案:

答案 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,可能对您有所帮助。