运筹系列35:凸优化接口cvxpy

1. 凸优化问题

1.1 QP问题

目标函数二阶,约束一阶,称为Quadratic programming
在这里插入图片描述

1.2. QCQP

目标二阶,约束二阶,Quadratical Constraint Quadratic Programming。
在这里插入图片描述

1.3. SOCP

second order cone program,本质上还是一个QP问题(约束条件进行平方)。
在这里插入图片描述

1.4 DCP

一个问题能够由目标函数和一系列约束构造。如果问题遵从DCP规则,这个问题将是凸的,能够被cvxpy解决。DCP规则要求目标函数有以下两种形式:

Minimize(convex)
Maximize(concave)
在DCP规则下的有效约束为:
affine == affine
convex <= concave
concave >= convex
你能调用object.is_dcp()来检查一个问题、约束、目标函数是否满足DCP规则。

2. Cvxpy介绍

CVXPY是一种可以内置于Python中的模型编程语言,解决凸优化问题。它可以自动转化问题为标准形式,调用解法器,解包结果集。下面是个简单的例子:

from cvxpy import *
x = Variable()
y = Variable()
constraints = [x + y == 1,
              x - y >= 1]
obj = Minimize(square(x - y))
prob = Problem(obj, constraints)
prob.solve()
print ("status:", prob.status)
print ("optimal value", prob.value) 
print ("optimal var", x.value, y.value) 

3. 其他求解器

在cvxpy默认的求解器不行时,我们要使用其他求解器,例如:

# Solving a problem with different solvers.
x = cvx.Variable(2)
obj = cvx.Minimize(x[0] + cvx.norm(x, 1))
constraints = [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'

直接用cvxopt求解的例子如下:
在这里插入图片描述

4. DPP

DPP是Disciplined Parametrized Programming (DPP)的缩写,即保持同样形状的问题。DPP中有一种新的数据格式叫parameter,要求固定变量variable后,对于parameters是一阶的(parameter-affine)。在这种情况下,用ECOS、SCS、MOSEK时可以加速。
下面是个例子:

import cvxpy as cp
m, n = 3, 2
x = cp.Variable((n, 1))
F = cp.Parameter((m, n))
G = cp.Parameter((m, n))
g = cp.Parameter((m, 1))
gamma = cp.Parameter(nonneg=True)
objective = cp.norm((F + G) @ x - g) + gamma * cp.norm(x)
print(objective.is_dcp(dpp=True))

开启dpp=Ture后,就可以给parameter输入不同的参数,反复求解问题了,下图是resolving的时间。
在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值