Solver Foundation в C# имеет большую ошибку, чем решатель Excel
Я начинаю использовать Solver Foundation в приложении WPF/C#, которое должно заменить лист Excel, который решает линейную задачу, что-то вроде этого:
- Смешайте A: (20% A + 70% B + 10% C)
- Смесь Б: (35% А + 65% С)
- Смесь C: (10% A + 80% B + 10% D)
Сколько мне нужно каждой смеси, чтобы получить как можно ближе (15% A + 70% B + 10% C + 5% D).
Довольно просто, даже для Excel. Итак... Я создаю эту модель в строке OML и решаю ее с помощью Solver Foundation, но результаты не совпадают с полученными в Excel, и в каждом случае полученная квадратичная ошибка больше с результатами Solver Foundation (проверено в листе Excel).
Есть ли способ настроить солвер для получения того же результата, что и в Excel? Если вам нужно увидеть OML, пожалуйста, спросите, и я обновлю вопрос.
2 ответа
Вы уверены, что пытаетесь свести к минимуму тот же результат?
Может быть, два метода используют разные измерения различий.
Например, вы, кажется, измеряете R^2 как свое решение, это то, что ваш код C# использует в качестве меры расстояния от идеального?
Я пробовал вашу проблему. Как показано ниже, MSF привела к аналогичной, если не меньшей остаточной ошибке.
Мой код C# для Microsoft Solver Foundation:
using System;
using Microsoft.SolverFoundation.Services;
namespace akMSFStackru
{
class Program
{
static void Main(string[] args)
{
SolverContext context = SolverContext.GetContext();
Decision a = new Decision(Domain.RealNonnegative, "A");
Decision b = new Decision(Domain.RealNonnegative, "B");
Model model = context.CreateModel();
model.AddDecisions(a, b);
Term c = 1.0 - a - b; // a + b + c sum up to 100%
Term errA = (a * 0.20 + b * 0.35 + c * 0.10) - 0.15; // resulting percentage of A should be 15%
Term errB = (a * 0.70 + c * 0.80) - 0.70;
Term errC = (a * 0.10 + b * 0.65) - 0.10;
Term errD = (c * 0.10) - 0.05;
Term goal = errA * errA + errB * errB + errC * errC + errD * errD;
// ingredients sum up to 100% of the required volume
// constraint is not necessary as c is defined to be 1 - a - b
model.AddConstraints("total", 1.0 == a + b + c);
model.AddGoal("goal", GoalKind.Minimize, goal);
// could specify the IPM solver, as we have a quadratic goal
Solution solution = context.Solve();
Report report = solution.GetReport();
Console.WriteLine("a={0} b={1}", a, b);
Console.Write("{0}", report);
}
}
}
Результаты, достижения:
goal: 0,000173076935386814
A: 0,369230770226158
B: 0,0846153845073738
Решатель Excel 2010 придумал:
goal: 0.00017308
A: 0.36923685
B: 0.08461443