【问题标题】:How to specify constraint for columns with not all-zero values to equal each other in cvxpy如何在cvxpy中为非全零值的列指定约束以彼此相等
【发布时间】:2020-12-29 02:06:59
【问题描述】:

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

  • 所有非零列必须相同

如果矩阵是一个 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

【问题讨论】:

    标签: python cvxpy integer-programming


    【解决方案1】:

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

    您正在寻找的数学设备是

     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 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2019-04-10
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多