CVXPY 约束:变量 == 0 或变量 >= 最小值

CVXPY constraint: variable == 0 OR variable >= min

我正在尝试通过权重可以为零或至少 minNx1 向量)的约束来解决投资组合优化问题。

import cvxpy as cp

w = cp.Variable(len(mu))
mins = np.ones(len(mu)) * 0.03
risk = cp.quad_form(w, S)

prob = cp.Problem(cp.Minimize(risk), 
                  [cp.sum(w) == 1, 
                   w >= 0,
                   w >= min OR w == 0  # pseudocode for my desired constraint]

这等同于权重为 NOT 0 < w <= min 的约束,但我找不到在 CVXPY 中表达这一点的方法(我用谷歌搜索了“cvxpy OR 约束”之类的内容无济于事)。

感觉好像遗漏了一些明显的东西。也许有涉及一些布尔向量的解决方案?

这被称为w是一个半连续变量。大多数高级求解器直接支持这种类型的变量。由于 CVXPY 不理解半连续变量,我们可以使用二元变量 δ ∈ {0,1} 并形成约束:

   δ⋅min ≤ w ≤ δ⋅max

我们可以在哪里设置max=1.

这使问题成为 MIQP(混合整数二次规划)问题。这通常意味着您需要使用支持此类模型的高端求解器。

根据 Erwin 的回答,这是工作代码。

import cvxpy as cp

w = cp.Variable(n)
mins = np.ones(n) * 0.03
maxs = np.ones(n)

risk = cp.quad_form(w, S)

prob = cp.Problem(cp.Minimize(risk), 
                  [cp.sum(w) == 1, 
                   w >= 0,
                   w >= cp.multiply(k, mins),
                   w <= cp.multiply(k, maxs)])
prob.solve(solver="ECOS_BB")

编辑:根据评论

k @ mins更改为cp.multiply(k, mins)