CVXPY(官网地址:https://www.cvxpy.org/)是一个用于构建和求解凸优化问题的 Python 库。它提供了一种直观且灵活的方式来定义和解决各种优化问题,包括线性规划、二次规划、半定规划、混合整数规划等。CVXPY 的设计目标是使用户能够以数学上自然的方式来表达优化问题,而不需要深入了解底层的求解算法。以下是 CVXPY 的一些关键特性和功能:
- 直观的语法:CVXPY 允许用户使用数学表达式来定义目标函数和约束条件,使得问题的定义更加直观和易于理解。
- 广泛的支持:CVXPY 支持多种类型的优化问题,包括但不限于:
- 线性规划(LP)
- 二次规划(QP)
- 二次约束二次规划(QCQP)
- 半定规划(SDP)
- 混合整数规划(MIP)
- 自动求解器选择:CVXPY 可以自动选择合适的求解器来解决优化问题,用户也可以手动指定求解器。
- 与其他库的集成:CVXPY 可以与其他科学计算库(如 NumPy、SciPy)无缝集成,方便进行数据处理和分析。
- 支持约束的多样性:CVXPY 支持多种类型的约束,包括线性约束、二次约束、锥约束等。
实际上,CVXPY在各种求解器之上又进行了一层封装,使其语法更加直观,CVXPY 依赖于底层的求解器来实际解决优化问题。虽然 CVXPY 自身是免费的,但某些高性能的商业求解器(如 CPLEX 和 Gurobi)是需要购买许可证才能使用的。CVXPY 支持多种求解器,包括一些免费的开源求解器和一些商业求解器。求解问题时,指定使用 ECOS 求解器:
import cvxpy as cp# 定义变量
x = cp.Variable()
y = cp.Variable()# 定义目标函数
objective = cp.Minimize((x - 1)**2 + (y - 2)**2)# 定义约束条件
constraints = [x + y == 1, x - y >= 1]# 构建问题
problem = cp.Problem(objective, constraints)# 求解问题,指定使用 ECOS 求解器
problem.solve(solver=cp.ECOS)# 输出结果
print("Optimal value:", problem.value)
print("Optimal x:", x.value)
print("Optimal y:", y.value)
开源求解器:
- ECOS:适用于二次锥规划(SOCP)问题,开源且免费。
- SCS:适用于锥规划问题,开源且免费。
- OSQP:适用于二次规划(QP)问题,开源且免费。
- GLPK:适用于线性规划(LP)和混合整数规划(MIP)问题,开源且免费。
商业求解器:
- CPLEX:适用于线性规划、二次规划和混合整数规划等问题,需要购买许可证。
- Gurobi:适用于线性规划、二次规划和混合整数规划等问题,需要购买许可证。
- MOSEK:适用于线性规划、二次规划、二次锥规划等问题,需要购买许可证。
如果选择使用免费的开源求解器,那么可以完全免费地使用 CVXPY 及其求解功能。如果使用商业求解器(如 CPLEX 或 Gurobi),则需要购买相应的许可证。
定义决策变量
定义一个决策变量:
import cvxpy as cp# 定义一个标量变量 x
x = cp.Variable()
向量变量:
import cvxpy as cp# 定义一个长度为 n 的向量变量 x
n = 5
x = cp.Variable(n)
矩阵变量:
import cvxpy as cp# 定义一个 m 行 n 列的矩阵变量 X
m = 3
n = 4
X = cp.Variable((m, n))
带约束的变量:
import cvxpy as cp# 定义一个非负的标量变量 x
x = cp.Variable(nonneg=True)# 定义一个非负的向量变量 x
n = 5
x = cp.Variable(n, nonneg=True)# 定义一个对称矩阵变量 X
m = 3
X = cp.Variable((m, m), symmetric=True)
整数变量(注意:CVXPY对整数变量的支持有限,通常用于混合整数规划问题):
import cvxpy as cp# 定义一个整数标量变量 x
x = cp.Variable(integer=True)# 定义一个整数向量变量 x
n = 5
x = cp.Variable(n, integer=True)
布尔变量:
import cvxpy as cp# 定义一个布尔标量变量 x
x = cp.Variable(boolean=True)# 定义一个布尔向量变量 x
n = 5
x = cp.Variable(n, boolean=True)
CVXPY 来定义和求解一个优化问题:
目标是最小化 ( x − 1 ) 2 + ( y − 2 ) 2 (x - 1)^2 + (y - 2)^2 (x−1)2+(y−2)2,并且有两个约束条件 x + y = 1 x + y = 1 x+y=1和 x − y ≥ 1 x - y \geq 1 x−y≥1
import cvxpy as cp# 定义变量
x = cp.Variable()
y = cp.Variable()# 定义目标函数
objective = cp.Minimize((x - 1)**2 + (y - 2)**2)# 定义约束条件
constraints = [x + y == 1, x - y >= 1]# 构建问题
problem = cp.Problem(objective, constraints)# 求解问题
problem.solve()# 输出结果
print("Optimal value:", problem.value)
print("Optimal x:", x.value)
print("Optimal y:", y.value)
Box Constraint,边界约束优化问题
这个简短的脚本是 CVXPY 功能的一个基本示例。除了凸规划之外,CVXPY 还支持几何规划的推广、混合整数凸规划和拟凸规划。