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]
к каким-либо ограничениям, он показывает аналогичную ошибку.