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

2024-10-03 00:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

CVXPY是否有类似YALMIP optimizer的工具,或者可以减少问题生成时间?在


Tags: 工具参数定义格式时间languageoptimizer常量
1条回答
网友
1楼 · 发布于 2024-10-03 00:21:37

是的,有。甚至在官方的docs中也有解释。在

Parameters

Parameters are symbolic representations of constants. The purpose of parameters is to change the value of a constant in a problem without reconstructing the entire problem.

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

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(其他人会忽略它而不会崩溃)!在

相关问题 更多 >