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文字列で作成し、ソルバーファウンデーションで解決しますが、結果はExcelで得られるものと同じではなく、いずれの場合も、得られる2次誤差はソルバーファウンデーションの結果の方が大きくなります( Excelシートでチェックイン)。

Excelと同じ結果が得られるようにソルバーを構成する方法はありますか?OMLを確認する必要がある場合は、質問してください。質問を更新します。

4

2 に答える 2

1

同じ結果を最小限に抑えようとしていますか?

たぶん、2つの方法は異なる差の測定を使用しています。

たとえば、ソリューションとして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

Excel2010ソルバーは次のことを思いつきました。

goal: 0.00017308

A: 0.36923685
B: 0.08461443
于 2013-01-06T02:00:35.647 に答える