用于.net / c#的线性编程库

本文关键字:线性 编程 net 用于 | 更新日期: 2023-09-27 18:12:45

我需要解决一个欠定的线性方程组和约束,然后找到最小化成本函数的特解。这需要在纯可移植的托管代码中完成,这些代码将在。net和Mono中运行。我可以使用哪些免费的库来实现这一点?

我发现免费库提供的所有优化算法只支持单变量的区间约束,例如0 < x < 1,而不支持x + 2y < 4这样的约束。我还发现,线性方程求解器通常只支持具有一个解的线性系统。

到目前为止,我发现最接近的是DotNumerics,它包括用于解决欠确定线性系统的奇异值分解,但它的优化算法只支持单变量约束(据我所知)。

关于线性规划还有其他几个问题,但我的主要要求是多变量约束和求解欠定系统。我还没有找到一个支持多变量约束的免费库。

用于.net / c#的线性编程库

如果你正在为。net开发(即不是Windows Store, Windows Phone或Silverlight),那么我绝对建议你看看lpsolve,它适用于大型LP和/或MILP问题。下载包含各自的lpsolve DLL的x86或x64开发存档,然后下载包含c#文件的. net API存档,其中包含对lpsolve API中所有相关函数的P/Invoke调用。

另一种选择是使用来自COIN-OR项目的CLP解算器,通过CoinMP预编译的二进制文件。这里有一个c#包装器DLL。

如果您确实需要纯托管代码,那么ALGLIB可能是您最好的选择(正如上面Marc Gravell建议的那样),但是要注意,ALGLIB开源许可证使用GPL。如果您希望在自己的代码中使用ALGLIB,而不向开源社区透露它,则需要购买商业ALGLIB许可证。

在网上快速搜索一下,也可以看到Simplex LP算法的纯c#实现。我无法识别作者,也不知道这个实现是否正确或质量如何。尽管如此,即使在Windows Store、Windows Phone、Silverlight和Mono环境中,代码似乎也具有很高的可移植性。

ALGLIB是像线性求解器这样的东西的常用库。我会在绝望之前好好看看。

线性规划的目的就是做你想做的事情。多变量约束在线性规划中是绝对正常的。查找免费求解器,例如lpsolve (http://sourceforge.net/projects/lpsolve/)、glpk (http://www.gnu.org/software/glpk/)或CBC (https://projects.coin-or.org/Cbc)。

我接受上面的建议不是在c#中,也不是开箱即用的托管。net程序集。如果这对您来说是一个问题,那么也许您可以尝试从这些库之一的源代码中构建一个版本。可能需要相当多的工作,但我还没有尝试过。

从你最初的问题中也不清楚你试图解决的问题有多大或有多复杂。如果你的变量必须取离散值,那么你就需要一个求解器库来做分支定界或类似的事情,否则如果它是纯线性和连续的那么你就可以使用单纯形算法。如果你找不到预构建的版本,它在很多教科书中都有。

如果它是一个非常小的问题(几十个变量和约束)或者只是线性和连续的,那么你可能能够摆脱你自己的新(可移植的,纯托管代码)实现,但如果你有成千上万的约束和变量,你可能很难得到你需要的性能。如果你有一个大而复杂的问题,你可能就不那么幸运了,因为你可能需要一个商业求解器来得到你需要的答案。

没有人提到求解器基础。