2

次のようにして、ソルバー基盤に基本的な制約を追加しようとしています。

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 でモジュロ演算を実行する方法についてのアイデアはありますか? こちらのドキュメントによると、サポートされています。

リフレクターを使用してコードを掘り下げるつもりですが、ここにも投稿することにしました。解決策が見つかったら、質問を更新して回答を含めます。

4

2 に答える 2

0

本当に興味深いです。SOでまったく同じ質問を書きたかったのです:-)

Mod 演算子がhttp://msdn.microsoft.com/en-us/library/ff818505(v=vs.93).aspxで OML 言語用に定義されていることがわかりました。

Term の代わりに式文字列 (OML 式だと思いますか?) を受け入れる AddConstraint メソッドのオーバーロードがあります。残念ながら、正しいフォーマットはわかりませんが、コツをつかめば、他のすべての演算子も使用できるようになります。

編集

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の答えに固執することです.

于 2012-12-10T07:47:20.373 に答える
0

http://msdn.microsoft.com/en-us/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 
于 2012-12-09T17:14:20.400 に答える