2012-03-03 7 views
0

私はpyomo(pythonライブラリ)というプログラムで数学的プログラムを書こうとしています。以下、モデルは既に私が宣言したオブジェクトですBRANCHがセットです。 model.branch_scptmodel.Mmodel.branch_tbus、およびmodel.branch_fbusは、コード実行時に入力としてロードされるすべてのパラメータリストです(これらのパラメータはすべてdimension = BRANCHです)。さらに、model.bus_angle,model.line_flowおよびmodel.z_lineは、決定変数のリストです(すべてがディメンションブランチです)。制約Line_FlowA[j]で参照される要素model.bus_angle[j]model.branch_tbus[j](同様に、要素model.branch_fbus[j]戻っている)に戻り、その要素に依存していること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) 

注意:これはjBRANCHである私の制約タイプの一つの定義です。しかし、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'の等価物)は、繰り返し可能な型(list、tupleなど)ではないようです。 –

答えて

1

フュルスト時間これを見ますが、ソースをinptecting、私たちが見ることができるが、class _ParamValue定義されたhereclass 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

+0

@ user1246364あなたのニーズを満たしている場合は、明らかに回答を受け入れることができます – Odomontois

関連する問題