Cvxpy не может решить Geometri c Программа, когда переменная умножается на матрицу, в которой некоторые элементы равны нулю - PullRequest
0 голосов
/ 12 апреля 2020
import cvxpy as cp
import numpy as np

A = np.array([[ 0.5,  0.5 ,  0,  0,  0],
       [ 0.25,  0.25,  0.25,  0,  0.25],
       [0 , 0.33, 0.34, 0.33, 0],
    [0 , 0, 0.33, 0.34, 0.33],
       [0 , 0.33, 0, 0.33, 0.34]])

beta = np.array([[0.6],[0.6],[0.6],[0.6],[0.6]])
N = 5
print(beta)
print(np.diagflat(beta))
BG = np.diagflat(beta)@A
#for i in range(N):
#   for j in range(N):
#       if BG[i][j]==0:
#           BG[i][j]=1e-30
print(BG)
dc_min = 0.1
dc_max = 0.5
C = 5
v = cp.Variable((N), pos = True)
dc = cp.Variable((N), pos = True)
lmbd = cp.Variable(pos = True)

constraints = []
print(v.shape,dc.shape)
for i in range(N):
    constraints.append(dc[i]<=dc_max)
    constraints.append(dc[i]>=dc_min)
    f = (dc[i]*v[i]+(BG[i]*v))/(lmbd*v[i])
    print(f.is_dgp())
    constraints.append(f<=1)
ff=cp.sum((cp.inv_pos(dc))/(1/dc_min-1/dc_max))
print(ff.is_dgp())
constraints.append(ff<=C+1.0/(dc_max/dc_min-1))
print(len(constraints))
problem = cp.Problem(cp.Minimize(lmbd),constraints)
problem.solve(gp=True, solver = cp.CVXOPT)
print(problem.value)

Приведенный выше код вызывает следующую ошибку

raise DGPError("Problem does not follow DGP rules." + append)
cvxpy.error.DGPError: Problem does not follow DGP rules.The following constraints are not DGP:
(var1[0] * var0[0] + [0.3 0.3 0.  0.  0. ] * var0) / var2 * var0[0] <= 1.0 , because the following subexpressions are not:
|--  [0.3 0.3 0.  0.  0. ]
(var1[1] * var0[1] + [0.15 0.15 0.15 0.   0.15] * var0) / var2 * var0[1] <= 1.0 , because the following subexpressions are not:
|--  [0.15 0.15 0.15 0.   0.15]
(var1[2] * var0[2] + [0.    0.198 0.204 0.198 0.   ] * var0) / var2 * var0[2] <= 1.0 , because the following subexpressions are not:
|--  [0.    0.198 0.204 0.198 0.   ]
(var1[3] * var0[3] + [0.    0.    0.198 0.204 0.198] * var0) / var2 * var0[3] <= 1.0 , because the following subexpressions are not:
|--  [0.    0.    0.198 0.204 0.198]
(var1[4] * var0[4] + [0.    0.198 0.    0.198 0.204] * var0) / var2 * var0[4] <= 1.0 , because the following subexpressions are not:
|--  [0.    0.198 0.    0.198 0.204]

Теперь, когда я раскомментирую часть: -

#for i in range(N):
#   for j in range(N):
#       if BG[i][j]==0:
#           BG[i][j]=1e-30

, которая устанавливает все элементы матрицы BG равными нулю до 10 ^ -30, программа выдает правильный вывод. Я думаю, это потому, что в gp разрешены только положительные коэффициенты переменных. Даже после установки нулевых элементов BG на 1e-30, если я добавлю термин +0*v[i] к каким-либо ограничениям, он показывает аналогичную ошибку.

...