如何解决类型错误:x 必须是 GEKKO 参数、变量或表达式的 Python 列表
我尝试在 google Collab 中使用 Gekko 解决优化问题,并显示此错误(在第 91 行 m.Obj(m.sum(m.sum(((xl[i](D_input[i] + D_output[i])/0.5)+ (xf[i][j]((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j] ]) +((D_input[i] + D_output[i]) / rf[i][j])))+ (xc*((D_input[i] / ru[i][j]) + (D_output[i] ] / rd...): 类型错误:x 必须是 GEKKO 参数、变量或表达式的 Python 列表
!pip install gekko
from gekko import GEKKO
m = GEKKO()
MU = 5
FN = 3
Cloud = 1
D_input = m.Param(value=[2,4,7,6,9])
D_output = m.Param(value=[0.2,0.25,0.6,0.35,0.81])
RF_total = m.Param(value=[10,10,10])
RU_total = m.Param(value=[72,72,72])
RD_total = m.Param(value=[72,72])
c = m.Param(value=[0.2,0.4,0.7,0.9])
tr = m.Param(value=[10,10])
fl = m.Param(value=[0.5,0.5,0.5])
nu = m.Const(1.37)
fc = m.Const(10)
wc = m.Const(5)
eu = m.Const(0.142)
ed = m.Const(0.142)
euc = m.Const(0.658)
edc = m.Const(0.278)
el = m.Param(value=[0.0,0.0,0.0])
eed = m.Param(value=[[0.0,0.0],[0.0,0.0]])
eeu = m.Param(value=[[0.0,0.0]])
eedc = m.Param(value=[0.0,0.0])
eeuc = m.Param(value=[0.0,0.0])
eef = m.Param(value=[[0.0,0.0]])
eec = m.Param(value=[0.0,0.0])
for i in range(MU) :
el[i] = nu * c[i]
for i in range(MU) :
for j in range(FN) :
eed[i][j] = D_output[i] * ed
eeu[i][j] = D_input[i] * eu
for i in range(MU) :
for j in range(FN) :
eef[i][j] = eeu[i][j] + eed[i][j]
for i in range(MU) :
eedc[i] = edc * D_output[i]
eeuc[i] = euc * D_input[i]
for i in range(MU) :
eec[i] = eeuc[i] + eedc[i]
xf = [[m.Var(value=0,lb=0,ub=1,integer=True) for j in range(FN)] for i in range(MU)]
xc = m.Var(value=0,integer=True)
xl = [m.Var(value=0,integer=True) for i in range(MU)]
ru = [[m.Var(value=0.01,lb=0.01,ub=72.0) for j in range(FN)] for i in range(MU)]
rd = [[m.Var(value=0.01,ub=72.0) for j in range(FN)] for i in range(MU)]
rf = [[m.Var(value=0.01,ub=10.0) for j in range(FN)] for i in range(MU)]
for j in range(FN):
m.Equation(sum(rf[i][j] for i in range(MU)) <= 10)
for j in range(FN):
m.Equation(sum(ru[i][j] for i in range(MU)) <= 72)
for j in range(FN):
m.Equation(sum(rd[i][j] for i in range(MU)) <= 72)
for i in range(MU):
m.Equation(xc + xl[i] + sum(xf[i][j] for j in range(FN)) == 1)
for i in range(MU):
m.Equation(xl[i]*(( D_input[i] + D_output[i])/0.5) <= 7)
for j in range(FN):
for i in range(MU):
m.Equation(((xf[i][j]*((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j]) + ((D_input[i] +
D_output[i]) / rf[i][j])))) <= 7)
for i in range(MU):
m.Equation(((xc*((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j]) + (3*(D_input[i] +
D_output[i]) / 10)))) <= 7)
for i in range(MU):
m.Equation(((D_input[i] + D_output[i])/0.5) <= tr[i])
for j in range(FN):
for i in range(MU):
m.Equation(((((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j]) + ((D_input[i] + D_output[i])
/ rf[i][j])))) <= tr[i])
for i in range(MU):
m.Equation(((((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j]) + (3*(D_input[i] + D_output[i]) / 10)))) <= tr[i])
m.Obj(m.sum(m.sum(((xl[i]*(D_input[i] + D_output[i])/0.5)+\
(xf[i][j]*((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j]) +((D_input[i] + D_output[i]) /
rf[i][j])))+\
(xc*((D_input[i] / ru[i][j]) + (D_output[i] / rd[i][j]) + (3*(D_input[i] + D_output[i]) /
10))))+\
(xf[i][j]*eef[i][j]) + (xc*eec[i]) + (xl[i]*el[i]) for i in range(MU)) for j in range(FN)))
m.options.soLVER=1
m.solver_options = ['minlp_maximum_iterations 500',\
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10',\
# treat minlp as nlp
'minlp_as_nlp 0',\
# nlp sub-problem max iterations
'nlp_maximum_iterations 50',\
# 1 = depth first,2 = breadth first
'minlp_branch_method 1',\
# maximum deviation from whole number
'minlp_integer_tol 0.05',\
# covergence tolerance
'minlp_gap_tol 0.01']
m.solve()
print('Results')
print('Objective: ' + str(m.options.objfcnval))
请帮帮我 谢谢。
解决方法
xf = [[m.Var(value=0,lb=0,ub=1,integer=True) for j in range(FN)] for i in range(MU)]
xc = m.Var(value=0,integer=True)
xl = [m.Var(value=0,integer=True) for i in range(MU)]
ru = [[m.Var(value=0.01,lb=0.01,ub=72.0) for j in range(FN)] for i in range(MU)]
rd = [[m.Var(value=0.01,ub=72.0) for j in range(FN)] for i in range(MU)]
rf = [[m.Var(value=0.01,ub=10.0) for j in range(FN)] for i in range(MU)]
它们是 m.Var() 对象列表的列表。
我们需要让它成为 m.Var() 对象的列表。
对 Gekko 不太熟悉,但仍然希望这能有所帮助。
使用 m.Array()
定义多维 m.Param
和 m.Var
值。
D_input = m.Array(m.Param,5)
for v in [2,4,7,6,9]:
D_input[i].value = v
或
eef = m.Array(m.Param,(5,3),value=0)
这是一个最小的示例问题:
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
ni = 3; nj = 2; nk = 4
# solve AX=B
A = m.Array(m.Var,(ni,nj),lb=0)
X = m.Array(m.Var,(nj,nk),lb=0)
AX = np.dot(A,X)
B = m.Array(m.Var,lb=0)
# equality constraints
m.Equations([AX[i,j]==B[i,j] for i in range(ni) \
for j in range(nk)])
m.Equation(5==m.sum([m.sum([A[i][j] for i in range(ni)]) \
for j in range(nj)]))
m.Equation(2==m.sum([m.sum([X[i][j] for i in range(nj)]) \
for j in range(nk)]))
# objective function
m.Minimize(m.sum([m.sum([B[i][j] for i in range(ni)]) \
for j in range(nk)]))
m.solve()
print(A)
print(X)
print(B)
以下是一些使用 Numpy 进行的额外矩阵运算:
import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False)
# Random 3x3
A = np.random.rand(3,3)
# Random 3x1
b = np.random.rand(3,1)
# Gekko array 3x3
p = m.Array(m.Param,(3,3))
# Gekko array 3x1
y = m.Array(m.Var,1))
# Dot product of A p
x = np.dot(A,p)
# Dot product of x y
w = np.dot(x,y)
# Dot product of p y
z = np.dot(p,y)
# Trace (sum of diag) of p
t = np.trace(p)
# solve Ax = b
s = m.axb(A,b)
m.solve()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。