2016-12-01 7 views
1

내 문제를 조사해 주셔서 고마워요! 나는 pyomo를 처음 사용하고 있으며 이제는 구체적인 모델을 풀기 위해 pyomo를 사용하려고합니다. 여기Pyomo "data = None"출력 오류

내 코드의 일부이다

--- (편집)

def objective_rule(model): 
     ans = sum(model.DAEB[t] * model.DAEP[t] for t in model.t) 
     ans -= sum(model.DARUP[t] * model.RU[t] + model.DARDP[t] * model.RD[t] for t in model.t) 
     ans += sum(0.5 * (sum(model.penalty[t, w]) + sum(-model.RTEP[t] * (model.DAEB[t] - ((model.RTRD[t, w] * model.RU[t]) + 
       sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w) 
     ans += 0.95 * (model.epslon + 1/(0.5) * sum(0.01 * model.miu[w] for w in model.w)) 
     return ans 
  • 톤가 일 세트 [0시 23분, 시간 시간으로 정의된다;
  • w는 [0,1]로 정의됩니다. 다른 시나리오입니다.
  • v는 [0:29], 30 가지 샘플입니다.

목적 함수를 정의하기 전에 위의 모델 변수와 관련된 일련의 제약 조건을 정의했습니다.

모든 것이 마지막 단계까지를 제외하고 원활하게 실행, pyomo을 제공합니다

--- 모든

Traceback (most recent call last): 
    line 61, in <module> 
    myresult = result.solve(project, pricefile, reg_dispatch, SOC=0, SOC_margin=0.05) 

    line 56, in solve 
    opti_model, result = self.Fr_optimal_bidding_optimization(self.vehicles, pricefile, reg_dispatch, SOC) 

    line 347, in Fr_optimal_bidding_optimization 
    model.objective = Objective(rule=objective_rule, sense=minimize, doc='minimize the total cost') 

    line 483, in __setattr__ 
    self.add_component(name, val) 

    line 849, in add_component 
    val.construct(data) 

    line 307, in construct 
    tmp = _init_rule(_self_parent) 

    line 337, in objective_rule 
    sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w) 

ERROR: Rule failed when generating expression for objective objective: 
    line 337, in <genexpr> 
    TypeError: '_GeneralVarData' object is not iterable 
    sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w) 

ERROR: Constructing component 'objective' from data=None failed: 
TypeError: '_GeneralVarData' object is not iterable 
    TypeError: '_GeneralVarData' object is not iterable 

먼저 (편집), 나는 _GeneralVarData 개체에 대한 정말 혼란 스러워요 및 모른다 그것은 무엇을 말하는가, 둘째로, 나는 내 목적 함수에서 문제를 볼 수 없다. 그래서 어떤 사람이라도 조언을 해줄 수 있다면 크게 감사 하리라 !!

는 (내 질문에 명확하게 명시되지 않은 경우 또한 "유래는,"앞에 사과하고 새로운 오전!)

+0

이 오류를 일으키는 표현식 부분을 분리 할 수있을 때까지 먼저 표현식 부분을 주석으로 처리하는 것이 좋습니다. 이런 큰 표정을보고 문제를 골라내는 것은 어렵습니다. –

+0

안녕하세요 개 브! 조언을 주셔서 너무 고마워요. 내 글을 다시 수정했습니다. –

+0

편집 된 게시물이 있더라도이 오류가 표시되는 이유가 명확하지 않습니다. 우리는 관련 변수의 정의를 볼 필요가 있다고 생각합니다. –

답변

2

에서 예외는 다음 코드에 의해 실행됩니다 당신의 마지막 줄에 두 번째 :

sum(model.veh_pwer_dem[t, v, w]) 

이것은 반복 가능로서 model.veh_pwer_dem[t, v, w]를 (라)를 처리하고 그 키 (인덱스)를 통해 합산하려고. 또한 표현식의 논리적 구조에 다른 문제가있는 것으로 보입니다. 나는 표현을 작은 덩어리로 나누어서 명확하게 유지하는 것이 좋습니다. 예 :

def objective_rule(model): 
    ans = sum(model.DAEB[t] * model.DAEP[t] for t in model.t) 
    ans -= sum(model.DARUP[t] * model.RU[t] + model.DARDP[t] * model.RD[t] for t in model.t) 
    ans += sum(0.5 * (sum(model.penalty[t, w] for t in model.t for w in model.w) + # ... 
    #... 
    return ans 

무엇에 관해서는 _GeneralVarData 개체입니다. _GeneralVarData 개체는 인덱스 된 Var 구성 요소의 일부인 실제 최적화 변수를 나타내는 데 사용되는 내부 Pyomo 구조입니다 (인덱싱되지 않은 Var 구성 요소에 사용되는 내부 구현 인 _SimpleVar 참조). 일반적으로 Pyomo (및 일반적으로 Python)에서 밑줄 (_)로 시작하는 메소드, 속성 및 클래스는 구현에 "비공개"입니다.

+0

안녕하세요! 의견을 보내 주셔서 감사합니다. 나는 당신의 방법에 따라 나의 포스트를 편집했고 당신이 옳다고 생각합니다. 여전히 "model.veh_pwer_dem [t, v, w]"문제로 밝혀졌습니다. –

+0

편집 한 목표 규칙에 발전기를 합산하지 않은'sum()'표현식에 여전히 문제가 있습니다. 예를 들어, 처음'+ =','sum (model.페널티 [t, w])'는 합법적이지 않으며'-model.RTEP [t] * # ... '에는 "for ... in ..."이 없다. 파이썬이 합쳐질 수있는 적절한 generator/list) – jsiirola