0

pyomo(Pythonライブラリ)というプログラムで数学プログラムを書こうとしています。以下では、モデルは私がすでに宣言したオブジェクトでBRANCHあり、セットです。model.branch_scpt、、、およびはすべてmodel.M、コードの実行時に入力としてロードされるパラメーターリストです(これらはすべてディメンション= BRANCHです)。さらに、、、およびは決定変数のリストです(すべてディメンションBRANCHのリストでもあります)。これは私の制約タイプの1つの定義です。ここで、は次のとおりです。model.branch_tbusmodel.branch_fbusmodel.bus_anglemodel.line_flowmodel.z_linejBRANCH

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を初めて使用するので、おそらく基本的なものです。どうもありがとう

4

1 に答える 1

1

これを見て初めてですが、ソースを調べてみると、ここclass _ParamValueで定義されているのは拡張されており、ここで定義されているのは、属性があることを学ぶことができるコードからです。したがって、私が提案できる唯一のことは、次のようなコードを変更することです。class NumericConstantvalue

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)

ただし、これらのパラメーターが他のパラメーターのインデックスを保持している場合は、もちろん機能します。

于 2012-03-03T05:11:38.647 に答える