CVXPY: эффективно записывать ограничения для попарных сумм - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь реализовать этот LP в 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()

1 Ответ

3 голосов
/ 10 января 2020

Мы можем перевести это в матричную запись:

enter image description here

, где e - векторы столбцов всех единиц. Конечно, векторы 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] 
...