2012-03-03 100 views
0

我想在一个名为pyomo(python库)的程序中编写数学程序。下面,模型是我声明的一个对象,BRANCH是一个集合; model.branch_scpt,model.M,model.branch_tbusmodel.branch_fbus都是参数列表,它们在代码执行时作为输入加载(它们都具有dimension = BRANCH)。另外,model.bus_angle,model.line_flowmodel.z_line是决策变量的列表(全部也是维度BRANCH)。这是我的约束类型之一的定义,其中jBRANCHPython - 使用取决于输入值的数组索引

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的新手,所以它可能是一些基本的东西。非常感谢

+0

你能告诉我们错误指向哪条线吗? “model.branch_tbus”或“model.branch_tbus [j]”(或“fbus'”上的等价物)似乎不是可迭代类型(列表,元组等)。 – 2012-03-03 05:03:15

回答

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 2012-03-05 17:01:22

+0

@ user1246364很明显,如果满足您的需求,您可以接受答案 – Odomontois 2012-03-07 19:13:13