7

数値解析にとても興味があります。私はDotNumericsオープンソースアプリケーションを使用しています。私の線形システムは次のとおりです。

1 * x + 3 * y <= 150
2 * x + 1 * y <= 100

どこx >= 0, y >= 0

z = 10 * x + 15 * y

私は解決しようとしていzます(最適化...)

このリンクにあるように、シンプレックス法を使用して上記の問題を解決できます。著者にもメールを送りましたが、返信はありません。

using DotNumerics.Optimization;
using DotNumerics;

namespace App.SimplexCalcLinearProgramming
{
    class Program
    {
        static void Main(string[] args)
        {
            Simplex simplex = new Simplex();
            double[] initialGuess = new double[2];
            initialGuess[0] = 0.1;
            initialGuess[1] = 2;
            double[] minimum = simplex.ComputeMin(AmacFunction, initialGuess);
            minimum.ToList().ForEach(q => Console.Write(q.ToString() + "\n"));
           Console.ReadKey();
        }

        static double AmacFunction(double[] x)
        {
            /*
             * 1 * x + 3 * y <= 150
             * 2 * x + 1 * y <= 100
             *
             * where x >= 0, y >= 0
             *
             * z = 10 * x + 15 * y
             *
             * Solve for z
             */
            double f = 0;
            f = 10*x[0]+15*x[1];
            return f;
        }
    }
}
4

1 に答える 1

7

DotNumericsだけでLPの問題を解決できるとは思いません。ドキュメントを解釈する限り、実装されたネルダーミード(下り坂シンプレックス法)は、LP問題ではなく、単純な最小化問題を解決するためにのみ使用されます。

前回c#でLPを解決したときは、LP_Solveに.netラッパーを使用しました。

lpsolveパッケージをダウンロードすると、.netの例が付属しているはずです。マイクロソフトソルバーファンデーションにプラグインすることもできますが(ここを参照)、MSFにはライセンスの問題がいくつかあり、商用アプリケーションに自由に使用することはできないと思います。しかし、それでも、MSFもチェックアウトするのが面白いかもしれません。

ここでも、MSFなしでlpsolveを使用できます。Lpsolveは、サイズに大きな問題がない限り、かなり優れたLPソルバーです。次に、少なくとも代替案を探して、パフォーマンス/適応性を特定の問題と比較する価値があるかもしれません。

于 2011-05-18T18:39:56.867 に答える