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]);としたのと同じ,変数と添字の書式付表示となります.
上に戻る

