如何在cvxpy中为非所有零值的列指定相互相等的约束

2024-06-06 12:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 所有非零列必须相同

如果矩阵是一个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, 0, 0], [1, 0, 0, 1], [1, 0, 0, 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


Tags: importnumpyutilnpzeros矩阵varsall
1条回答
网友
1楼 · 发布于 2024-06-06 12:13:22

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

你要找的数学装置是

 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,1}
 v(i), x(i,j) ≥ 0

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

相关问题 更多 >