1

我开始在WPF/C#应用程序,这应该更换,解决了一个线性问题的Excel工作表使用求解基金会,简单的东西像这样的大错误:求解基金会在C#中比Excel的求解器

  • 混合物A:(20%A + 70%B + 10%C)
  • 混合物B:(35%A + 65%C)
  • 混合物C:(10%A + 80%B + 10% D)

我需要多少混合物才能尽可能接近(15%A + 70%B + 1 0%C + 5%D)。

很简单,即使是Excel。所以......我用OML字符串创建了这个模型,并用Solver Foundation解决了这个问题,但结果与我在Excel中得到的结果不一样,并且在任何情况下,我得到的二次误差都比Solver Foundation结果更大(在Excel工作表中检查)。

有什么办法可以配置求解器以获得与Excel中相同的结果吗?如果您需要查看OML,请询问我将更新问题。

+0

你确定你正试图最小化相同的结果?也许这两种方法正在使用不同的差异度量。 – Guvante

+0

@Guvante感谢您的关注。我会仔细检查我是否使用相同的差异度量,虽然我是OML的新手,也许我缺少一些东西。 – Hannish

+0

@Guvante我认为你是对的,我发现两个差异测量有轻微的差异,我修改了它,但问题仍然存在,虽然现在得到的结果可能足够相似以保持这种方式。请发表您的评论作为答复我批准它,谢谢。 – Hannish

回答

1

你确定你正在尝试最小化相同的结果?

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

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

1

我试过你的问题。 如下所示,MSF导致类似的残留误差(如果不是更小的话)。

微软求解基金会我的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 
+0

您可以简单地定义一组Decisions并将其传递给求解器模型。 AddDecisions()也接受一个数组。这同样适用于错误术语和目标计算。 –

+0

只是为了确保......在这一行中有一个错字:Term errA =(a * 0.20 + b * 0.35) - 0.15 ;.不应该是术语errA =(a * 0.20 + b * 0.35 + c * 0.10) - 0.15;?谢谢你让我知道你可以通过一个数组 – Hannish

+0

是的,你是对的。我纠正了解决方案中的错误。剩余误差现在有点小。无国界医生仍然比Excel更好(舍入?)。 –