如何解决CVXPY 约束:variable == 0 OR variable >= min
我正在尝试解决一个投资组合优化问题,其约束条件是权重可以为零或至少为 min
(Nx1
向量)。
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 举报,一经查实,本站将立刻删除。