Microsoft Solver Foundationで最適化問題を解く

Microsoft Solver FoundationというライブラリがMSDN Archiveからダウンロードできることをご存知でしょうか。今回は、Excelからも使えるこのライブラリをご紹介します。

install

まず上記ダウンロードページからExpressEditionをインストール、NextとAgree連打でOKです。注意点として、このライブラリを使う場合、.NET Framework4.0が必要です。(.NET 4.0ClientProfileも、.NET4.5もダメです)

解くべき問題は以下を想定します。ここを参考にさせてもらいました。

問題

問題2

このレベルならx, yと置いてXY平面上に制約を直線で引いて解いてもいいですが、つまらんのでC#のConsoleアプリケーションとして解きましょうというお話。Microsoft.SolverFoundationライブラリを参照設定追加しておきます。

namespace LinearProgramming
{
    using System;
    using Microsoft.SolverFoundation.Solvers;

    class Program
    {
        static void Main(string[] args)
        {
            // 線形計画法のソルバー
            var solver = new SimplexSolver();

            // 答えは製品1を[x1]コ、製品2を[x2]コとする。
            // それぞれの変域制限も可能、ここでは0-100で設定しておく。
            int x1, x2;
            solver.AddVariable("製品1", out x1);
            solver.SetBounds(x1, 0, 100);
            solver.AddVariable("製品2", out x2);
            solver.SetBounds(x2, 0, 100);

            // 製品1, 2の特徴である原材料A, Bと価格の行を作成。
            int zairyouA, zairyouB, price;
            solver.AddRow("材料A", out zairyouA);
            solver.AddRow("材料B", out zairyouB);
            solver.AddRow("価格", out price);
            // 材料A: 製品1は1kg使う、製品2は1kg使う、トータル4kgまで。
            solver.SetCoefficient(zairyouA, x1, 1);
            solver.SetCoefficient(zairyouA, x2, 1);
            solver.SetBounds(zairyouA, 0, 4);
            // 材料B: 製品1は3kg使う、製品2は1kg使う、トータル6kgまで。
            solver.SetCoefficient(zairyouB, x1, 3);
            solver.SetCoefficient(zairyouB, x2, 1);
            solver.SetBounds(zairyouB, 0, 6);

            // 価格(売上)を最大化するのが目的なのでAddGoalにfalseを指定する。
            // 最小化したい場合はtrueを指定
            solver.SetCoefficient(price, x1, 8);
            solver.SetCoefficient(price, x2, 6);
            solver.AddGoal(price, 1, false);

            // 解表示
            solver.Solve(new SimplexSolverParams());
            Console.WriteLine("製品1:{0}コ, 製品2:{1}コ", solver.GetValue(x1).ToDouble(), solver.GetValue(x2).ToDouble());
            Console.WriteLine("価格:{0}万円", solver.GetValue(price).ToDouble());
            Console.WriteLine("原材料A:{0}kg, 原材料B{1}kg", solver.GetValue(zairyouA).ToDouble(), solver.GetValue(zairyouB).ToDouble());
        }
    }
}

result

このライブラリExpressEditionでも最大8コア, 8GBRAM想定のマルチスレッド対応しており、線形計画法以外に非線形の問題にも対応している模様。再頒布可能パッケージはなく、大学や研究者向けのようですが企業でもExcelアドインとして使えるので評価解析ソフトとして組込む価値があるかと思います。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中