Pyomo: कैसे करने के लिए सूचकांक चर में केवल एक सेट का हिस्सा?

0

सवाल

मैं कोशिश कर रहा हूँ का ट्रैक रखने के लिए एसओसी में एक pyomo अनुकूलन मॉडल. मैं संख्या के BEVs और मैं करने के लिए चाहते हैं keept का ट्रैक eachs समाज । के xpression मैं पारित करने के लिए pe.Objective निम्नलिखित की तरह दिखता है:

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

model.buses और model.times दो सेट कर रहे हैं मैं के रूप में घोषित किया pe.Set. समय से जाना (0, ...., 95). इतने में अंतिम यात्रा के लिए model.times यह की कोशिश करता है का उपयोग करने के लिए model.SOC[96, b] क्या करने के लिए सुराग KeyError.

वहाँ एक तरीका है बताने के लिए pyomo करने के लिए leafe बाहर के अंतिम तत्व सेट करने के लिए इस त्रुटि को रोकने?

किसी चीज़ की तरह:

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

जो दुख की बात यह भी उठता है एक त्रुटि:

IndexError: times indices must be integers, not slice

यहाँ है एक आपके minmal उदाहरण होना चाहिए कि त्रुटि को पुन: पेश:

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

अग्रिम में बहुत धन्यवाद!

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

सबसे अच्छा जवाब

1

हाँ, वहाँ रहे हैं दो तरीके से ऐसा करने के लिए. सबसे पहले, यदि सेट है कि आप चाहते हैं करने के लिए सूचकांक में आदेश दिया है (जो डिफ़ॉल्ट है), आप का उपयोग कर सकते हैं first, lastहै , और prev तरीकों पर सेट में विभिन्न तरीकों से. (देखें मेरा संपादन करने के लिए अपने कोड के नीचे)

दूसरे, आप हमेशा कर सकते हैं का निर्माण अपने खुद के सबसेट और या तो यह जगह में मॉडल या नहीं. दूसरा मॉडल नीचे से पता चलता है के निर्माण के एक मनमाने ढंग से जटिल सबसेट और में डालता है । इस सेट में इस्तेमाल किया जा सकता है के रूप में आधार के लिए एक उद्देश्य या बाधा.

इस समाधान के समान है, इस का जवाब

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

पैदावार:

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

सही है, धन्यवाद! :) इस prevw मेरी समस्या का हल. वहाँ एक जगह है, जहां इंटरनेट पर सीख सकते हैं इस? में pyomo प्रलेखन prevw भी उल्लेख नहीं है (या कम से कम मैं इसे नहीं देखा है)
Andre

हाँ, IMHO, Pyomo प्रलेखन मूल बातें शामिल है, लेकिन में कमी है अच्छा मॉड्यूल प्रलेखन. यह "ठीक है", लेकिन महान नहीं... मैं नहीं जाना जाता है prevw के बिना है कि अन्य पोस्ट. कभी कभी मैं टिंकर में ipython पता चलता है जो प्राप्तियां और डॉक्टर stubs. pyomo.readthedocs.io/en/expr_dev/_modules/index.html
AirSquid

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में