CVXPY的作用
与matlab中cvx的工具包类似,用于求解凸优化问题。cvx与cvxpy都是由CIT的Stephen Boyd教授课题组开发。cvx用于matlab的包,cvxpy是用于python的包。下载、安装及学习地址如下: CVX CVXPY
一、CVXPY入门
## 简单例子 ##
import cvxpy as cvx
#定义优化变量
x = cvx.Variable()
y = cvx.Variable()
# 定义约束条件
constraints = [x + y == 1,
x - y >= 1]
# 定义优化问题
obj = cvx.Minimize((x - y)**2)
# 定义优化问题
prob = cvx.Problem(obj, constraints)
#求解问题
prob.solve() #返回最优值
print("status:", prob.status) #求解状态
print("optimal value", prob.value) #目标函数优化值
print("optimal var", x.value, y.value) #优化变量的值,相应变量加.value
#运行结果
status: optimal
optimal value 0.999999999761 #最优值视为 1(计算机精度问题)
optimal var 1.00000000001 -1.19961841702e-11 (x=1,y=0)
# 改变目标函数,利用已定义问题的约束,**问题被定义后,不可改变
prob2 = cvx.Problem(cvx.Maximize(x + y), prob.constraints)
print("optimal value", prob2.solve())
# 改变约束
constraints = [x + y = 1, x = 2]
prob = cvx.Problem(obj, constraints)
# Solve with ECOS.
prob.solve(solver=cvx.ECOS)
print("optimal value with ECOS:", prob.value)
# Solve with ECOS_BB.
prob.solve(solver=cvx.ECOS_BB)
print("optimal value with ECOS_BB:", prob.value)
# Solve with CVXOPT.
prob.solve(solver=cvx.CVXOPT)
print("optimal value with CVXOPT:", prob.value)
# Solve with SCS.
prob.solve(solver=cvx.SCS)
print("optimal value with SCS:", prob.value)
# Solve with GLPK.
prob.solve(solver=cvx.GLPK)
print("optimal value with GLPK:", prob.value)
# Solve with GLPK_MI.
prob.solve(solver=cvx.GLPK_MI)
print("optimal value with GLPK_MI:", prob.value)
# Solve with GUROBI.
prob.solve(solver=cvx.GUROBI)
print("optimal value with GUROBI:", prob.value)
# Solve with MOSEK.
prob.solve(solver=cvx.MOSEK)
print("optimal value with MOSEK:", prob.value)
# Solve with Elemental.
prob.solve(solver=cvx.ELEMENTAL)
print("optimal value with Elemental:", prob.value)
# Solve with CBC.
prob.solve(solver=cvx.CBC)
print("optimal value with CBC:", prob.value)
optimal value with ECOS: 5.99999999551
optimal value with ECOS_BB: 5.99999999551
optimal value with CVXOPT: 6.00000000512
optimal value with SCS: 6.00046055789
optimal value with GLPK: 6.0
optimal value with GLPK_MI: 6.0
optimal value with GUROBI: 6.0
optimal value with MOSEK: 6.0
optimal value with Elemental: 6.0000044085242727
optimal value with CBC: 6.0
//Use the installed_solvers utility function to get a list of the solvers your installation of CVXPY //supports.
print installed_solvers()
['CBC', 'CVXOPT', 'MOSEK', 'GLPK', 'GLPK_MI', 'ECOS_BB', 'ECOS', 'SCS'
变量类型 (Variable)
变量可以是标量、向量以及矩阵
# 标量
a = cvx.Variable()
# 向量
x = cvx.Variable(5)
# 矩阵大小为(5, 1).
x = cvx.Variable((5, 1))
# 矩阵大小为(4, 7).
A = cvx.Variable((4, 7))
cvxpy中可以做常数使用的用: - NumPy ndarrays - NumPy matrices - SciPy sparse matrices
# Solves a bounded least-squares problem.
import cvxpy as cvx
import numpy
# Problem data.
m = 10
n = 5
numpy.random.seed(1)
A = numpy.random.randn(m, n)
b = numpy.random.randn(m)
# Construct the problem.
x = cvx.Variable(n)
objective = cvx.Minimize(cvx.sum_squares(A*x - b))
constraints = [0 |