私は論理的にできるはずのことをしようとしています。ただし、線形計画法の領域内でこれを行う方法がわかりません。私は 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
値と等しいことを確認しようとしています。したがって、たとえば、私はそれを確認してから、制約を設定しようとしましたが、それは機能しません。変数でインデックスを作成しようとしていると不平を言っています。しかし、私はちょうど行うことができます。これは に等しくなります。 b
u
b == 2
a == u[b]
a == u[2]
a
20
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;