6.2 モデルから作成されたオブジェクト(システムオブジェクト)の操作
driver.cpp
で行っているように,genClass
で生成したクラス定義から
System_knapsack knap(c, a, b);
として生成されたオブジェクト(ここではknap
)がデータを与えられて作成したその数理最適化モデル(この場合にはknapsack問題)そのものに対応します(以下ではこれを説明のため「システムオブジェクト」と呼びます).ここで
knap.show();
とすると,問題の中身が表示されます(showSystem()
と同じ).
システムオブジェクトと数理最適化モデルの構成要素については,一般的な原則として以下があります.
System_NAME
のオブジェクトs
についてs.x
はNAME.smp
中のオブジェクトx
に対応する.
すなわち,
// // ナップサック問題 // Set S; Element i(set = S); IntegerVariable x(index = i, type = binary); // 整数変数 Parameter c(index = i, required); Parameter a(index = i, required); Parameter b(required); Objective obj(type = maximize); obj = sum(c[i] * x[i], i); // 目的関数 sum(a[i] * x[i], i) <= b; // 制約条件
と定義されたモデルから生成されたknap
について,VC++のGUIで“.
”を打った後に以下のように,参照可能なメンバーが現れますが,それぞれはこのモデル中のオブジェクトに対応しています.
例えば
knap.x
はモデル中の変数(Variable x
)に対応し,このオブジェクトに対する表示手続き:
print(), cout, simple_printf()
は通常のSIMPLEオブジェクトに対するのと全く同様に可能です.すなわち
knap.x.print(); simple_printf("objective = %f\n", knap.obj);
とすると,それぞれknapsack.smp
のモデル中のx
,obj
の値が表示されます.
simple_printf("x[%s] = %d\n", knap.i, knap.x[knap.i]);
は少々複雑ですが,“knap.i
”はモデル中のElement i
の意味となりますので,モデル中で
simple_printf("x[%s] = %d\n", i, x[i]);
としたのと同じ,変数と添字の書式付表示となります.
上に戻る