有很多求和的线性规划的方便求解器吗?

计算科学 优化
2021-12-11 00:47:49

如何以最简单的方式解决以下线性规划问题?

求和项如何在其中建模?

来自数学编程方法的第 187 页

来自Charu Chandra 和 Janis Grabis的数学编程方法第 187 页。

4个回答

任何线性规划 (LP) 都可以通过各种免费提供的软件求解。sigma 符号可以转换为线性代数符号,这是 LP 求解器所期望的,除非您使用更高级的优化设计框架。您询问了 MATLAB,它在其优化工具箱中包含一个线性规划求解器,可在单独的许可下使用。Ax=b

您可能对CVX感兴趣,这是一个免费提供的 MATLAB 工具箱,可以解决更一般的优化问题中的 LP。

如果您想追求完全开源的路线,我知道的两个最佳选择是CLPGLPK如果你有 MATLAB,我建议从 CVX 开始。

我大体上同意 Aron 的回答。

根据您使用的建模软件,矩阵符号Ax=b可能比 sigma 符号更方便或更不方便。例如,对于 CPLEX、CLP、CBC开放求解器接口 (OSI)的 C++ 接口,线性代数符号肯定更容易使用,因为这些接口特别要求您在(或多或少) Ax=b的形式(这些接口稍微灵活一些)。

但是,某些软件包将定义线性程序视为更具声明性的过程。示例包括GAMS以及 Python 包PuLPCoopr这些包专注于使定义 LP 的过程看起来更像许多问题中使用的求和(或 sigma)符号。当然,可以强制在其中一个包中编码的问题看起来像Ax=b,但是如果您觉得它很麻烦,就不必使用这种表示法了。此外,这些软件包没有设置为独立求解器,因此更有可能具有与多个求解器的接口,从而提高了实施的灵活性(因为求解器的速度各不相同)和分发(并非每个人都有闭源求解器的许可证) )。

出于这些原因,我建议按优先顺序递减:

  • PuLP,因为它易于使用、轻量级、开源并且在 Python 中
  • Coopr,因为它是开源的并且在 Python 中(但比 PuLP 更灵活)
  • OSI 因为它是开源的,并且是多个(混合整数)线性编程求解器的接口,但它要求您使用编译语言 (C++),这是一个可用性缺陷,仅适用于 PuLP 和Coopr 可能会耗尽内存或花费太长时间
  • GAMS,因为它易于使用,并且使用类似数学的符号,但它是封闭源代码,试用版只能解决较小的 LP

我只用了大约一天左右的时间就对 PuLP 的了解足以解决小型研究规模的问题。我花了几个星期才掌握了 OSI 进行研究的窍门,因为编译语言需要更多的开发时间;首先是安装问题,然后确保我可以编译示例文件并正确设置 Makefile,最后,用 C++ 编写的程序通常比用 Python 编写的程序长几倍来完成相同的任务。

如果您真的必须使用 MATLAB,Aron 的建议可能是最好的。对于这些,我会将 MATLAB 接口添加到lpsolveLinear Programming with Matlab一书随附的 MATLAB 脚本、MATLAB的CPLEX 工具箱YALMIP 工具箱

其中,YALMIP 工具箱看起来最有前途,因为它是免费和开源的,使用类似于 GAMS、PuLP 和 Coopr 的声明式语法,并且具有多种免费和非自由求解器的接口,可解决多种类型的问题(不仅仅是线性规划)。我还没有使用它,因为我通常在我提到的其他工具中完成我的大部分工作。

您遇到的问题更像是 OR 问题。如我所见,您有一个目标函数和一些约束。IBM ILOG CPLEX Optimization Studio,也称为 CPLEX,是解决此类问题的专业软件。SAS 还进行优化和模拟。希望这个答案有帮助。

请看一下lpsolve

lp_solve 是一个免费的(参见 LGPL 以获得 GNU 较少的通用公共许可证)线性(整数)编程求解器,它基于修正的单纯形法和整数的分支定界法。它包含完整的源代码、示例和手册。lp_solve 求解纯线性、(混合)整数/二进制、半连续和特殊有序集 (SOS) 模型。