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

10.2 print関数

 print関数は,変数Variable,目的関数Objective,制約式Constraint,定数Parameter,整数変数IntegerVariable,式Expression,対称行列SymmetricMatrix,集合Set,順序集合OrderedSetに関する情報を,決まったフォーマットで出力させる機能を有しています.

 print関数の書式は,以下のように定められています.

構成要素.情報.print();

 変数の現在値を出力するには,次のように記述する必要があります.

Variable x;
x.val.print();

 目的関数の初期値を出力するには,次のように記述する必要があります.

Objective f;
f.init.print();

 制約式の双対変数値を出力するには,次のように記述する必要があります.

Constraint Co;
Co.dual.print();

 定数の現在値を出力するには,次のように記述する必要があります.

Parameter a;
a.val.print();

 整数変数の下限値を出力するには,次のように記述する必要があります.

IntegerVariable z;
z.lb.print();

 対称行列の現在値を出力するには,次のように記述する必要があります.

SymmetricMatrix X((i, j));
X.val.print();

 式の初期値を出力するには,次のように記述する必要があります.

Expression g;
g.init.print();

 集合の現在値を出力するには,次のように記述する必要があります.

Set S;
S.val.print();

 順序集合の現在値を出力するには,次のように記述する必要があります.

OrderedSet O;
O.val.print();

 求解関数solveの前にprint関数を記述すると,求解前の初期状態の情報が記述されます.求解関数solveは,明示的に記述されない場合,モデルの最後尾にあるものと認識されます.例えば,次のモデルに対する出力は以下のようになります.

 モデルファイル

Variable x;
Objective f(type = minimize);
f = 2 * x;
x >= 5; //制約
x = 10; //初期値設定
x.val.print();

 出力

x=10

 solve関数の後にprint関数を用意した場合,出力は以下のようになります.

 モデルファイル

Variable x;
Objective f(type = minimize);
f = 2 * x;
x >= 5; //制約
x = 10; //初期値設定
solve();
x.val.print();

 出力

x=5

 solve関数の前後にprint関数を用意した場合,出力は以下のようになります.

 モデルファイル

Variable x;
Objective f(type = minimize);
f = 2 * x;
x >= 5; //制約
x = 10; //初期値設定
x.val.print();
solve();
x.val.print();

 出力

x=10
x=5

 添字が付いている場合は,全体を出力します.例えば,次のモデルに対する出力は,以下のようになります.変数x[1], x[2], x[3]の現在値が全て出力されます.

 モデルファイル

Set S = "1 2 3";
Element i(set = S);
Variable x(index = i);
Objective f(type = minimize);
f = 2 * sum(x[i], i);
x[i] >= 5; //制約
x[i] = 10; //初期値設定
solve();
x.val.print();

 出力

x[1]=5
x[2]=5
x[3]=5

 出力範囲を,条件式で制限する事も可能です.以下のようにした場合,変数x[1], x[2]の現在値のみが出力されます.

(x[i].val, i < 3).print();

 出力

x[1]=5
x[2]=5

 次の例では,添字付きの対称行列を出力させています.

 モデルファイル

Set S = "1 2";
Element i(set = S), j(set = S);
Set N = "1 2 3";
Element n(set = N);
Variable x, y;
x = 10;
y = 2;
SymmetricMatrix X(index = n, (i, j));
X[n, i, j] = 100 * n + x * i + y * j, i <= j; // 上三角部分のみ定義
X.val.print();

 出力

X[1,1,1]=112
X[1,1,2]=114
X[1,2,2]=124
X[2,1,1]=212
X[2,1,2]=214
X[2,2,2]=224
X[3,1,1]=312
X[3,1,2]=314
X[3,2,2]=324

 

 

上に戻る