Python - 使用依赖于输入值的数组索引

时间:2012-03-03 04:14:18

标签: python arrays indices

我正在尝试在名为pyomo(python库)的程序中编写数学程序。下面,model是我已声明的对象,BRANCH是一个集合; model.branch_scptmodel.Mmodel.branch_tbusmodel.branch_fbus都是在代码执行时作为输入加载的参数列表(它们都具有dimension = BRANCH)。此外,model.bus_anglemodel.line_flowmodel.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的新手,所以它可能是基本的东西。非常感谢

1 个答案:

答案 0 :(得分:1)

首先看到这一点,但是在检查来源时,我们可以看到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)

但是,如果这些参数保留了其他参数的索引,那当然可以工作。