我想在一个名为pyomo(python库)的程序中编写数学程序。下面,模型是我声明的一个对象,BRANCH
是一个集合; model.branch_scpt
,model.M
,model.branch_tbus
和model.branch_fbus
都是参数列表,它们在代码执行时作为输入加载(它们都具有dimension = BRANCH)。另外,model.bus_angle
,model.line_flow
和model.z_line
是决策变量的列表(全部也是维度BRANCH)。这是我的约束类型之一的定义,其中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)
请注意,在约束Line_FlowA[j]
引用的元素model.bus_angle[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)
但我获得了同样的错误。
最后,在t值和f为不可变的类型我试图转换:
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'”上的等价物)似乎不是可迭代类型(列表,元组等)。 – 2012-03-03 05:03:15