0

PuLP を使用して FLP を解決しようとしています。変数値に論理制約を追加したい。

LpVariable f があり、 C は LpVariables のリストです。問題の制約に f を追加したいのですが、これは c[i] の値に依存します。

以下はコードスニペットです >

prob = LpProblem("The MILP problem", LpMinimize)

最初の制約を追加:

prob += lpSum(c[i] for i in range (len(c))) == 2

ここで、次の制約を追加します。

  if`lpSum(c[i] for i in range (len(c))) > 1:
`     prob += f == 1  
  else:
      prob += f == 0


prob += lpSum(c[i] for i in range (len(c)) + f )

ここでの問題は、LpVariables c[i] が初期化されNoneているため、計算中にエラーがスローされることlpSum()です。

私がはっきりしていることを願っています。このクエリを理解するのに助けが必要かどうか教えてください。ただし、与えられたコード スニペットで十分だと思います。

4

1 に答える 1

1

3 つのポイント:

(1) 最初の制約により、lpsum が 2 に等しくなるように強制されるため、この例では f は常に 1 になります。式が正しいと確信していますか?

(2) ステートメントを lpSum と組み合わせて使用​​できない場合 - 実際の制約として定式化する必要があります。

たとえば、f をバイナリ変数として定義し、次の制約を追加できます。

prob += lpSum(c[i] for i in range (len(c))) - 1 <= M*f 

ここで、M は十分に大きな数です。次に、f==0 の場合、「lpsum() <= 1」があり、f==1 の場合、lpsum は何でもかまいません。そのタイプの制約をいじって、 f が思いどおりに動作するようにします。

(3) 制約 "prob += lpSum(c[i] for i in range (len(c)) + f )" は、MILP の目的でない限り何もしませんか? その場合は、prob = LpProblem("The MILP problem", LpMinimize) の直後に追加する必要があります。

幸運を

于 2015-10-27T08:20:38.153 に答える