2

MathProgで書かれた線形プログラムがあります。私の不明なバイナリ変数は、次のように定義された 2 次元配列です。

var x{i in V, l in L}, >=0, <=1;

ここで、V と L は整数の集合です。

ただし、一部の変数の値は事前にわかっているため、ILP のサイズを小さくするためにソルバーにこれを指定したいと考えています。たとえば、l=2 の場合は x[4,l] が 1 であり、l のその他の値の場合はゼロであることを知っています。現在、これを制約として指定しています。

s.t. initial4{i in V: i=4}:   sum{l in L}(l*x[i,l]) = 2;

これが、未知数のサブセットの値を事前に指定する効率的な方法であるかどうか疑問に思っていました。

理想的には、そのような情報をモデル ファイルではなく、データ セクションと一緒に別のファイルに配置したいと考えています。

4

1 に答える 1

2

各変数の上限と下限を作成します。

var x{i in index_set}, >=x_L[i], <=x_U[i];

既知の値の下限と上限を調整します。

x[2]ゼロに修正する MathProg スニペットを次に示します。

set index_set;

param x_L{index_set};
param x_U{index_set};

var x{i in index_set}, >=x_L[i], <=x_U[i];

s.t.

dummy:
  sum{i in index_set} x[i] = 2;

solve;

display x;

data;

set index_set := 1, 2, 3;

param x_L default 0;
param x_U default 1 :=
2 0;

end;

x[2](フィルター処理された) 出力から、プリプロセッサが0に修正できるほどスマートであることは明らかです。

glpsol --math test.mod 

OPTIMAL SOLUTION FOUND BY LP PREPROCESSOR

x[1].val = 1
x[2].val = 0
x[3].val = 1
于 2012-05-16T15:57:10.703 に答える