目前,我正在研究我的毕业设计,但是我的代码遇到了一些麻烦。是否有任何人可以帮助解决我的错误。我正在努力优化水产生的利润。
我得到的错误是以下一个(出现在约束的if行中):
TypeError: 'function' object has no attribute '__getitem__'
我的代码:
#constants
Ymax=8 #tonne/ha
ky=1.25
Numbas=3 #3 subbasins
Nummon=12 #12 months is a year.
c_hydro=0.9 #Conversion rate m3 to kWh
LBPmaize=316413 #LBP/tonne
LBPhydro=55 #LBP/kWh
alpha=0.7
p1=0.35 #soil moisture depletion factor for no stress
#parameters
S0=[207.112, 150, 161.398]
A=[74571.9, 1537.8, 6645.7] #total area per subbasin
a=[0.423, 0.959, 0.473] #part of area used for irrigation
R=[0.2, 0.3, 0.5]
Qhydromatrix=[0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,0,0,0,0,1,1,1]
#Definitions
def profit(x,sign=-1):
x=[]*(Numbas*Nummon)
return sign * (alpha*Yasum*LBPmaize)
def ETa(x):
for i in range(0,(Nummon*Numbas)):
ETa=[]*(Numbas*Nummon)
if np.multiply(x,p1)>ETmax_maize:
ETa[i]=ETmax_maize[i]
else:
ETa[i]=np.multiply(x[i],p1)
return ETa
def Yasum(ETa):
Yasum=0
for j in range(0,Numbas):
for i in range(0,Nummon):
ETasum=sum(ETa[j*Nummon:(j+1)*Nummon])
ETmaxsum=sum(ETmax_maize[j*Nummon:(j+1)*Nummon])
Ya=((-1*Ymax*ky)*(1-(ETasum/ETmaxsum))+Ymax)*A[j]*a[j]
Yasum=Yasum+Ya
return Yasum
def constraint(x):
for j in range(0,Numbas):
for i in range(0,Nummon):
if (i-(j*Nummon))==0:
x[i+(j*Nummon)]-((1-R[j])*S0[j])+ETa[i+(j*Nummon)+11]-P[i+(j*Nummon)+11]-Rdown[i+(j*Nummon)]
else:
ETa[i+(j*Nummon)-1]-((1-R[j])*x[i+(j*Nummon)-1])+x[i+(j*Nummon)]-P[i+(j*Nummon)-1]-Rdown[i+(j*Nummon)]
return x
con2=({'type':'ineq','fun':constraint})
x0=[100]*(Nummon*Numbas)
sol=minimize(profit, x0,method='SLSQP', constraints=con2)
答案 0 :(得分:0)
通常,此错误表示您有一个表达式f[x]
,其中f
是一个函数。
您的代码中存在多个问题,但错误来自此行:
ETa[i+(j*Nummon)-1]-((1-R[j])*x[i+(j*Nummon)-1])+x[i+(j*Nummon)]-P[i+(j*Nummon)-1]-Rdown[i+(j*Nummon)]
# ^ this is a function
您定义了一个名为ETa
的函数。您还使用名为ETa
的局部变量。一般来说这不是一个好主意。在最后一个函数中,您没有此名称中的局部变量,因此在全局范围内查找名称 - 这是一个函数;无法以这种方式访问函数。
您的代码存在其他问题:
x=[]*(Numbas*Nummon)
。此更改是本地的,对传递给函数的参数没有影响。[] * some_number
形式的表达式。这没有意义 - 重复空列表会返回空列表。constraint
中,您将返回x
,但不会以任何方式更改它。您打算在profit
内更改吗?因为你不能。if
和else
分支继续评估表达式,没有任何影响。请注意,这些问题与您的代码逻辑无关。
重要的风格问题:
snake_case
变量名称。这不会影响代码的行为,但可以帮助其他人阅读,因此它可以帮助您获得反馈。同样,在=
,+
等j * Nummon
),请将其值放在变量中。