Python CVXPY:高效地编写成对和的约束

Python CVXPY:高效地编写成对和的约束,python,linear-programming,cvxpy,Python,Linear Programming,Cvxpy,我正在尝试在CVXPY中实现此LP: 但是我正在努力寻找一种有效的方法来实现这里的第一个约束。我发现唯一有效的方法是将每个总和作为其自身的约束进行相加,但随着问题的规模越来越大,其规模会迅速扩大。是否有更简单/更有效的方法来指定此约束 import cvxpy as cp import numpy as np n_j = 10 n_i = 100 a = cp.Variable(n_j, nonneg=True) b = cp.Variable(n_i, nonneg=True) g =

我正在尝试在CVXPY中实现此LP:

但是我正在努力寻找一种有效的方法来实现这里的第一个约束。我发现唯一有效的方法是将每个总和作为其自身的约束进行相加,但随着问题的规模越来越大,其规模会迅速扩大。是否有更简单/更有效的方法来指定此约束

import cvxpy as cp
import numpy as np

n_j = 10
n_i = 100

a = cp.Variable(n_j, nonneg=True)
b = cp.Variable(n_i, nonneg=True)

g = np.random.randint(low=1, high=10, size=n_j)
v = np.random.normal(size=(n_i, n_j))

obj = cp.Minimize(cp.sum(cp.multiply(g, a)) + cp.sum(b))

constraints = [a[j] + b[i] >= values[i, j] 
               for j in range(n_j) for i in range(n_i)]

prob = cp.Problem(obj, constraints)
prob.solve()

我们可以将其转换为矩阵表示法:

其中e是所有1的列向量。当然,e向量应该有适当的大小:每个项应该是一个(n_i x n_j)矩阵

在CVXPY中,这可以写成:

# changed into using explicit column vectors
a = cp.Variable((n_j,1), nonneg=True)
b = cp.Variable((n_i,1), nonneg=True)
g = np.random.randint(low=1, high=10, size=(n_j,1))

# column vectors of ones
e_i = np.ones((n_i,1))
e_j = np.ones((n_j,1))

# matrix style inequality
constraints = [e_i * a.T + b * e_j.T >= v] 

我们可以将其转换为矩阵表示法:

其中e是所有1的列向量。当然,e向量应该有适当的大小:每个项应该是一个(n_i x n_j)矩阵

在CVXPY中,这可以写成:

# changed into using explicit column vectors
a = cp.Variable((n_j,1), nonneg=True)
b = cp.Variable((n_i,1), nonneg=True)
g = np.random.randint(low=1, high=10, size=(n_j,1))

# column vectors of ones
e_i = np.ones((n_i,1))
e_j = np.ones((n_j,1))

# matrix style inequality
constraints = [e_i * a.T + b * e_j.T >= v]