Microsoft Solver Foundation 서비스 선언 구문
-
05-07-2019 - |
문제
MS Solver Foundation] [1]를 실험하는 데 사용하고 싶은 간단한 문제가 있습니다.
1 ~ 5 범위의 정수로 채워야하는 10 개의 슬롯이 있습니다. 두 가지 제약 조건 만 시행하고 싶습니다.
- 슬롯 [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 );
그러나 나는 이것을 할 수있는 더 좋은 방법이 있다고 상상해야한다.
해결책
코드.
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();
다른 팁
토론은 이미 공식 포럼으로 옮겨졌습니다.
http://code.msdn.microsoft.com/solverfoundation/thread/view.aspx?threadid=2256
legning
제휴하지 않습니다 StackOverflow