2

[MS Solver Foundation][1] で実験するために使用したい次の簡単な問題があります。

1 から 5 の範囲の整数を入力する必要がある 10 個のスロットがあります。2 つの制約のみを適用したいと考えています。

  • スロット[n] != スロット[n + 1]
  • すべてのスロットの合計が 20 を超える必要があります

次の決定を簡単に作成できます。

Decision s1 = new Decision(Domain.IntegerRange(1, 5), "slot1");
Decision s2 = new Decision(Domain.IntegerRange(1, 5), "slot2");
Decision s3 = new Decision(Domain.IntegerRange(1, 5), "slot3");
Decision s4 = new Decision(Domain.IntegerRange(1, 5), "slot4");
Decision s5 = new Decision(Domain.IntegerRange(1, 5), "slot5");
Decision s6 = new Decision(Domain.IntegerRange(1, 5), "slot6");
Decision s7 = new Decision(Domain.IntegerRange(1, 5), "slot7");
Decision s8 = new Decision(Domain.IntegerRange(1, 5), "slot8");
Decision s9 = new Decision(Domain.IntegerRange(1, 5), "slot9");
Decision s10 = new Decision(Domain.IntegerRange(1, 5), "slot10");

そして、次のように手動で制約を設定します

model.AddConstraints("neighbors not equal",
               s1 != s2, s2 != s3, s3 != s4, s4 != s5,
               s5 != s6, s6 != s7, s7!= s8, s8 != s9, s9 != s10
               );

model.AddConstraint("sum",
              s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 > 20 );

ただし、これを行うためのより良い方法があると想像する必要があります。願わくば、より宣言的な構文に似たものを使用してください。

4

2 に答える 2

2

コード。

SolverContext context = SolverContext.GetContext();
Model model = context.CreateModel();

Decision[] slot = new Decision[10];

for (int i = 0; i < slot.Length; i++)
{
    slot[i]  = new Decision(Domain.IntegerRange(1, 5), "slot" + i.ToString());
    model.AddDecision(slot[i]);
    if (i > 0) model.AddConstraint("neighbors not equal", slot[i-1] != slot[i]);
}

model.AddConstraint("sum", Model.Sum(slot) > 20);

Solution solution = context.Solve();
于 2009-09-10T19:43:58.977 に答える
-1

ディスカッションはすでに公式フォーラムに移動されています。

http://code.msdn.microsoft.com/solverfoundation/Thread/View.aspx?ThreadId=2256

レングニング

于 2009-09-10T18:17:07.767 に答える