Python cvxpy+;ecos:问题不可行,如何正确缩放
我有以下代码:Python cvxpy+;ecos:问题不可行,如何正确缩放,python,cvxpy,Python,Cvxpy,我有以下代码: import numpy as np import cvxpy as cp import math import sys def solve05( p, a ): m,n,ids,inv,k = 0,len(p),{},{},0 for i in range(n): for j in range(n): ids[(i,j)] = k inv[k] = (i,j) k = k+
import numpy as np
import cvxpy as cp
import math
import sys
def solve05( p, a ):
m,n,ids,inv,k = 0,len(p),{},{},0
for i in range(n):
for j in range(n):
ids[(i,j)] = k
inv[k] = (i,j)
k = k+1
# Problem data
A = np.zeros((2*n,n*n+n))
D = np.zeros((2*n,n*n+n))
b = np.zeros(2*n)
B = np.zeros(2*n)
c = np.zeros(2*n)
for j in range(n):
for i in range(n):
idx = ids[(i,j)]
A[j,idx] = 1
b[j] = 1
for i in range(n):
for j in range(n):
idx = ids[(i,j)]
A[i+n,idx] = p[j]
A[i+n,n*n+i] = -1
b[i+n] = p[i]
# Construct the problem
x = cp.Variable(n*n+n)
print("M = ",A)
print("b = ",b)
CF = 1e3
print("Now scaling M by ",CF)
A = A*CF
print(A)
b = b*CF
constraints = [0 <= x, A*x == b]
pex = x[n*n]+x[n*n+1]+x[n*n+2]+1
constraints.append(x[n*n] <= a[0]*CF)
constraints.append(x[n*n+1] <= a[1]*CF)
constraints.append(x[n*n+2] <= a[2]*CF)
constraints.append(x[n*n] >= 0.01)
constraints.append(x[n*n+1] >= 0.01)
constraints.append(x[n*n+2] >= 0.01)
ex = pex.__pow__(-1)
print("Dummy variables: ",x[n*n],x[n*n+1],x[n*n+2])
print("Objective function: ",ex)
print("[should be convex] Curvature: ",ex.curvature)
objective = cp.Minimize(ex)
prob = cp.Problem(objective,constraints)
result = prob.solve(verbose=True)
print('problem state: ', prob.status)
alpha = np.zeros((n,n))
for i in range(n):
for j in range(n):
alpha[i,j] = x.value[ids[(i,j)]]
dummy = [x.value[j] for j in range(n*n,n*n+n)]
return (x,alpha)
if __name__ == '__main__':
p = [0.0005,0.0001,0.0007]
a = [900,500,700]
n = len(a)
(sl,alpha) = solve05(p,a)
for row in alpha:
for x in row:
print("%.4f " % (x), end=" "),
print("")
将numpy导入为np
将cvxpy作为cp导入
输入数学
导入系统
def solve05(p,a):
m、 n,ids,inv,k=0,len(p),{},{},0
对于范围(n)中的i:
对于范围(n)内的j:
ids[(i,j)]=k
投资[k]=(i,j)
k=k+1
#问题数据
A=np.零((2*n,n*n+n))
D=np.零((2*n,n*n+n))
b=np.零(2*n)
B=np.零(2*n)
c=np.零(2*n)
对于范围(n)内的j:
对于范围(n)中的i:
idx=ids[(i,j)]
A[j,idx]=1
b[j]=1
对于范围(n)中的i:
对于范围(n)内的j:
idx=ids[(i,j)]
A[i+n,idx]=p[j]
A[i+n,n*n+i]=-1
b[i+n]=p[i]
#构造问题
x=cp.Variable(n*n+n)
打印(“M=,A)
打印(“b=”,b)
CF=1e3
打印(“现在按比例缩放M”,CF)
A=A*CF
印刷品(A)
b=b*CF
约束=[0ecos+cvxpy给出的答案是正确的。这个问题是不可行的,这可以通过总结所有方程并观察到LHS是一些数量F
,而RHS是F+e
,对于一些e>0