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);
누구에게 제안 할 수 있습니까? 감사합니다.
이것은 단순 알고리즘의 묵시적인 요구 사항에 기인한다고 생각합니다. 사용자 지정 기능 (예 : [OptaPlanner] (http://www.optaplanner.org/)) 재사용을 지원하는 다른 솔버가 있지만 메타 최적화와 같은 다른 최적화 알고리즘을 사용합니다. –
MSF는 단순 알고리즘에 국한되지 않습니다. – denfromufa