我需要解决一个欠定的线性方程组和约束系统,然后找到最小化成本函数的特定解决方案。这需要在纯粹可移植的托管代码中完成,该代码将在.NET和Mono中运行。我可以使用哪些免费的库来实现它?
免费库提供的所有优化算法我发现只支持单个变量的区间约束,例如: 0 < x < 1
,而不是像x + 2y < 4
这样的约束。我还发现线性方程求解器通常只支持具有一个解的线性系统。
我到目前为止最接近的是DotNumerics,其中包括用于求解欠定线性系统的奇异值分解,但其优化算法仅支持单变量约束(据我所知)。 / p>
还有其他一些问题涉及线性规划,但我的关键要求是多变量约束和解决欠定系统。我还没有找到一个支持多变量约束的免费库。
答案 0 :(得分:9)
如果您正在为.NET开发(即不是Windows应用商店,Windows Phone或Silverlight),那么我肯定会建议您查看适用于大型LP和/或MILP问题的lpsolve 。下载包含相应 lpsolve DLL的x86或x64开发档案:s,然后使用P / Invoke下载包含C#文件的.NET API存档调用 lpsolve API中的所有相关函数。
另一种方法是使用CLP项目中的COIN-OR解算器,通过CoinMP预编译的二进制文件。有一个C#包装器DLL可用here。
如果你做需要纯托管代码,ALGLIB可能是你最好的选择(正如上面Marc Gravell所建议的那样),但要注意ALGLIB开源许可使用GPL。如果您想在自己的代码中使用ALGLIB而不将其公开给开源社区,则需要购买商业ALGLIB许可证。
快速的互联网搜索还揭示了Simplex LP算法here的纯C#实现。我无法识别作者,我不知道这个实现是正确的还是任何质量的。即使在Windows Store,Windows Phone,Silverlight和Mono上下文中,代码看起来也非常便携。
答案 1 :(得分:6)
ALGLIB是线性求解器等常用的首选库。在绝望之前我会好好看看。
答案 2 :(得分:4)
线性编程旨在完全按照您的要求进行。多变量约束在线性编程中是绝对正常的。例如,寻找像lpsolve(http://sourceforge.net/projects/lpsolve/),glpk(http://www.gnu.org/software/glpk/)或CBC(https://projects.coin-or.org/Cbc)这样的免费解算器。
我接受上述建议不在C#中,也没有管理.net程序集开箱即用。如果这对您来说是一个交易破坏者,那么也许您可以尝试从其中一个库的源代码自己构建一个版本。可能需要相当多的工作 - 我还没有尝试过。
从您的原始问题中还不清楚您要解决的问题有多大或多复杂。如果你有必须采用离散值的变量,那么你需要一个能够进行分支和绑定的解算器库,否则如果它是纯线性和连续的,那么你可以使用单纯形算法。如果你找不到预建的版本,它会出现在很多教科书中。
如果它是一个非常小的问题(数十个变量和约束)或者只是线性和连续的那么你可能能够使用自己的新的(可移植的,纯托管代码)实现,但是如果你有数以千计的约束和变量,您可能很难获得所需的性能。如果您遇到大而复杂的问题,可能会因为您需要商业解决方案来获得所需的答案而失去运气。
答案 3 :(得分:1)
没有人提到solver foundation。这是一个不错的选择。