.NET / C#的线性编程库

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

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

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

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

ALGLIB是线性求解器等常用的库。 在绝望之前我会好好看看。

如果您正在为.NET开发(即不是Windowsapp store,Windows Phone或Silverlight),那么我肯定会建议您查看适用于大型LP和/或MILP问题的lpsolve 。 下载包含相应lpsolve DLL的x86或x64开发档案:s,然后下载包含C#文件的.NET API存档,其中P / Invoke调用lpsolve API中的所有相关函数。

另一种方法是通过CoinMP预编译二进制文件使用COIN-OR项目中的CLP求解器。 这里有一个C#包装器DLL。

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

快速的Internet搜索还揭示了Simplex LP算法的纯C#实现。 我无法识别作者,我不知道这个实现是正确的还是任何质量的。 即使在Windows Store,Windows Phone,Silverlight和Mono上下文中,代码看起来也非常便携。

线性编程旨在完全按照您的要求进行。 多变量约束在线性编程中是绝对正常的。 寻找免费解决方案,如lpsolve( http://sourceforge.net/projects/lpsolve/ ),glpk( http://www.gnu.org/software/glpk/ )或CBC( https://projects.coin-or .org / Cbc )例如。

我接受上述建议不在C#中,也没有管理.net程序集开箱即用。 如果这对您来说是一个交易破坏者,那么也许您可以尝试从其中一个库的源代码自己构建一个版本。 可能需要相当多的工作 – 我还没有尝试过。

从您的原始问题中还不清楚您要解决的问题有多大或多复杂。 如果你有必须采用离散值的变量,那么你需要一个可以进行分支和绑定的求解器库,否则如果它纯粹是线性的和连续的,那么你可以使用单纯形算法。 如果你找不到预制的版本,那就在很多教科书中。

如果它是一个非常小的问题(数十个变量和约束)或者只是线性和连续的那么你可能能够使用自己的新的(可移植的,纯托管代码)实现,但如果你有数以千计的约束和变量,可能很难获得所需的性能。 如果您遇到大而复杂的问题,可能会因为您需要商业解算器来获得所需的答案而失去运气。

没人提到求解者基础 。 这是一个不错的选择。