1

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

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)

ただし、mX[i、j、k] のインデックスには [N1、N1、F1] のようなものがないため、j が i、ここでは e[0] に等しい場合、これはエラーを引き起こすことに気付きました。 . 1 つの考えは、自己ループ アークをアーク セットに追加することです。このエラーを回避できる他の方法はありますか?

4

1 に答える 1

1

まず、警告: あなたが示した制約は、すべての i と j に対して X[i,j,f] が存在することを前提としています:

制約

それ以外の場合は、次のように記述されていたはずです。

制約

したがって、この制約に厳密に従っている場合、コードは正しいので、i == jパラメーター/変数 X のすべてのエントリ ( when を含む) が存在することを確認するだけで済みます。


jここで、 の内容にf関係なく、すべてに対して制約ルールが生成されるため、エラーが発生しますarc_set

そのため、 に [N1, N2] があるarc_set場合、変数eは [N1, N2] に等しくなり、 と の場合j = N1f = F1次のルールが適用されます。

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

に翻訳されます:

m.X[N1, N1, F1]

Xがモデルのパラメーターであり、エントリ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)
于 2016-12-08T14:22:52.557 に答える