Pyomo: comment l'indice de Variable dans une partie d'un Ensemble?

0

La question

Je suis en train d'essayer de garder une trace de la Cps dans un pyomo modèle d'optimisation. J'ai le numéro de Veb et je veux respectée piste de eachs SOC. L'xpression je passe à pe.Objective se présente comme suit:

sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times)

model.buses et model.times sont deux Jeux que j'ai déclaré que pe.Set. Le temps d'aller de (0, ...., 95). Ainsi, dans la dernière itération de la model.times il tente d'accéder à model.SOC[96, b] ce qui conduit à une KeyError.

Est-il un moyen de dire pyomo à leafe le dernier élément de l'ensemble pour éviter cette Erreur?

Quelque chose comme:

sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times[0:-2])

qui, malheureusement, soulève également une Erreur:

IndexError: times indices must be integers, not slice

voici une minmal exemple qui devrait reproduire l'Erreur:

import pyomo.environ as pe

solver = pe.SolverFactory('glpk')
model = pe.ConcreteModel('Test')
model.times = pe.Set(initialize=list(range(96)))
model.buses = pe.Set(initialize=list(range(5)))
model.SOC = pe.Var(model.times*model.buses, domain=pe.PositiveReals)

def example_rule(model):
    return sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times)

model.obj = pe.Objective(rule=example_rule, sense=pe.maximize)

model.pprint()

Merci beaucoup d'avance!

optimization pyomo python
2021-11-16 15:17:42
1

La meilleure réponse

1

Oui, il ya un couple de façons de le faire. Tout d'abord, si le jeu que vous voulez indexer en est ordonnée (qui est par défaut), vous pouvez utiliser le first, lastet prev des méthodes sur l'ensemble de diverses manières. (voir mes modifications de votre code ci-dessous)

Deuxièmement, vous pouvez toujours construire votre propre sous-ensemble et soit la placer dans le modèle ou pas. Deuxième modèle ci-dessous montre la construction d'un arbitrairement complexe sous-ensemble et la met dans le modèle. Cet ensemble pourrait être utilisé comme base pour un objectif ou une contrainte.

Cette solution est similaire à cette réponse

import pyomo.environ as pe

solver = pe.SolverFactory('glpk')
model = pe.ConcreteModel('Test')
model.times = pe.Set(initialize=list(range(5)), ordered=True)  # ordered is default, this is for clarity...
model.buses = pe.Set(initialize=list(range(2)))
model.SOC = pe.Var(model.times*model.buses, domain=pe.PositiveReals)

def example_rule(model):
    return sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times if t != model.times.last())

model.obj = pe.Objective(rule=example_rule, sense=pe.maximize)

model.pprint()


# making your own subset...
times = 10
model2 = pe.ConcreteModel("other")
model2.times = pe.Set(initialize=range(times))
# make a subset of the even values that are no more than 4 values close to the end....
model2.times_subset = pe.Set(initialize=[t for t in model2.times if t%2==0 and t <= times-4])

model2.pprint()

Rendements:

3 Set Declarations
    SOC_index : Size=1, Index=None, Ordered=True
        Key  : Dimen : Domain      : Size : Members
        None :     2 : times*buses :   10 : {(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1), (4, 0), (4, 1)}
    buses : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    2 : {0, 1}
    times : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    5 : {0, 1, 2, 3, 4}

1 Var Declarations
    SOC : Size=10, Index=SOC_index
        Key    : Lower : Value : Upper : Fixed : Stale : Domain
        (0, 0) :     0 :  None :  None : False :  True : PositiveReals
        (0, 1) :     0 :  None :  None : False :  True : PositiveReals
        (1, 0) :     0 :  None :  None : False :  True : PositiveReals
        (1, 1) :     0 :  None :  None : False :  True : PositiveReals
        (2, 0) :     0 :  None :  None : False :  True : PositiveReals
        (2, 1) :     0 :  None :  None : False :  True : PositiveReals
        (3, 0) :     0 :  None :  None : False :  True : PositiveReals
        (3, 1) :     0 :  None :  None : False :  True : PositiveReals
        (4, 0) :     0 :  None :  None : False :  True : PositiveReals
        (4, 1) :     0 :  None :  None : False :  True : PositiveReals

1 Objective Declarations
    obj : Size=1, Index=None, Active=True
        Key  : Active : Sense    : Expression
        None :   True : maximize : SOC[1,0] - SOC[0,0] + SOC[1,1] - SOC[0,1] + SOC[2,0] - SOC[1,0] + SOC[2,1] - SOC[1,1] + SOC[3,0] - SOC[2,0] + SOC[3,1] - SOC[2,1] + SOC[4,0] - SOC[3,0] + SOC[4,1] - SOC[3,1]

5 Declarations: times buses SOC_index SOC obj
2 Set Declarations
    times : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :   10 : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    times_subset : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    4 : {0, 2, 4, 6}

2 Declarations: times times_subset
[Finished in 553ms]
2021-11-16 17:03:25

parfait, merci! :) Ce prevw résout mon problème. Est-il un endroit sur internet où l'on peut apprendre? Dans le pyomo documentation prevw n'est même pas mentionné (ou du moins je n'en ai pas vu)
Andre

Ouais, à mon humble avis, le Pyomo documentation couvre les notions de base, mais il est manquant dans la bonne documentation du module. C'est "bon" mais pas génial... je n'aurais pas su prevw sans que l'autre post. Parfois, je bricole dans ipython qui montre les achèvements et les doc talons. pyomo.readthedocs.io/en/expr_dev/_modules/index.html
AirSquid

Dans d'autres langues

Cette page est dans d'autres langues

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