[英]Microsoft Solver Foundation UnsolvableModelException
[英]Microsoft Solver Foundation Services declarative syntax
我要使用以下簡單問題來嘗試[MS Solver Foundation] [1]:
我有10個插槽,需要填充1到5范圍內的整數。我只想強制執行兩個約束:
我可以簡單地做出以下決定:
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 );
但是,我必須想象有一種更好的方法來完成此操作-希望采用類似於聲明性語法的方式。
編碼。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.