2017-10-06 2 views
0

Actuellement, je travaille sur mon projet de fin d'études, mais j'ai quelques problèmes avec mon code. Y at-il peut-être quelqu'un qui pourrait aider à résoudre mon erreur. J'essaie d'optimiser les profits générés hors de l'eau.TyperError: l'objet 'function' n'a pas d'attribut '_getitem_'

L'erreur que je reçois est la suivante (apparaît dans la si la ligne de la contrainte):

TypeError: 'function' object has no attribute '__getitem__' 

Mon code:

#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

Notez que '[] * n == []'. – Elazar

+0

'__getitem__' est produit par un' [...] ', comme cela est fait lors de l'indexation d'une liste, d'un dictionnaire ou d'un tableau. L'erreur signifie qu'une fonction est appelée avec fn [...] 'plutôt que fn (...)'. – hpaulj

Répondre

0

En général, cela signifie que vous avez erreur une expression f[x]f est une fonction.

Vous avez plusieurs problèmes dans votre code, mais l'erreur vient de cette ligne:

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 

Vous avez défini une fonction appelée ETa. Vous utilisez également les variables locales nommées ETa. Ce n'est pas une bonne idée en général. Dans la dernière fonction, vous n'avez pas de variable locale dans ce nom, donc le nom est recherché dans la portée globale - et c'est une fonction; les fonctions ne sont pas accessibles de cette manière.

Autres problèmes avec votre code:

  • Dans le profit de la fonction que vous attribuez le paramètre, et ne pas l'utiliser: x=[]*(Numbas*Nummon). Cette modification est locale et n'a aucun effet sur l'argument transmis à la fonction. Vous utilisez des expressions de la forme [] * some_number à deux endroits. C'est inutile - répéter la liste vide renvoie la liste vide.
  • Dans la fonction constraint, vous renvoyez x, mais vous ne le modifiez en aucune façon. Aviez-vous l'intention de le modifier de profit? Parce que tu ne peux pas.
  • Dans la même fonction, les branches if et else continuent d'évaluer l'expression, sans aucun effet.

Notez que ces problèmes ne sont pas liés à la logique de votre code.

questions de style Important:

  • S'il vous plaît utilisent snake_case noms de variables. Cela n'affecte pas le comportement du code, mais aide d'autres personnes à le lire, ce qui vous aidera à obtenir des commentaires. De même, placez des espaces autour des opérateurs tels que =, +, etc.
  • Si les expressions sont trop longues, divisez-les en plusieurs instructions en utilisant la variable locale.
  • Si une expression se répète (telle que j * Nummon ci-dessus), placez sa valeur dans une variable.