5

私は論理的にできるはずのことをしようとしています。ただし、線形計画法の領域内でこれを行う方法がわかりません。私は ZMPL/SCIP を使用していますが、これはほとんどの人にとって読みやすいはずです。

set I := {1,2,3,4,5};
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50;

var a;
var b;

subto bval:
  b == 2;

subto works:
  a == u[2];

#subto does_not_work:
#  a == u[b];

変数が のインデックスのa値と等しいことを確認しようとしています。したがって、たとえば、私はそれを確認してから、制約を設定しようとしましたが、それは機能しません。変数でインデックスを作成しようとしていると不平を言っています。しかし、私はちょうど行うことができます。これは に等しくなります。 bub == 2a == u[b]a == u[2]a20

u変数で指定されたインデックスに簡単にアクセスする方法はありますか? ヘルプ/ガイダンスをありがとう。


編集: コンセンサスは、もは​​や LP にならないため、これは不可能だということだと思います。その場合、 の値に応じてb、 set から関連する値を取得できるように、これを記述する別の方法を考えられる人はいuますか? これは、直接インデックスを作成することを避ける必要があります。


解決策 : Ram からの回答に基づいて、私はそれを試してみることができ、それが間違いなく実行可能で直線的な解決策であることがわかりました。ありがとう、ラム!ZMPL のサンプル ソリューション コードは次のとおりです。

set I := {1,2,3,4,5};
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50;

var a;
var b;
var y[I] binary;

subto bval:
  b == 4;

subto only_one:
  sum <i> in I : y[i] == 1;

subto trick:
  b == (sum <i> in I : y[i] * i);

subto aval:
  (sum <i> in I : u[i]*y[i]) == a;
4

1 に答える 1

4

はい、いくつかの追加の 0/1 変数 (指標変数) を導入することで、制約を書き直して線形化できます。この種のトリックは、整数計画法では珍しくありません。

英語での制約

b1 から 5 までの値を取ることができます。 b = {1..5}

b の値に応じて、変数aは次のようになります。u[b]

指標変数

5 つの変数を導入しましょうY- Y1..Y5 (b の可能な値ごとに 1 つ)

どの時点でも、そのうちの 1 つだけが true になります。

 Y1 + Y2 + Y3 + Y4 + Y5 = 1
 All Y's are binary {0,1}

これがトリックです。b がその値の場合にのみ、対応する Y 変数が値 1 になるように、1 つの線形制約を導入します。

b - 1xY1 - 2xY2 - 3xY3 - 4xY4 - 5xY5 = 0

(たとえば、b が 3 の場合、上記の制約により、Y3 は強制的に 1 になります。)

ここでa、値 u[b] を取りたいと思います。

 a = u[1]xY1 + u[2]xY2 + u[3]xY3 + u[4]xY4 + u[5]xY5 

u[ 1] ...u[5] は事前に既知の定数であるため、上記の制約も線形です。

整数計画法におけるこれらの種類の IF-THEN 条件に関するリファレンスの 1 つを次に示します。これらのトリックの多くには Big-M が関係していますが、この場合は必要ありませんでした。

あなたが前進するのに役立つことを願っています。

于 2013-07-21T19:40:54.480 に答える