Pyomo:어떻게 지수의 변수에서 유의 일부입니까?

0

질문

나를 추적하려고의 Soc 에 pyomo 최적화 모델입니다. 나의 번호를 가지고 있 BEVs 하고 싶 keept 추적 eachs SOC. 이 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.busesmodel.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

Yes,거기에 몇 가지 방법으로 수행할 수 있습니다. 첫째,경우에는 설정하려면 원하는 인덱스로 주문하는(기본값)를 사용할 수 있습니다 first, lastprev 방법 설정에서 다양한 방법이다. (내 편집하는 코드는 아래)

두번째,당신은 항상성에 자신의 하위 집합과 어느 곳에서 그것의 모델 나지 않습니다. 두 번째 모델은 아래와 같 건설의 임의로 복잡한 부분 집합에 넣는 모델입니다. 이 설정할 수 있으로 사용될 기준에 대한 목적 또는 제약 조건이 있습니다.

이 솔루션은 이와 유사한

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

그래요,이 문서를 작성하는 Pyomo 설명서의 기초를 다루지만,부족에 좋은 모듈을 설명서입니다. 이것은"좋아요"하지만...나는 알 prevw 지 않고는 다른다. 가끔 팅커에서 ipython 을 보여주는 달성하고 doc 스텁. pyomo.readthedocs.io/en/expr_dev/_modules/index.html
AirSquid

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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