Я пытаюсь написать математическую программу в программе 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, поэтому это, вероятно, что-то основное. Большое спасибо
Можете ли вы рассказать нам, на какую строку указывает ошибка? Похоже, что либо 'model.branch_tbus', либо' model.branch_tbus [j] '(или эквивалент на' 'fbus') не является итерируемым типом (список, кортеж и т. Д.). –