我在CVXPY 建模语言中定义了一个大问题。我想解决一系列这样的问题——格式仍然相同,但参数(常量)不同。
我发现调用problem.solve()
内部问题生成需要 20 秒,主要优化运行时间需要 0.2 秒。很多时候我想解决几十个类似的问题。
是否有任何用于 CVXPY 的工具,例如YALMIP 优化器或任何减少问题生成时间的可能性?
我在CVXPY 建模语言中定义了一个大问题。我想解决一系列这样的问题——格式仍然相同,但参数(常量)不同。
我发现调用problem.solve()
内部问题生成需要 20 秒,主要优化运行时间需要 0.2 秒。很多时候我想解决几十个类似的问题。
是否有任何用于 CVXPY 的工具,例如YALMIP 优化器或任何减少问题生成时间的可能性?
就在这里。甚至在官方文档中也有解释。
参数
参数是常量的符号表示。参数的目的是在不重构整个问题的情况下改变问题中常数的值。
直接来自文档的示例(修改):
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()
with prob.solve(warm_start=True)
,从而重新使用以前的解决方案作为开始(在此处解释)。手动定义这个向量似乎是不可能的(来自 cvxpy)。
可悲的是,据我所知,唯一支持此(在 cvxpy 中)的求解器是 SCS(其他人会忽略它而不会崩溃)!