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

如何在 cvxpy

如何解决如何在 cvxpy

我将如何指定约束,以便布尔二维决策变量矩阵具有以下条件:

  • 所有非零列必须相同

如果矩阵是一个 numpy 数组,我们将能够使用 np.all,但我没有看到类似的 cvxpy 函数

import numpy as np
import cvxpy as cp
import cvxopt 

util = np.array([[0.7,0.95,0.3,3],[2,1.05,2.2,5],[4,1,3,6]])

dec_vars = cp.Variable(len(util),boolean = True)
zero_cat_vars = cp.Variable(util.shape[0],boolean = True)

# example of output
dev_vars_smp_output = np.array([[0,0],[1,1],1]])

zero_cat_constr = cp.sum(dec_vars,axis=1) >= 1 * zero_cat_vars

dec_vars_excl_zeros = dec_vars[:,~cp.all(dec_vars==0,axis=1)]
col_equal_constr = cp.sum(dec_vars_excl_zeros,axis=1) == dec_vars_excl_zeros.shape[1] * zero_cat_vars

解决方法

数学编程与数学的关系比编程更多。 (数学编程中的“编程”一词实际上是“计划”的意思,与计算机编程无关)。编程类比通常不是很有用。

您正在寻找的数学设备是

 x(i,j) = v(i) ⋅ δ(j)
 δ(j) ∈ {0,1}
 v(i),x(i,j) ≥ 0

v 是(可能是非零的)向量,δ 表示我们使用 v 还是零向量。 x 是最终矩阵。这种非线性(和非凸)公式可以线性化为:

 x(i,j) ≤ v(i)
 x(i,j) ≤ M ⋅ δ(j)
 x(i,j) ≥ v(i) − M ⋅ (1−δ(j))
 δ(j) ∈ {0,j) ≥ 0

这里 M 是 v(j)(和 x(i,j))的上界。这种方法可以推广到允许负 v(j) 和 x(i,j)。我会让你把它转录成 Python/CVXPY 代码。

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