运筹优化算法常用求解器

一、运筹优化求解器

运筹学从形成到发展,在此过程中积累的大量理论和方法在国防、能源、制造、交通、金融、通信等各个领域发挥着越来越重要的作用。我们在生产生活中遇到的很多实际问题,都可以通过运筹学所涉及的优化方法对其进行数学建模,表示为数学问题,而为了解决这些数学问题,求解器应运而生。

目前市面上的主流优化求解器主要分为商用求解器(比如Gurobi、IBM Cplex等)、开源求解器(比如SCIP等)两大类。此外还有一些商业计算软件比如Matlab,甚至是常用的Excel表格中都包含有求解器工具,可以求解部分规模较小的数学规划问题,不过求解效率和商用求解器相比还是有一定差距。

商用求解器

Gurobi

Gurobi是由美国 Gurobi Optimization 公司开发新一代大规模求解器。在全球最著名的专业求解器评比网站 Decision Tree for Optimization Software (http://plato.asu.edu/bench.html) 中,Gurobi 展示出更快的求解速度和精度。Gurobi 全球用户超过2600家,广泛应用在金融、物流、制造、航空、石油石化、商业服务等多个领域。

技术优势:

  • 可以求解大规模线性问题,二次型问题和混合整数线性和二次型问题
  • 支持非凸目标和非凸约束的二次优化
  • 支持多目标优化
  • 支持包括SUM, MAX, MIN, AND, OR等广义约束和逻辑约束
  • 支持包括高阶多项式、指数、三角函数等的广义函数约束
  • 问题尺度只受限制于计算机内存容量,不对变量数量和约束数量有限制
  • 采用最新优化技术,充分利用多核处理器优势。支持并行计算
  • 提供了方便轻巧的接口,支持 C++, Java, Python, .Net, Matlab 和R,内存消耗少
  • 支持多种平台,包括 Windows, Linux, Mac OS X

支持模型:

  • 连续和混合整数线性问题
  • 凸目标或约束连续和混合整数二次问题
  • 非凸目标或约束连续和混合整数二次问题
  • 含有对数、指数、三角函数、高阶多项式目标或约束,以及任何形式的分段约束的非线性问题
  • 含有绝对值、最大值、最小值、逻辑与或非目标或约束的非线性问题

支持接口语言: C++, Java, Python, .Net, Matlab 和R

IBM CPLEX Optimizer

CPLEX历史悠久,最初版本在1988年就被开发出来,1997年被ILOG公司收购,2009年纳入IBM怀抱,如今已发展成为IBM决策优化系统IBM ILOG CPLEX Optimization Studio(简称COS)。作为COS系统中的关键组件,CPLEX Optimizer 为线性规划、混合整数规划、二次规划和二次约束规划问题提供灵活的高性能数学规划求解器。 这些求解器包括用于混合整数规划的分布式并行算法,支持利用多台计算机来解决难题。

支持模型:

  • 专门用于求解大规模的线性规划(LP)
  • 二次规划(QP)
  • 带约束的二次规划(QCQP)
  • 二阶锥规划(SOCP)等四类基本问题
  • 以及相应的混合整数规划(MIP)问题。

支持接口语言: C, C++, Java, C# or Python APIs

FICO Xpress

管网:https://www.fico.com/en/products/fico-xpress-optimization
Xpress 于 1983 年发布,是第一个在PC上运行的商业LP和MIP求解器。1992年,发布了并行计算的Xpress版本,五年后扩展到分布式计算。2008 年被FICO收购。Xpress 是第一个通过在 2010 年引入 64 位索引而跨越十亿决策变量阈值的 MIP 求解器。自 2014 年以来,Xpress 首次实现了并行对偶单纯形方法的商业实现。Xpress 包括其建模语言 Xpress Mosel和集成开发环境 Xpress Workbench。Mosel 包含分布式计算功能,可并行解决优化问题的多个场景。输入数据的不确定性可以通过稳健的优化方法来处理。
支持接口语言:.NET、Java、C、C++、VB、Python、Matlab、Solver API、Mosel API、BCL

Lingo

LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的专门用于求解最优化问题的软件包。其特色在于内置建模语言,提供许多常用函数方便使用者建立优化模型时调用,并提供与其他数据文件(如文本、EXCEL、数据库等)的接口,易于方便地输入、求解和分析大规模最优化问题。

杉数COPT

杉数求解器COPT(Cardinal Optimizer),是杉数自主研发的针对大规模优化问题的高效数学规划求解器套件,也是支撑杉数端到端供应链平台的核心组件。COPT是目前同时具备大规模混合整数规划、线性规划(单纯形法和内点法)、二阶锥规划、半定规划以及凸二次规划和凸二次约束规划问题求解能力的综合性能数学规划求解器,为企业应对高性能求解的需求提供了更多选择。
支持接口语言:C、C++、C#、Python、Julia、Java、AMPL、GAMS、Pyomo、PuLP、CVXPY等。

阿里MindOPT

MindOpt是阿里达摩院决策智能实验室自主研发的一款具备线性规划等多种功能的数学规划求解器套件。通过对大规模线性规划的快速稳定求解,为客户提供从数据到决策的全链路建模和求解能力。目前已应用于云计算等多项阿里业务,通过对弹性计算资源的调度优化,每年可为阿里云节约数亿元成本。

华为天筹AI求解器OPTV

天筹(OptVerse)AI求解器将运筹学和AI相结合,突破业界运筹优化极限,针对线性和整数模型寻找最优解,以通用形式描述问题,高效计算最优方案,助力企业量化决策和精细化运营,提升资源利用率和运转效率,增强决策水平和竞争力。

天筹(OptVerse)AI求解器已成功支撑华为供应能力及冗余分析等13个场景的模拟应用,计划预案周期从周缩短到天,保障了高效的连续性作战。

开源求解器

SCIP

SCIP是目前混合整数规划(MIP)和混合整数非线性规划(MINLP)最快的非商业求解器之一。SCIP也是一个用于约束整数规划、分支定界以及分支定价的框架[CCZ1] ,主要由德国ZIB研究所开发。与大多数商业求解器不同,SCIP 允许用户对求解过程进行完全控制,并允许用户访问求解器内部的详细信息。

谷歌 OR-Tools

官网:https://developers.google.cn/op
OR-Tools是一款谷歌旗下的开源优化工具。支持线性规划、整数规划,可以方便的求解Routing、Bin packing、Network flows、Assignment、Scheduling等问题。

Coin-OR开源项目套件 CLP/CBC/CGL/SYMPHONY等

COIN-OR (Computational Infrastructure for Operations Research) 是运筹和优化圈维护开源基础软件和项目的著名基金会,是一个公益组织,维护着市面上几乎所有的开源优化求解器,包括cbc, clp, ipopt, pyomo等数十种求解器和建模语言,并且使得它们之间的交互变得可能。可以说 COIN-OR 在开源求解器方面占有举足轻重的位置。目前所有项目都托管在 GitHub 上(https://github.com/coin-or),仅一些原有的基础设施(网站、wiki 和邮件列表)仍然托管在 Clemson 大学的服务器上。

COIN-OR 项目维护的诸多开源求解器和建模工具现在仍被全球数千个组织使用,其中值得注意的是Cbc、Clp、Ipopt这三个求解器在各自的领域中仍然处于十分领先的地位(线性规划、混合整数规划和非线性规划)。

LP_sovle

LP_solve是一个混合整数线性规划(MILP)求解器,来自sourceforge下的一个开源项目,是一个基于修正单纯形法和分支定界法的免费线性(整数)规划求解器,能够求解纯线性、(混合)整数/二进制、半连续和特殊有序集(SOS)模型。
支持模型:纯线性、(混合)整数/二进制、半连续和特殊有序集(SOS)模型
支持接口语言:C/C++、Java、Delphi、Free Pascal、VB、VBScript、http://VB.NET、C#.NET
官网:https://lpsolve.sourceforge.net/5.5/

GLPK

GLPK (GNU Linear Programming Kit,GNU线性编程工具)是GNU下的一个项目,用于建立大规模线性规划LP和混合型整数规划MIP问题,并对模型进行最优化求解。由于是GNU下的项目,因此没有商业非商业的版本限制,可以自由使用。
官网:https://www.gnu.org/software/glpk/g

中科院CMIP混合整数求解器

著名陈省身数学奖获得者、冯康科学计算奖获得者、中国科学院数学与系统科学院戴彧虹研究员带领CMIP团队从2015年开始,历经30个月,终于自主研发了我国第一个具有国际水平的整数规划求解器CMIP,并于2018年3月确定版本为CMIP 1.0版本。

CMIP代码总量已经超过五万行,涵盖国际现有求解器预处理、启发式、割平面、分支、节点选择、区域传播等各种功能模块,并已经较好地具备了求解大规模整数规划的能力。

CVXPY

CVXPY 不是一个求解器,而是一个 Python 库,用于构建和求解凸优化问题。它提供了一个高层次的接口,使得用户可以使用简洁的 Python 代码来描述优化问题,而不必担心底层的数学细节。CVXPY 旨在让凸优化问题的建模变得更加直观和方便。

CVXPY 本身不解决优化问题,而是将问题转换成标准形式,并调用底层的数学优化求解器来找到解。它支持多种求解器,包括 ECOS、SCS、OSQP、CPLEX、Gurobi、MOSEK 等,这些求解器可以处理线性规划、二次规划、锥规划、半定规划等多种类型的凸优化问题。

CVXPY 的主要特点包括:

  • 用户友好:通过提供简单的 Python 接口,使得构建和求解优化问题更加容易。
  • 灵活性:支持多种类型的凸优化问题,包括线性规划、二次规划、锥规划等。
  • 强大的抽象:允许用户以数学上直观的方式表达问题,而不必担心将问题转换成求解器可以处理的形式。
  • 自动微分:自动计算梯度和 Hessian 矩阵,这对于某些优化算法是必需的。
  • 求解器独立性:用户可以选择最适合他们问题的求解器,而不必更改问题的表述。
    CVXPY 通常用于研究和教学中,以及在工业界解决实际的优化问题。它特别适合于那些需要快速原型设计和实验不同优化模型的场景。

使用 CVXPY 的一个简单例子是构建一个线性规划问题:

import cvxpy as cp

# 创建优化变量
x = cp.Variable()
y = cp.Variable()

# 定义目标函数
objective = cp.Maximize(2*x + y)

# 定义约束条件
constraints = [x + y <= 1,
               x - y >= 1,
               x <= 2,
               y <= 3,
               x >= 0,
               y >= 0]

# 定义优化问题
prob = cp.Problem(objective, constraints)

# 求解优化问题
prob.solve()

# 输出结果
print(f"The optimal value is: {prob.value}")
print(f"A solution x, y is: {x.value}, {y.value}")

在这个例子中,我们定义了一个线性规划问题,目标是最大化函数 2*x + y,同时满足一系列线性约束。CVXPY 会自动选择一个合适的求解器来求解这个问题,并返回最优值和解。

二、SMT求解器(Satisfiability Modulo Theories)

可以用来检查线性规划问题的可行性,但不适合用来解决寻找最优解的线性规划问题。

Z3约束求解器

微软Z3求解器是一个高性能的定理证明器,它由微软研究院开发。Z3主要用于软件验证和静态分析领域,它可以帮助开发者检查程序代码中的逻辑错误,证明数学定理,以及解决约束满足问题(Constraint Satisfaction Problems, CSPs)。

Z3是一个SMT(Satisfiability Modulo Theories)求解器,它支持多种理论,包括但不限于算术、位向量、数组、字符串和有限域。Z3的输入通常是SMT-LIB格式的文本文件,这是一种标准的SMT问题描述语言。

Z3求解器具有以下特点:

  • 多语言绑定:Z3提供了多种编程语言的API,包括C, C++, Python, .NET, Java等,方便开发者在不同的编程环境中使用。
  • 高性能:Z3在性能上进行了大量优化,能够快速处理复杂的SMT问题。
  • 易于集成:Z3可以作为一个库被集成到其他软件工具中,以提供自动化的定理证明能力。
  • 开源:Z3在MIT许可证下开源,任何人都可以自由地使用和修改它。
  • 广泛应用:Z3被广泛应用于软件工程、形式化方法、安全性分析、系统验证等多个领域。

Z3的使用通常涉及到编写SMT-LIB格式的问题描述,然后调用Z3求解器来求解这些问题。此外,通过编程语言的API,开发者可以直接在代码中构建和求解问题,这为自动化验证和分析提供了极大的便利。

如果你想要使用Z3求解器,可以从其GitHub页面下载源代码或预编译的二进制文件,并根据文档进行安装和使用。

Z3求解器更多地被用于逻辑和形式化验证的领域,而CPLEX和Gurobi则是在数学优化领域更为常见。Z3解决的是逻辑一致性问题,而CPLEX和Gurobi解决的是寻找最优解的问题。Z3可以用来检查线性规划问题的可行性,但不适合用来解决寻找最优解的线性规划问题。

CVC5求解器

CVC5 是一个开源的自动定理证明器,它是 CVC(Cooperating Validity Checker)系列工具的最新版本。CVC5 是一个 SMT(Satisfiability Modulo Theories)求解器,用于决定逻辑公式在给定一组背景理论(如整数和实数算术、位向量、数组、字符串等)下的可满足性问题。CVC5 的前身是 CVC4,它本身是 CVC3 的后续版本,而 CVC3 又是 CVC 和 CVC Lite 的继承者。

CVC5 被设计用来支持自动化推理任务,它可以处理各种复杂的逻辑公式,并在多个领域中得到应用,包括软件和硬件验证、形式化方法、安全性分析、程序分析等。CVC5 的目标是提供一个高性能、可扩展、易于使用的求解器,它可以作为一个独立的工具使用,也可以集成到其他系统中。

CVC5 的主要特点包括:

支持多种理论:包括但不限于线性和非线性算术、位向量、数组、字符串、枚举类型等。
高性能:CVC5 在多个国际竞赛中展现了其性能,包括 SMT-COMP 和 CASC。
易于集成:提供了多种编程语言的 API,包括 C++、Python 和 Java。
开源:CVC5 在开源许可证下发布,允许用户自由使用和修改。
CVC5 与其他 SMT 求解器(如 Z3)类似,但每个求解器都有其独特的特性和优化,可能在不同的问题类型或领域中表现更好。选择哪个求解器通常取决于具体的应用需求和个人偏好。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 凸优化是一类重要的数学优化问题,它具有许多实际应用价值。MATLAB是一种常用的科学计算和数据分析软件工具,提供了丰富的优化算法和函数库,可以用于解决凸优化问题。 MATLAB中凸优化算法的实现有两种常用方式:内置函数和自定义算法。 首先,MATLAB提供了内置的凸优化函数,例如fmincon、linprog和quadprog等,这些函数能够很方便地求解一般的凸优化问题。用户只需要根据具体问题设定目标函数、约束条件和变量的上下界,然后调用相应的函数即可获得最优解。 其次,对于特定的凸优化问题,可以自定义算法进行求解。MATLAB中常用的凸优化算法有:梯度下降法、共轭梯度法、牛顿法、内点法等。这些算法通常需要根据实际问题进行调整和优化,比如设置步长、迭代次数等参数。 在使用MATLAB进行凸优化算法时,需要注意以下几点: 1. 确定优化问题的目标函数、约束条件和变量范围; 2. 选择合适的凸优化算法,例如使用fmincon函数求解约束优化问题; 3. 检查算法的收敛性和精度,确保求解结果的正确性; 4. 对于大规模的凸优化问题,可能需要考虑分布式计算、并行计算等技术,以提高求解效率。 总之,MATLAB提供了丰富的凸优化算法和函数库,能够很方便地用于求解凸优化问题。根据具体问题的特点和求解需求,可以选择合适的内置函数或自定义算法进行求解。 ### 回答2: 凸优化是指在给定约束条件下,寻找目标函数的最小值的问题。这类问题的特点是约束条件是线性的,目标函数是凸函数。在数学和工程领域有着广泛的应用,如经济学、运筹学、信号处理等。 Matlab中提供了多种凸优化算法的工具箱,如CVX、YALMIP等。这些工具箱可以方便地调用已经实现好的算法,简化了凸优化问题的建模和求解过程。 在使用Matlab进行凸优化算法时,首先需要用数学语言描述问题,包括目标函数和约束条件。然后,利用工具箱提供的函数进行建模。根据问题的特点选择合适的凸优化算法,如内点法、梯度法等。最后,使用相关的函数进行求解,并得到问题的最优解。 凸优化算法的核心是迭代求解过程,即利用当前解来生成下一个解。迭代的终止条件可以是达到一定的精度要求或经过固定次数的迭代。每次迭代中,根据当前解计算目标函数和约束条件的梯度,并更新解,直到满足终止条件为止。 凸优化算法的性能和求解效率与问题的规模和复杂度有关。通常情况下,凸优化问题可以在多项式时间内求解。但对于大规模和复杂的问题,可能需要使用更高级的算法或使用分布式计算平台进行求解。 总之,凸优化算法求解目标函数最小值的有力工具,Matlab提供了丰富的函数和工具箱来支持凸优化问题的建模和求解,使得复杂问题的求解更加简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值