1

我开始在 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,请询问,我会更新问题。

4

2 回答 2

1

您确定要尽量减少相同的结果吗?

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

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

于 2013-01-07T08:22:31.983 回答
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
于 2013-01-06T02:00:35.647 回答