Microsoft Solver Foundation дает дикий результат для простой проблемыC#

Место общения программистов C#
Anonymous
Microsoft Solver Foundation дает дикий результат для простой проблемы

Сообщение Anonymous »

Я использую Microsoft Solver Foundation, чтобы минимизировать хи-квадрат между двумя распределениями. Обычно в каждом распределении есть несколько пиков, но иногда есть только один. Я замечаю в этом случае, когда ответ должен быть тривиальным, он выпускает что -то далеко, даже если мое первоначальное предположение верно. Вот пример: < /p>

Код: Выделить всё

double[] dist1 = { 3000000 };
double[] dist2 = { 6000000 };
SolverContext solver = SolverContext.GetContext();
solver.ClearModel();
Model model = solver.CreateModel();
Decision x = new Decision(Domain.RealNonnegative, null);
x.SetInitialValue(dist1.Sum() / dist2.Sum());
model.AddDecision(x);
Term chisq = Model.Sum(Enumerable.Range(0, dist1.Length).Select(i => Model.Power(x * dist2[i] - dist1[i], 2)).ToArray());
Goal goal = model.AddGoal(null, GoalKind.Minimize, chisq);
Solution s = solver.Solve();
Console.WriteLine($"{goal.ToDouble()}\t{x.GetDouble()}");
< /code>
Ответ должен быть 0,5 для хи-квадрат 0, но вместо этого он дает 97,7 с хи-квадратом 1E14. Я замечаю, если я добавляю дополнительное 0 в Dist1 
и dist2 , или если я удалю 0 из обоих, вдруг это дает правильный ответ. Я также могу использовать NeldermeadDirective при вызове Solve () , который дает правильный ответ, но я настороженно с другими эффектами, которые это может иметь. И, конечно, я понимаю, что могу написать специальную логику для обращения с одним пиком, но мне интересно, почему это потребуется.

Подробнее здесь: https://stackoverflow.com/questions/797 ... le-problem

Вернуться в «C#»