为什么元素最大值不是 DCP?

计算科学 约束优化 凸优化 简历 简历
2021-12-02 13:53:55

我正在尝试使用 CVXPY 制定凸优化问题。一切正常,除了似乎不遵循 DCP 规则的约束。

DRn是一个决策变量,让Q是另一个衍生自的决策变量D使用以下约束,

Q = cvxpy.pos(D)

我不确定为什么会这样。在这里它说这pos是一个凸原子。

pos(x):=max{x,0}

有人可以帮帮我吗?

编辑:

错误信息:

cvxpy.error.DCPError:问题不遵循 DCP 规则。具体来说:以下约束不是 DCP: var1 == maximum(var0, 0.0) ,因为以下子表达式不是:|-- var1 == maximum(var0, 0.0)

最小的工作示例(如果关闭第二个约束,程序可以工作),

import cvxpy as cp
import numpy as np

D = cp.Variable(2)
A = np.array([[1, 2], [2, 1]])
b = np.ones((2, )) * 2
Q = cp.Variable(2)

constraints = [sum(D) == 1, Q == cp.pos(D)]

prob = cp.Problem(cp.Minimize(cp.sum_squares(A @ D - b)), constraints)

prob.solve(verbose=True)
1个回答

答案基于@Mark L. Stones 的评论

DCP 不允许非线性等式约束,并且除了普通情况外,它们是非凸的。直接在目标函数表达式中应用 pos 或 max(D,0)。在 CVX 中,这将是 ... + M'*pos(D)