我正在尝试在一个名为 pyomo(python 库)的程序中编写一个数学程序。下面,模型是我已经声明的一个对象,BRANCH
是一个集合;model.branch_scpt
, model.M
, model.branch_tbus
, 和model.branch_fbus
都是在代码执行时作为输入加载的参数列表(它们都有维度 = BRANCH)。此外,model.bus_angle
、model.line_flow
和model.z_line
是决策变量列表(也都是维度 BRANCH)。这是我的一种约束类型的定义,其中j
是BRANCH
:
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)
但我得到了同样的错误。
最后,为了将值 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 新手,所以它可能是基本的东西。非常感谢