![](/img/trans.png)
[英]Microsoft Solver Foundation UnsolvableModelException
[英]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.