Pyomo: ako index Premennej iba súčasťou súboru?

0

Otázka

Snažím sa sledovať Soc v pyomo optimalizácia modelu. Som číslo BEVs a chcem keept sledovať eachs SOC. Na xpression som prejsť na pe.Objective vyzerá to takto:

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

model.buses a model.times sú dve Sady mám deklarovaný pe.Set. Časy ísť od (0, ...., 95). Takže v poslednej iterácii pre model.times to sa snaží prístup model.SOC[96, b] čo vedie k KeyError.

Existuje spôsob, ako povedať, pyomo na leafe sa posledný prvok nastaviť, aby sa zabránilo tejto Chyby?

Niečo ako:

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

ktorá bohužiaľ tiež vyvoláva Chybu:

IndexError: times indices must be integers, not slice

tu je minmal príklad, ktorý by reprodukovať Chybu:

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

Vďaka vopred!

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

Najlepšiu odpoveď

1

Áno, existuje niekoľko spôsobov, ako to urobiť. Po prvé, ak súbor, ktorý chcete index do objednaný (ktorý je predvolený), môžete použiť first, lasta prev metódy na nastavené rôznymi spôsobmi. (pozri môj úpravy váš kód nižšie)

Po druhé, vždy sa môžete postaviť svoj vlastný podmnožinu a buď umiestniť ho v modeli, alebo nie. Druhý model znázorňuje výstavby ľubovoľne zložité podmnožinu a zaradí ho do modelu. Tento súbor môže byť použitý ako základ pre objektívny alebo obmedzenia.

Toto riešenie je podobné na to odpovedať

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

Výnosy:

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

perfektné, ďakujem! :) Toto prevw vyrieši môj problém. Je tu miesto na internete, kde sa človek môže učiť sa to? V pyomo dokumentácia prevw nie je dokonca spomenul (alebo aspoň nevidel som to)
Andre

Jo, IMHO, na Pyomo dokumentácia zahŕňa základy, ale chýba v dobrom modul dokumentácia. To je "v poriadku", ale nie veľký... ja by som to vedela prevw bez toho, že iné miesto. Niekedy som sa pohrať v ipython ktorý ukazuje, dokončených a doc výhonkov. pyomo.readthedocs.io/en/expr_dev/_modules/index.html
AirSquid

V iných jazykoch

Táto stránka je v iných jazykoch

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