7

我对数值分析很感兴趣。我一直在使用 DotNumerics 开源应用程序。我的线性系统如下:

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

在哪里x >= 0, y >= 0

z = 10 * x + 15 * y

我正在尝试解决z(优化...)

我可以使用 Simplex 方法来解决此链接中的上述问题。我也给作者发了邮件,但他没有回复。

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 问题。就我对文档的解释而言,实现的Nelder-Mead(下坡单纯形法)仅用于解决简单的最小化问题,而不是 LP 问题。

上次我在 c# 中解决 LP 时,我使用了 .net 包装器到LP_Solve

如果你下载 lpsolve 包,它应该带有一个 .net 的例子。你也可以将它插入微软求解器基础见这里),但我认为 MSF 存在一些许可问题,你不能自由地将它用于商业应用程序。但是,无国界医生可能也很有趣。

同样,您可以在没有 MSF 的情况下简单地使用 lpsolve。Lpsolve 是一个相当不错的 LP 求解器,除非你有大规模的问题。然后,至少有必要寻找替代方案并将性能/适应性与您的特定问题进行比较。

于 2011-05-18T18:39:56.867 回答