CVXPY:如何有效地解决一系列类似的问题

时间:2017-05-30 13:38:03

标签: python mathematical-optimization cvxpy

我在CVXPY modelling language中定义了一个大问题。我想解决这些问题的一系列 - 仍然是相同的格式,但具有不同的参数(常量)。

我发现调用problem.solve()后内部问题生成需要20秒,主优化运行时需要0.2秒。我想解决几十个类似的问题需要花很多时间。

是否有像YALMIP optimizer这样的CVXPY工具或是否有可能减少问题产生时间?

1 个答案:

答案 0 :(得分:6)

是的。它甚至在官方docs中解释过。

  

参数

     

参数是常量的符号表示。参数的目的是在不重建整个问题的情况下更改问题中常量的值。

直接来自文档(已修改)的示例:

from cvxpy import *
import numpy

# Problem data.
n = 15
m = 10
numpy.random.seed(1)
A = numpy.random.randn(n, m)
b = numpy.random.randn(n, 1)
# gamma must be positive due to DCP rules.
gamma = Parameter(sign="positive")                       # !!!

# Construct the problem.
x = Variable(m)
error = sum_squares(A*x - b)
obj = Minimize(error + gamma*norm(x, 1))
prob = Problem(obj)                                      # !!!

# Construct a trade-off curve of ||Ax-b||^2 vs. ||x||_1
sq_penalty = []
l1_penalty = []
x_values = []
gamma_vals = numpy.logspace(-4, 6)
for val in gamma_vals:
    gamma.value = val                                    # !!!
    prob.solve()                                         # !!!
    # Use expr.value to get the numerical value of
    # an expression in the problem.
    sq_penalty.append(error.value)
    l1_penalty.append(norm(x, 1).value)
    x_values.append(x.value)

那它做什么

正如您所注意到的,优化问题的设置可能需要一些时间,因为它遵循DCP方法(通过构造证明了凸性)。

使用parameter,此DCP处理只进行一次!每个新解决方案只会改变问题中的一些小部分。尽可能精确地描述您的参数非常重要,这样DCP才能正常工作。示例:Parameter(sign="positive")

你能做的更多吗

也许。根据求解器的不同,您还可以使用热启动,如果您认为特殊猜测(例如上次迭代的解决方案向量)是新问题的良好开端。

这会将prob.solve()替换为prob.solve(warm_start=True),导致重复使用以前的解决方案作为开头(解释here)。手动定义此向量似乎不可能(来自cvxpy)。

可悲的是,据我所知,唯一支持此功能的解决方案(在cvxpy中)是SCS(其他人会在不崩溃的情况下忽略它)!