如何使用DotNumerics解决线性编程问题?

lok*_*oki 7 .net c# numerical-methods

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

1 * x + 3 * y <= 150
2 * x + 1 * y <= 100
Run Code Online (Sandbox Code Playgroud)

哪里 x >= 0, y >= 0

z = 10 * x + 15 * y
Run Code Online (Sandbox Code Playgroud)

我想解决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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ehn 7

我不认为DotNumerics可以自己解决LP问题.据我解释文档,实现的Nelder-Mead(下坡单纯形法)仅用于解决简单的最小化问题,而不是LP问题.

我最后一次在c#中解决了LP,我在LP_Solve中使用了一个.net包装器.

如果您下载了lpsolve软件包,它应该附带一个.net示例.您也可以将其插入微软求解器基础(参见此处),但我认为MSF存在一些许可问题,您无法将其自由地用于商业应用.但是,MSF可能也很有趣.

同样,您可以简单地使用没有MSF的lpsolve.Lpsolve是一个非常好的LP求解器,除非你有大量的问题.然后,至少可以考虑替代方案并比较性能/适应性来解决您的特定问题.