Solver Foundation을 처음 사용하는 경우 목표 기능을 지정하는 방법을 이해하지 못합니다. Solver를 사용하여 풀려고하는 문제는 목표 표면에 기초한 2D 표면에서 최적 점을 찾는 것입니다. 입력 데이터로,이 표면에 3 점이 있고 음파가 소스 (최적 점)에서 3 점까지 얻어야하는 시간의 차이가 있습니다. 이 시간차는 거리 차이를 유발합니다. 결정은이 시점에서 초기화되지 않기 때문에,Solver를 사용하여 2D 영역에서 최적 점 찾기
가double GoalFunction() {
Location X = new Location(decisionX.ToDouble(), decisionY.ToDouble());
var rA = A.Location.Distance(X);
var rB = B.Location.Distance(X);
var rC = C.Location.Distance(X);
rA = (Distance)(rA - dsA);
rB = (Distance)(rB - dsA);
rC = (Distance)(rC - dsA);
return (rA * rA + rB * rB + rC * rC)/3;
}
위의 코드는 예외 (decisionX.ToDouble()
)를 던졌습니다 :()는 다음과 같이 정의된다
var solver = SolverContext.GetContext();
var model = solver.CreateModel();
decisionX = new Decision(Domain.Real, "X");
decisionY = new Decision(Domain.Real, "Y");
model.AddDecision(decisionX);
model.AddDecision(decisionY);
model.AddGoal("Goal", GoalKind.Minimize, GoalFunction());
var solution = solver.Solve();
Console.WriteLine("X " + decisionX.GetDouble());
Console.WriteLine("Y " + decisionY.GetDouble());
GoalFunction :
그리고 여기 내 코드입니다.
아무도 나를 다시 쓸 수 있습니까?
GoalFunction을 all-Model.methods-calls에 다시 작성했습니다. LocalOptimal 용액으로서
var solver = SolverContext.GetContext();
var model = solver.CreateModel();
decisionX = new Decision(Domain.Real, "X");
decisionY = new Decision(Domain.Real, "Y");
model.AddDecision(decisionX);
model.AddDecision(decisionY);
var rA = Model.Difference(
Model.Sqrt(
Model.Sum(
Model.Power(Model.Difference(decisionX, A.Location.X), 2),
Model.Power(Model.Difference(decisionY, A.Location.Y), 2)
)
),
dsA.Value
);
var rB = Model.Difference(
Model.Sqrt(
Model.Sum(
Model.Power(Model.Difference(decisionX, B.Location.X), 2),
Model.Power(Model.Difference(decisionY, B.Location.Y), 2)
)
),
dsB.Value
);
var rC = Model.Difference(
Model.Sqrt(
Model.Sum(
Model.Power(Model.Difference(decisionX, C.Location.X), 2),
Model.Power(Model.Difference(decisionY, C.Location.Y), 2)
)
),
dsC.Value
);
var miner = Model.Min(rA, rB, rC);
rA = Model.Difference(rA, miner);
rB = Model.Difference(rB, miner);
rC = Model.Difference(rC, miner);
var goal = Model.Sum(
Model.Power(rA, 2),
Model.Power(rB, 2),
Model.Power(rC, 2)
);
model.AddGoal("Goal", GoalKind.Minimize, goal);
var solution = solver.Solve();
var q = solution.Quality;
double x = decisionX.GetDouble();
double y = decisionY.GetDouble();
solution.GetNext();
x = decisionX.GetDouble();
y = decisionY.GetDouble();
이 코드는 작동하지만 복귀 {0.0}, 최적이 {2,2} (I는 GoalFunction는 {2,2} 및 훨씬 더 높은 값 {0 0을 반환 체크하면서, 결정이 Domain.Real 때 0}. 아마 {0,0} 지점을 시작합니다.
Solution.GetNext()는 아무것도 변경되지 않습니다.
decisionX = new Decision(Domain.RealRange(-10, 10), "X");
decisionY = new Decision(Domain.RealRange(-10, 10), "Y");
내가 도메인을 제한 할 경우, 솔루션입니다 반환 {1.9999999984154413,1.9999999990963979} 그래서 맞아.
하지만 전체 실제 도메인에서 해석기가 시작되지 않는 이유는 무엇입니까? 아직도 모르겠다
어쩌면 누군가는 언젠가는 대답 할 것이다 ... 나는 희망한다. 그러나 나는 답을 다음과 같이 정확하게 표시하고있다.
거리가 스칼라 또는 벡터 유형입니까?모델을 만들 때 A, B 및 C가 정의된다는 것이 긍정적입니까? 'GoalFunction'에서는 _dsA_, _rB_ 및 _rC_를 _dsA_로 감산하는 반면 재 작성된 코드에서는 _dsA_, _dsB_ 및 _dsC_로 각각 뺄 것입니다. 이것은 단순히 오타입니까? –
다시 작성한대로 _GoalFunction_을 적용했지만 A.Location.X, ..., dsA, ...를 컴파일시의 double 상수로 바꿨습니다. 나는 실행할 때 합당한 답을 얻는다. 아직 작성하지 않았다면 rA, rB 및 rC를 정의하기 전에 A, B, C, dsA, dsB 및 dsC가 정의되어 있는지 확인하십시오. –