2013-12-08 4 views
1

C#의 Microsoft Solver Foundation을 사용하여 문제에 대한 해결책을 찾으려고하고 있는데 필요한 모든 제약 조건을 설정하는 데 문제가 있습니다. 기본 모델은 베이 목록이 있으므로 모든 베이를 모두로드해야 모든 베이의 총 수가 최대화됩니다. 나는 현재 이렇게하고있다.Microsoft Solver Foundation - 함수를 제약 조건으로 사용하는 방법?

var solver = SolverContext.GetContext(); 
var model = solver.CreateModel(); 
var decisions = 
    bays.Select(b => new Decision(Domain.IntegerNonnegative, "B"+b.bay.getShortName())); 
model.AddDecisions(decisions.ToArray()); 

foreach (BayPositionLoading bay in bays) 
{ 
    model.AddConstraint(
      "B" + bay.bay.getShortName() + "Cons", 
      model.Decisions 
       .First(d => d.Name == "B" + bay.bay.getShortName()) <= bay.bay.maxLoad); 
} 

내가 정말로하고 싶은 것은 특정 함수가 true를 반환한다는 제약 조건을 추가하는 것이다. 이 함수는 다음과 같을 것입니다.

그러나이 함수에 전달할 베이 목록을 만드는 방법을 알 수는 없습니다. 나는 비슷한 것을하고 싶습니다만, ToDouble 또는 GetDouble을 말할 때 이것은 예외를 던지기를 계속합니다.

foreach(Bay b in bays) 
{ 
    var dec= model.Decisions.First(it => it.Name == "B" + bay.bay.getShortName()); 
    b.actualLoad = dec.ToDouble(); // Or GetDouble 
} 
model.AddConstraint("func", isValid(bays) == true); 

누구에게 제안 할 수 있습니까? 감사합니다.

답변

0

OML 언어와 함께 제공되는 수학을 사용해야하므로 MSF에서 사용하려고하는 사용자 지정 함수가 지원되지 않는다고 생각합니다.

+0

이것은 단순 알고리즘의 묵시적인 요구 사항에 기인한다고 생각합니다. 사용자 지정 기능 (예 : [OptaPlanner] (http://www.optaplanner.org/)) 재사용을 지원하는 다른 솔버가 있지만 메타 최적화와 같은 다른 최적화 알고리즘을 사용합니다. –

+0

MSF는 단순 알고리즘에 국한되지 않습니다. – denfromufa