2012-03-03 2 views
0

Я пытаюсь написать математическую программу в программе pyomo (библиотека python). Ниже модель - это объект, который я уже объявил, BRANCH - это набор; model.branch_scpt, model.M, model.branch_tbus и model.branch_fbus - все списки параметров, которые загружаются как входные данные при выполнении кода (все они имеют размерность = ФИЛИАЛ). Кроме того, model.bus_angle, model.line_flow и model.z_line являются списками переменных решения (все также размерного ФИЛИАЛА). Это определение одного из моих типов ограничений, где j в BRANCH:Python - Использование индекса массива, который зависит от входного значения

def Line_FlowA_rule(model,j):  

    return (model.branch_scpt[j]*(model.bus_angle[model.branch_tbus[j]] 
            - model.bus_angle[model.branch_fbus[j]]) 
      - model.line_flow[j] + (1 - model.z_line[j]) * model.M[j] >= 0) 

model.Line_FlowA = Constraint(model.BRANCH, rule=LineFlowA_rule) 

Обратите внимание, что элемент model.bus_angle[j] ссылается ограничение Line_FlowA[j] зависит от того элемента, который model.branch_tbus[j] возвращается (аналогично, элемент, который model.branch_fbus[j] возвращается). Однако model.branch_tbus[j] этого значения входных данных, и я считаю, что это то, что вызывает следующую ошибку:

"Unexpected exception while running model arpatest_nbp_constraint.py 
     Unable to index variable bus_angle using supplied index with unhashable type: '_ParamValue'" 

Для того, чтобы сделать функцию аккуратнее, я попытался переопределить функцию следующим образом:

def Line_FlowA_rule(model,j): 

    t = model.branch_tbus[j] 
    f = model.branch_fbus[j] 

    return (model.branch_scpt[j]*(model.bus_angle[f] 
            - model.bus_angle[t]) 
      - model.line_flow[j] + (1 - model.z_line[j]) * model.M[j] >= 0) 

model.Line_FlowA = Constraint(model.BRANCH, rule=Line_FlowA_rule) 

, но я получил ту же ошибку.

Наконец, для преобразования значений т и п в неизменных типов я пробовал:

def Line_FlowA_rule(model,j): 

    t = tuple(model.branch_tbus[j]) 
    f = tuple(model.branch_fbus[j]) 

    return (model.branch_scpt[j]*(model.bus_angle[f] 
            - model.bus_angle[t]) 
      - model.line_flow[j] + (1 - model.z_line[j]) * model.M[j] >= 0) 

model.Line_FlowA = Constraint(model.BRANCH, rule=Line_FlowA_rule) 

Это привело к ошибке:

ERROR: Unexpected exception while running model arpatest_nbp_constraint.py 
     '_ParamValue' object is not iterable 

Может кто-нибудь пожалуйста, скажите мне, что я делаю неправильно здесь ? Я новичок в python, поэтому это, вероятно, что-то основное. Большое спасибо

+0

Можете ли вы рассказать нам, на какую строку указывает ошибка? Похоже, что либо 'model.branch_tbus', либо' model.branch_tbus [j] '(или эквивалент на' 'fbus') не является итерируемым типом (список, кортеж и т. Д.). –

ответ

1

Ферст раз, видя это, но inptecting источник, мы можем видеть, что class _ParamValue определенный here расширяет class NumericConstant, определяется here, из кода, мы можем узнать, есть атрибут value, поэтому единственное, что я могу предложить изменить код примерно так:

def Line_FlowA_rule(model,j): 

    t = model.branch_tbus[j].value 
    f = model.branch_fbus[j].value 

    return (model.branch_scpt[j]*(model.bus_angle[f] 
            - model.bus_angle[t]) 
      - model.line_flow[j] + (1 - model.z_line[j]) * model.M[j] >= 0) 

model.Line_FlowA = Constraint(model.BRANCH, rule=Line_FlowA_rule) 

Но это может работать, конечно, если эти параметры содержат индексы для других параметров.

+0

Спасибо вам большое! Все это исправлено. Хотел бы я проголосовать, но у меня недостаточно высокая репутация. Ты замечательный! – user1246364

+0

@ user1246364 Очевидно, что вы можете принять ответ, если он удовлетворен вашими потребностями – Odomontois

Смежные вопросы