Pyomo contraintes - "liste" objet n'a pas d'attribut

0

La question

Je suis entrain de créer un pyomo contrainte, de sorte que Eout_pv[t] <= PV_gen[t] à chaque valeur de t.

Dans mon code ci-dessous, j'ai d'abord créer les décors, les paramètres, les variables. J'ai ensuite créer la contrainte.

model.T = Set(initialize=df.index.tolist(), ordered=True)
model.PV_gen = Param(model.T, initialize=df.pv_gen.tolist())

model.Eout_pv = Var(model.T, bounds=(0, 100))

def pv_export(model, t):
    return model.Eout_pv[t] <= model.PV_gen[t]   
model.pv_export = Constraint(model.T, rule=pv_export)

Lorsque je l'exécute, j'obtiens le message "AttributeError: 'liste' de l'objet n'a pas d'attribut "is_expression_type'"

Je vous serais extrêmement reconnaissant pour toute aide

Le message d'erreur complet ci-dessous

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-47-3de19250551e> in <module>
      2 
      3 start_time = time.time()
----> 4 output_df = optimize_year(df, first_model_period, last_model_period, result_time_step)
      5 print("--- %s seconds ---" % (time.time() - start_time))

<ipython-input-47-a84557fa2321> in optimize_year(df, first_model_period, last_model_period, time_step)
     72         return model.Eout_pv[t] <= model.PV_gen[t]
     73 
---> 74     model.pv_export = Constraint(model.T, rule=pv_export)
     75 
     76     def total_export(model, t):

C:\ProgramFiles2\Anaconda\lib\site-packages\pyomo\core\base\block.py in __setattr__(self, name, val)
    541                 # Pyomo components are added with the add_component method.
    542                 #
--> 543                 self.add_component(name, val)
    544             else:
    545                 #

C:\ProgramFiles2\Anaconda\lib\site-packages\pyomo\core\base\block.py in add_component(self, name, val)
   1079                              _blockName, str(data))
   1080             try:
-> 1081                 val.construct(data)
   1082             except:
   1083                 err = sys.exc_info()[1]

C:\ProgramFiles2\Anaconda\lib\site-packages\pyomo\core\base\constraint.py in construct(self, data)
    774             for ndx in self._index:
    775                 try:
--> 776                     tmp = apply_indexed_rule(self,
    777                                              _init_rule,
    778                                              _self_parent,

C:\ProgramFiles2\Anaconda\lib\site-packages\pyomo\core\base\misc.py in apply_indexed_rule(obj, rule, model, index, options)
     59                 return rule(model)
     60             else:
---> 61                 return rule(model, index)
     62         else:
     63             if index.__class__ is tuple:

<ipython-input-47-a84557fa2321> in pv_export(model, t)
     70     def pv_export(model, t):
     71         "Maximum PV export within a single period"
---> 72         return model.Eout_pv[t] <= model.PV_gen[t]
     73 
     74     model.pv_export = Constraint(model.T, rule=pv_export)

pyomo\core\expr\numvalue.pyx in pyomo.core.expr.numvalue.NumericValue.__le__()

pyomo\core\expr\logical_expr.pyx in pyomo.core.expr.logical_expr._generate_relational_expression()

AttributeError: 'list' object has no attribute 'is_expression_type'
attributeerror constraints pyomo python
2021-11-15 12:39:53
2
0

model.PV_gen est un param qui dépend de l' model.T. cela signifie que pour chaque valeur de T il y aura une valeur pour PV_gen. Vous devez initialiser les param avec un dict pas un list. Par exemple:

from pyomo.environ import *

T=[1,2,3]
PV={1:20, 2:560, 3: 890}
model=ConcreteModel()
model.T = Set(initialize=T, ordered=True)
model.PV_gen = Param(model.T, initialize=PV)

model.Eout_pv = Var(model.T, bounds=(0, 100))

def pv_export(model, t):
    return model.Eout_pv[t] <= model.PV_gen[t]   
model.pv_export = Constraint(model.T, rule=pv_export)
2021-11-15 13:23:38

merci beaucoup! Il a travaillé. J'ai vraiment l'apprécier.
Simon Colver
0

@pybegginer la réponse est tout à fait correct. Cependant, je tiens également à souligner que Pyomo support natif pour numpy/pandas types de données s'améliore. Dans Pyomo 6.2 (à cause autour de 17 Novembre 2021); la suite (plus naturelle de la syntaxe) devrait fonctionner:

from pyomo.common.dependencies import pandas as pd, pandas_available
from pyomo.environ import *
df = pd.DataFrame(index=['20-1', '20-2', '20-3'],
                  data={'pv_gen': [1, 2, 4]})
print(df)

ce qui donne:

      pv_gen
20-1       1
20-2       2
20-3       4

Alors:

model = ConcreteModel()

model.T = Set(initialize=df.index, ordered=True)
model.PV_gen = Param(model.T, initialize=df.pv_gen)

model.Eout_pv = Var(model.T, bounds=(0, 100))

def pv_export(model, t):
    return model.Eout_pv[t] <= model.PV_gen[t]   
model.pv_export = Constraint(model.T, rule=pv_export)

model.pprint()

serait de retour

1 Set Declarations
    T : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    3 : {'20-1', '20-2', '20-3'}

1 Param Declarations
    PV_gen : Size=3, Index=T, Domain=Any, Default=None, Mutable=False
        Key  : Value
        20-1 :     1
        20-2 :     2
        20-3 :     4

1 Var Declarations
    Eout_pv : Size=3, Index=T
        Key  : Lower : Value : Upper : Fixed : Stale : Domain
        20-1 :     0 :  None :   100 : False :  True :  Reals
        20-2 :     0 :  None :   100 : False :  True :  Reals
        20-3 :     0 :  None :   100 : False :  True :  Reals

1 Constraint Declarations
    pv_export : Size=3, Index=T, Active=True
        Key  : Lower : Body          : Upper : Active
        20-1 :  -Inf : Eout_pv[20-1] :   1.0 :   True
        20-2 :  -Inf : Eout_pv[20-2] :   2.0 :   True
        20-3 :  -Inf : Eout_pv[20-3] :   4.0 :   True

L'OP du modèle original serait encore le rendement d'une erreur; toutefois, il serait pour une autre raison: l'Initialisation de l'Ensemble avec model.T = Set(initialize=df.index.tolist(), ordered=True) donnerait un Ensemble avec les valeurs de la DataFrame de l'index (comme dans l'exemple ci-dessus). Toutefois, lorsque vous initialisez une indexé Param avec une liste, les "indices" de la liste sont les entiers 0..len(list_data)-1 (c'est à dire, c'est un raccourci pour l'initialisation avec dict(enumerate(list_data)). Comme l'indice de PV_gen est le DataFrame de l'indice de colonne, vous vous retrouvez avec l'erreur:

KeyError: "Index '0' is not valid for indexed component 'PV_gen'"
2021-11-15 16:42:04

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................