C#中的Solver Foundation比Excel的求解器有更大的错误

时间:2013-01-04 19:45:11

标签: mathematical-optimization solver linear-programming ms-solver-foundation

我开始在WPF / C#应用程序中使用Solver Foundation,它应该替换解决线性问题的Excel工作表,这样简单:

  • 混合物A:(20%A + 70%B + 10%C)
  • 混合物B:(35%A + 65%C)
  • 混合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 个答案:

答案 0 :(得分:1)

我已经尝试过你的问题了。 如下所示,MSF导致了类似的(如果不是更小的)残差。

Microsoft Solver Foundation的C#代码:

using System;
using Microsoft.SolverFoundation.Services;

namespace akMSFStackOverflow
{
    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

答案 1 :(得分:1)

您确定要尝试最小化相同的结果吗?

也许这两种方法使用不同的差异测量。

例如,您似乎在测量R ^ 2作为您的解决方案,那就是您的C#代码用来衡量距离完美的距离吗?