9

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

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

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

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

4

4 回答 4

12

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

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

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

快速的 Internet 搜索还显示了 Simplex LP 算法的纯 C#实现。我无法识别作者,我不知道这个实现是否正确或任何质量。不过,即使在 Windows 应用商店、Windows Phone、Silverlight 和 Mono 上下文中,代码看起来确实具有很高的可移植性。

于 2013-05-09T17:28:24.853 回答
7

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

于 2013-05-09T15:38:18.397 回答
4

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

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

从您最初的问题中也不清楚您要解决的问题有多大或有多复杂。如果您有必须采用离散值的变量,那么您将需要一个求解器库来执行分支定界或类似操作,否则如果它是纯线性和连续的,那么您可以只使用单纯形算法。如果您找不到预建版本,它会出现在很多教科书中。

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

于 2013-05-09T16:02:01.320 回答
1

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

于 2014-05-02T12:12:37.897 回答