Pyomo: Değişkeni bir Kümenin yalnızca bir bölümünde nasıl dizine ekleyebilirim?

0

Soru

Soc'leri takip etmeye çalışıyorum. pyomo optimizasyon modeli. Birkaç BEV'İM var ve her bir soc'yi takip etmek istiyorum. Geçtiğim xpression pe.Objective aşağıdaki gibi görünüyor:

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

model.buses ve model.times olarak ilan ettiğim iki Set var mı pe.Set. Zaman (0, ...., 95). Yani son yinelemede model.times erişmeye çalışır model.SOC[96, b] ne bir yol açar KeyError.

Pyomo'ya bu Hatayı önlemek için kümenin son öğesini bırakmasını söylemenin bir yolu var mı?

Gibi bir şey :

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

ne yazık ki bu da bir Hataya neden oluyor:

IndexError: times indices must be integers, not slice

işte Hatayı yeniden üretmesi gereken küçük bir örnek:

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()

Şimdiden çok teşekkürler!

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

En iyi cevabı

1

Evet, bunu yapmanın birkaç yolu var. İlk olarak, içine dizin oluşturmak istediğiniz küme sıralanmışsa (varsayılan olan), aşağıdakileri kullanabilirsiniz: first, last, ve prev setteki yöntemler çeşitli şekillerde. (aşağıdaki kodunuzdaki düzenlemelerime bakın)

İkincisi, her zaman kendi alt kümenizi oluşturabilir ve modele yerleştirebilir veya yerleştiremezsiniz. Aşağıdaki ikinci model, keyfi olarak karmaşık bir alt kümenin yapımını gösterir ve modele koyar. Bu küme, bir amaç veya kısıtlama için temel olarak kullanılabilir.

Bu çözüm bu cevaba benzer

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()

Verimler:

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

mükemmel, teşekkürler! :) Bunca prevw sorunumu çözüyor. İnternette bunu öğrenebilecek bir yer var mı? Pyomo belgelerinde prevw bahsedilmiyor bile (ya da en azından görmedim)
Andre

Evet, IMHO, Pyomo dokümantasyonu temelleri kapsar, ancak iyi modül dokümantasyonunda eksiktir. Bu "tamam" ama harika değil... Birşey bilmiyorum prevw diğer yazı olmadan. Bazen tamircilik yaparım. ipython tamamlamaları ve doktor taslaklarını gösterir. pyomo.readthedocs.io/en/expr_dev/_modules/index.html
AirSquid

Diğer dillerde

Bu sayfa diğer dillerde

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