繁体   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