1

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

4

1 回答 1

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# 的方式定义所有运算符。

我在“谁拥有斑马”示例中使用了上面的快速修复方法。该代码可在此处获得,这可能对您有所帮助。

于 2013-08-03T21:24:34.880 回答