我对数值分析很感兴趣。我一直在使用DotNumerics开源应用程序。我的线性系统如下:
1 * x + 3 * y <= 150
2 * x + 1 * y <= 100
其中x >= 0, y >= 0
z = 10 * x + 15 * y
我正在尝试解决z
(优化......)
I can use Simplex method to solve above problem as found in this link。我也通过电子邮件发送了作者,但他没有回复。
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;
}
}
}
答案 0 :(得分:7)
我不认为DotNumerics可以自己解决LP问题。据我解释文档,实现的Nelder–Mead(下坡单纯形法)仅用于解决简单的最小化问题,而不是LP问题。
我最后一次在c#中解决了LP,我使用.net包装器来LP_Solve。
如果您下载了lpsolve软件包,它应该附带一个.net示例。您也可以将其插入microsoft solver foundation(see here),但我认为MSF存在一些许可问题,您无法将其自由地用于商业应用。但是,MSF可能也很有趣。
同样,你可以简单地使用没有MSF的lpsolve。 Lpsolve是一个非常好的LP求解器,除非你有大量的问题。然后,至少可以考虑替代方案并比较性能/适应性来解决您的特定问题。