数理最適化セミナーのご案内

10.5 モデルの内容の表示(showSystem関数)

 モデルファイルとデータファイルを分離して記述した場合,目的関数や制約式の具体的な情報が記述されないため,記述の誤りをそのまま見過ごしてしまう事があります.showSystem関数は,分離されたモデルファイルとデータファイルから最終的に構成される目的関数Objective,制約式Constraint,対称行列SymmetricMatrixの具体的情報を出力します.showSystem関数は以下の書式で記述されます.

showSystem();

 次のようなモデルを考えます.

Set S;
Element i(set = S);
Parameter c(index = i);
Parameter a(index = i);
Variable x(index = i);
Objective f(type = maximize);
f = sum(c[i] * x[i], i);
x[i] <= a[i];
showSystem();

 データファイルはdat形式で次のように与えられています.

c = [1] 13 [2] 7 [3] 201 [4] 14 [5] 23;
a = [1] 23 [2] 5 [3] 4 [4] 12 [5] 1;

 この場合,次のような出力がなされます.

1-1 (a.smp:8): x[1] <= 23
1-2 (a.smp:8): x[2] <= 5
1-3 (a.smp:8): x[3] <= 4
1-4 (a.smp:8): x[4] <= 12
1-5 (a.smp:8): x[5] <= 1
objective (a.smp:7 name="f"): 13*x[1]+7*x[2]+201*x[3]+14*x[4]+23*x[5] (maximize)

 オブジェクトにname =で名前を与えてからshowSystemでモデル情報を出力すると,表示に指定した名前が使われますのでわかりやすくなります.上記の例にnameを付与した次のモデルに対しては,以下のように出力されます.

Set S(name = "S");
Element i(set = S);
Parameter c(name = "c", index = i);
Parameter a(name = "a", index = i);
Variable x(name = "valx", index = i);
Objective f(name = "obj",type = maximize);
f = sum(c[i] * x[i], i);
Constraint co(name = "co", index = i);
co[i] = x[i] <= a[i];
showSystem();

 出力

1-1 (a.smp:9 name="co[1]"): valx[1] <= 23
1-2 (a.smp:9 name="co[2]"): valx[2] <= 5
1-3 (a.smp:9 name="co[3]"): valx[3] <= 4
1-4 (a.smp:9 name="co[4]"): valx[4] <= 12
1-5 (a.smp:9 name="co[5]"): valx[5] <= 1
objective (a.smp:7 name="obj"): 13*valx[1]+7*valx[2]+201*valx[3]+14*valx[4]+23*valx[5] (maximize)

 showSystem関数は,引数に制約式を与えることで,その制約式のみを出力できます.nameを付与したモデルに関して,次のようにshowSystem関数の引数を変更した場合,以下が出力されます.

showSystem(co[1]);

 出力

1-1 (a.smp:9 name="co[1]"): valx[1] <= 23

 引数に条件式を与える事で,出力させる制約式の範囲を制限させることもできます.次の例では,co[1], co[2]の情報のみを出力させています.

showSystem(co[i], i < 3);

 出力

1-1 (a.smp:9 name="co[1]"): valx[1] <= 23
1-2 (a.smp:9 name="co[2]"): valx[2] <= 5

 半正定値制約に対してshowSystem関数を用いた場合,以下が出力されます.

SymmetricMatrix X((i, j));
X["1, 1"] = 2 * x[1];
X["1, 2"] = 1;
X["2, 2"] = x[2];
X >= 0;
showSystem();

 出力

1-1 (a.smp:8): 2*(x[1]) (sdpconselem)
1-2 (a.smp:8): 1 (sdpconselem)
1-3 (a.smp:8): x[2] (sdpconselem)

 

 

上に戻る