2014-02-12 3 views
1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.SolverFoundation.Services; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var context= SolverContext.GetContext(); 
      var model = context.CreateModel(); 

      var index = new Set(Domain.IntegerRange(0, 6), "index"); 

      var x = new Decision(Domain.IntegerRange(0, 5), "x", index); 
      model.AddDecision(x); 

      // When I uncomment the following line, values ends 
      // up with only 3 elements instead of 7 as expected 

      // model.AddConstraint("constraint", x[0] + x[1] + x[2] == 2); 

      model.AddGoal("objective", GoalKind.Minimize, Model.Sum(Model.ForEach(index, i => Model.Power(x[i] - 2, 2)))); 

      context.Solve(); 
      var values = x.GetValues().ToArray(); 
     } 
    } 
} 

은 찾기 재단은 정확하게 내가 최종 값에, model.AddConstraint("constraint", x[0] + x[1] + x[2] == 2)의 주석 2.찾기 재단, 이상한 행동

각각 동일은 세 가지 값을 포함 칠 개 값을 계산 : 0 , 1 및 1. 왜 나머지 값을 포함하지 않습니까?

무슨 일 이니?

+0

OML 및 명령 줄 유틸리티를 사용하여 동일한 모델을 해결하려고 했습니까? – denfromufa

+0

아니요. TBH 나는 이러한 도구를 사용하는 방법을 모르며 위의 코드가 작동해야 할 때이를 배우는 시간을 투자하고 싶지 않습니다. 어쨌든 팁을 주셔서 감사합니다. – ehremo

답변

1

활성 제약 조건을 사용하여 샘플을 실행하면 0+1+1가 발생하고 x[3] .. x[6]은 생략됩니다. 이것은 버그처럼 보입니다. 그들 모두는 가치가 2이어야합니다.

결과를 표시하려면 다음 줄을 추가합니다 :

foreach (object[] value in values) 
    { 
     Console.WriteLine("x[{0}] = {1}", value[1], value[0]); 
    } 

아마, Nathan Brixius의 블로그 통찰력을 제공 할 수 있습니다. 대안으로

model.AddConstraint("constraint2", (x[3] + x[4] + x[5] + x[6]) < 999); 

, 당신은 MiniZinc 차례이 같은 간단한 모델을 사용할 수 있습니다

는 다음 더미 제약 조건을 추가 한 후, 나는 다시 변수의 전체 세트를 가지고 :

set of int: ix = 0..6; 
array[ix] of var 0..5: x; 

constraint 
    x[0] + x[1] + x[2] == 2; 

solve minimize sum(i in ix)((x[i] - 2)*(x[i] - 2)); 

output 
["\nx[" ++ show(i) ++ "] = " ++ show(x[i]) | i in ix] ;