2012-05-25 2 views
1

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} 그래서 맞아.

하지만 전체 실제 도메인에서 해석기가 시작되지 않는 이유는 무엇입니까? 아직도 모르겠다

어쩌면 누군가는 언젠가는 대답 할 것이다 ... 나는 희망한다. 그러나 나는 답을 다음과 같이 정확하게 표시하고있다.

+0

거리가 스칼라 또는 벡터 유형입니까?모델을 만들 때 A, B 및 C가 정의된다는 것이 긍정적입니까? 'GoalFunction'에서는 _dsA_, _rB_ 및 _rC_를 _dsA_로 감산하는 반면 재 작성된 코드에서는 _dsA_, _dsB_ 및 _dsC_로 각각 뺄 것입니다. 이것은 단순히 오타입니까? –

+0

다시 작성한대로 _GoalFunction_을 적용했지만 A.Location.X, ..., dsA, ...를 컴파일시의 double 상수로 바꿨습니다. 나는 실행할 때 합당한 답을 얻는다. 아직 작성하지 않았다면 rA, rB 및 rC를 정의하기 전에 A, B, C, dsA, dsB 및 dsC가 정의되어 있는지 확인하십시오. –

답변

1

나는 MSF에 대한 전문가가 아니지만, 귀하의 model.AddGoal() 성명이 잘못되었다고 말할 수있는 한. documentation에 따르면 세 번째 인수는 Term이어야합니다. 더블에 기간에서 암시 적 캐스트 연산자를 가지고기간은 그래서 당신의 model.AddGoal() 문에서 일어나는 유일한 것은 GoalFunction 한 번 호출된다 (그리고 결정은 처음에 초기화되지 않기 때문에 예외가 발생합니다).

MSF 샘플에는 목표를 작성하는 방법에 대한 몇 가지 예가 나와 있습니다.

UPDATE이 같은 나는 간단한 목표 (Rosenbrock 바나나 기능)을 생성하는 대신 AddGoal 호출이 목표를 통합 한 이러한 샘플을 바탕으로

:

var goal = Model.Sum(Model.Power(1.0 - decisionX, 2.0), 
         Model.Product(100.0, Model.Power(decisionY - Model.Power(decisionX, 2.0), 2.0))); 
    model.AddGoal("Goal", GoalKind.Minimize, goal); 

희망이 이어질 수 당신의 목표 기능을 정립하는 방향으로 당신을 인도하십시오.

+0

이 예제를 보았지만 한 함수 내에서이 함수를 닫을 수 있는지 확실하지 않습니다. 어쨌든 시도해 보겠습니다. –

+0

나는 희망하는 접근 방식으로 나의 대답을 업데이트했다. 보장은 없지만 바로 시도해 보겠습니다 :-) –

+0

동일한 예외가 발생합니다. 즉, 결정이 초기화되지 않습니다. 내 함수를 Model.Method() 호출로 바꿨으므로 끝에 Term이 있지만 Solve를 얻은 후에 Infinities를 얻습니다.) 그래서 뭔가 잘못되었습니다. –