2014-06-07 3 views
2

나는 EE + EE와 FF 각 일부 C로 구성 FF, 내가 작성한 D.추가 제약 경계 예외에서 발생

코드와

을 극대화 할 수있는 선형 최적화 목표를 가지고, I

EE_quantity: 0, FF_quantity: 7 

을 ...하지만 난 다른 해결책이있을 알고 : 찾기 위해 해결사 얻을 수

는 다른 유효한 솔루션에 대한 사용자 입력의 유효성을 검사하기 위해
EE_quantity: 1, FF_quantity: 6 

, 나는 두 EE에 대한 제약 조건을 추가 및 FF.

SolverContext c2 = SolverContext.GetContext(); 
Model m2 = c2.CreateModel(); 
p.elements = elements_multilevel_productmix(); 

Decision C_quantity = new Decision(Domain.IntegerNonnegative, "C_quantity"); 
Decision D_quantity = new Decision(Domain.IntegerNonnegative, "D_quantity"); 
Decision EE_quantity = new Decision(Domain.IntegerNonnegative, "EE_quantity"); 
Decision FF_quantity = new Decision(Domain.IntegerNonnegative, "FF_quantity"); 
m2.AddDecisions(C_quantity, D_quantity, EE_quantity, FF_quantity); 

m2.AddConstraints("production", 
    6 * C_quantity + 4 * D_quantity <= 100, 
    1 * C_quantity + 2 * D_quantity <= 200, 
    2 * EE_quantity + 1 * FF_quantity <= C_quantity, 
    1 * EE_quantity + 2 * FF_quantity <= D_quantity, 
    EE_quantity == 0, 
    FF_quantity == 7 
); 
m2.AddGoal("fixed_EE_FF", GoalKind.Maximize, "EE_quantity + FF_quantity"); 

Solution sol = c2.Solve(new SimplexDirective());    
foreach (var item in sol.Decisions) 
{ 
    System.Diagnostics.Debug.WriteLine(
     item.Name + ": " + item.GetDouble().ToString() 
    ); 
} 

그것은 찾기 재단 정말이 특정 조합을 좋아하지 않는 것 같습니다 : 그래서 실행 가능한 예제 아래 코드에 EE_quantity == 0, FF_quantity == 7을 추가했다. EE_quantity == 0 또는 FF_quantity == 7 만 사용하면 EE_quantity == 1, FF_quantity == 6을 사용하는 것이 좋습니다. 그러나 둘 중 하나를 사용하고 그 중 하나를 0으로 설정하면 예외가 throw됩니다.

색인이 배열의 경계를 벗어났습니다.

여기에서 무슨 일이 일어나고있는거야? 그리고 특정 문제에 대한 "모든"해결책을 찾으려면 어떻게 지정해야합니까?

답변

5

(참고 :. 찾기 재단의 새로운 버전이 곧 출시 될 없습니다 - 그것은 본질적으로 마이크로 소프트에 의해 삭제 된 것)

스택 추적이 심플 렉스 솔버의 presolve 루틴에 버그가 있음을 나타냅니다. 안타깝게도 SimplexDirective에는 InteriorPointDirective과 달리 프리 솔브를 비활성화 할 수있는 방법이 없습니다. 따라서이 문제를 해결하는 방법은 고정 변수를 다르게 지정하는 것입니다.

EE_quantityFF_quantity을 설정하는 마지막 두 제약 조건을 제거하고 대신 Decision 개체를 만들 때 상한과 하한을 각각 0과 7로 설정합니다. 단지 최적의 솔루션을 반환

Decision EE_quantity = new Decision(Domain.IntegerRange(0, 0), "EE_quantity"); 
Decision FF_quantity = new Decision(Domain.IntegerRange(7, 7), "FF_quantity"); 

MSF는 단순 해결사 많은 혼합 정수 솔버와 같은 : 이것은 당신이 표현하고 싶었던에 해당하지만, MSF 버그를 방지하기 위해 나타납니다. MSF가 모든 솔루션을 반환하게하려면 제약 프로그래밍 솔버 (ConstraintProgrammingDirective)로 변경하십시오. Solution.GetNext()에 대한 설명서를 검토하는 경우이를 수행하는 방법을 알아야합니다.

물론 CP 솔버는 글로벌 최적 솔루션을 즉시 생성 할 수 있다고 보장하지 않습니다. 그러나 솔루션을 충분히 반복하여 반복한다면 얻을 수 있습니다.