簡體   English   中英

Microsoft Solver Foundation模運算符

[英]Microsoft Solver Foundation Modulo Operator

我正在嘗試通過執行以下操作為我的求解器基礎添加基本約束:

model.AddConstraint("c1", x % y == 0);

我收到一個編譯錯誤,指出“運算符'%'無法應用於類型'Microsoft.SolverFoundation.Services.Decision'和'Microsoft.SolverFoundation.Services.Decision'的操作數”。

這是有道理的,因為不支持許多運算符。 但是,許多不支持的運算符(sin,cos,tan等)可以作為Model類的特定方法使用,如下所示:

model.AddConstraint("c1", Model.Sum(x,y) == 0);

如果將“ Sum”替換為“ Mod”,則沒有可用的方法。

關於如何在Solver Foundation中執行模運算的任何想法? 根據此處的文檔,該文檔受支持。

我將開始使用反射器來挖掘代碼,但我想我也將其發布在這里。 如果找到解決方案,我將更新問題以包括答案。

我在http://msdn.microsoft.com/zh-cn/library/ff525341(v=vs.93).aspx上看不到Mod,但這是一種解決方法:

Model.Floor(Model.Quotient(x,y))==Model.Ceiling(Model.Quotient(x,y))

僅當x / y是整數,並且x%y == 0時,這才是正確的。

還有其他方式組合允許的運算符以檢查其是否可分割。 我最喜歡的(盡管由於浮點精度我不推薦使用)是

Model.Sin(Math.PI*Model.Quotient(x,y))==0 

真的很有趣,我想在SO上寫下完全相同的問題:-)

我在http://msdn.microsoft.com/zh-cn/library/ff818505(v=vs.93).aspx上為OML語言定義了Mod運算符。

AddConstraint方法有一個重載,它接受表達式字符串(我猜是OML表達式嗎?)而不是Term。 不幸的是,我不知道正確的格式,但是一旦我們知道了訣竅,我們也將能夠使用所有其他運算符。

編輯

似乎並非API中描述的每個OML表達式都在起作用。 例如,

SolverContext sc = SolverContext.GetContext();
Model m = sc.CreateModel();

m.AddDecision(new Decision(Domain.IntegerRange(0,10), "a"));
m.AddDecision(new Decision(Domain.IntegerRange(0, 10), "b"));

m.AddConstraint(null, "a > 0");
m.AddConstraint(null, "b == Plus[a,2]");

在這種情況下,Plus [x,y]正在運行,求解器將計算以下決策

a:1,b:3

但是如果我用這個替換最后一個約束

m.AddConstraint(null, "b == Mod[a,2]");

我得到了OmlParseException(“無法解析OML模型。表達式:Mod [a,2]。”)。 我想我們現在就一個人了,也許我們能做的最好的事情就是堅持user141603的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM