微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CVXPY 约束:variable == 0 OR variable >= min

如何解决CVXPY 约束: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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。