1

私はpyomo.environパッケージで作業しています。私はこのような制約を追加しようとしましたhttp://imgur.com/a/pWJ79。 iとjはノードのインデックスです。pyomo環境下で制約を追加する

node_setにはN0からN5までの合計6つのノードが含まれます。 Arc_setは、[N1、N2]などのノード間のリンクを格納するセットであり、[N1、N1]などの自己ループアークを含んでいません。 Fセットがそう[F1、F2、F3]

が含まれている、私はこのようなものでした:

def c1_rule(m, j): 
    return sum(m.X[e[0], j, f] for e in m.arc_set if e[1] != 'N0' for f in m.f_set) == 1 
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule) 

はしかし、私は[Eである、私のjはIに等しい場合、これはエラーをトリガすることを実現しました0]ここで、mX [i、j、k]のインデックスは[N1、N1、F1]のようなものを持たないからです。一つのアイデアは、アークセットに自己ループアークを加えることです。このエラーを回避できる他の方法はありますか?

答えて

1

まず、警告:

constraint

そうでない場合、それはそのようなものとして記述されていたであろう:あなたが示した制約がX [I、Jは、F] i、jはすべてのために存在していることを前提としてい:あなたは厳密にこの制約を以下している場合

constraints

だから、あなたのコードが正しい、あなただけのパラメータ/変数X EXIのために(ときi == jを含む)すべての確認エントリを作成する必要がありますst。今


あなたの制約ルールは関係なく、arc_setにあるものをすべてjfのために生成されるため、エラーが発生します。

だから、あなたがarc_setで[N1、N2]を持っている場合、変数eがなることが起こる[N1、N2]に等しいとするときj = N1f = F1、次のルール:

m.X[e[0], j, f] 

になります翻訳:Xが存在しないモデルとエントリーX[N1, N1, F1]のパラメータがある場合

m.X[N1, N1, F1] 

これはエラーをトリガすることができます。

あなたがこの問題を解決する方法は、制約ルールのリスト内包表記でe[0] != jを含むことにより、次のとおりです。

def c1_rule(m, j): 
    return sum(m.X[e[0], j, f] for e in m.arc_set for f in m.f_set 
           if e[1] != 'N0' and e[0] != j) == 1 
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule) 
関連する問題