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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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