前言
cvxpy是解决凸优化问题的,在使用之前要确保目标函数是一个凸优化问题(包括其中的变量范围设置,参数设置等)
CVXPY是什么?
CVXPY是一种可以内置于Python中的模型编程语言,解决凸优化问题。它可以自动转化问题为标准形式,调用解法器,解包结果集
如下代码是使用CVXPY解决一个简单的优化问题:
from cvxpy import *
# Create two scalar optimization variables.
# 在CVXPY中变量有标量(只有数值大小),向量,矩阵。
# 在CVXPY中有常量(见下文的Parameter)
x = Variable() //定义变量x,定义变量y。两个都是标量
y = Variable()
# Create two constraints.
//定义两个约束式
constraints = [x + y == 1,
x - y >= 1]
//优化的目标函数
obj = Minimize(square(x - y))
//把目标函数与约束传进Problem函数中
prob = Problem(obj, constraints)
prob.solve() # Returns the optimal value.
print "status:", prob.status
print "optimal value", prob.value //最优值
print "optimal var", x.value, y.value //x与y的解
status: optimal
optimal value 0.999999999761
optimal var 1.00000000001 -1.19961841702e-11
//状态域被赋予'optimal',说明这个问题被成功解决。
//最优值是针对所有满足约束条件的变量x,y中目标函数的最小值
//prob.solve()返回最优值,同时更新prob.status,prob.value,和所有变量的值。
改变已经创建的问题
Problems是不可改变的,意味着在问题被创建之后它不可被改变。为了改变已有问题的目标或者约束,应该创建一个新的问题
# Replace the objective.//不同的目标函数,相同的约束
prob2 = cvx.Problem(cvx.Maximize(x + y), prob.constraints)
print("optimal value", prob2.solve())
# Replace the constraint (x + y == 1).//不同的约束,相同的目标函数
constraints = [x + y <= 3] + prob.constraints[1:] //注意:此处是列表相加,prob.constraints[1:]取prob的约束集中
//从第二个开始的所有约束。
prob2 = cvx.Problem(prob.objective, constraints)
print("optimal value", prob2.solve())
optimal value 1.0
optimal value 3.00000000006
不可行问题与无边界问题
如果一个问题是不可行问题,这个prob.status将会被设置为’infeasible’,如果问题是无边界的,prob.status=unbounded,变量的值域将不会被更新。
import cvxpy as cvx
x &