1

我正在使用Microsoft Solver Foundation和F#實施Graph Coloring問題的解決方案。最近,我發現了這片文檔:在Microsoft Solver中使用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); 

一段時間,我發現在期限類的函數後,可能用來代替:

model.AddConstraints("borders1", Term.op_Inequality(be, de)) |> ignore 

但是,使用這個「Term.op_Inequality」是相當不方便的。有沒有辦法更好地解決我的問題?

回答

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,它可能會幫助您。

+0

謝謝!儘管我一直在搜索這些材料一段時間,但我並不知道這個網站。這絕對會派上用場。 乾杯! :) –