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

6.2 モデルから作成されたオブジェクト(システムオブジェクト)の操作

 driver.cppで行っているように,genClassで生成したクラス定義から

System_knapsack knap(c, a, b);

として生成されたオブジェクト(ここではknap)がデータを与えられて作成したその数理最適化モデル(この場合にはknapsack問題)そのものに対応します(以下ではこれを説明のため「システムオブジェクト」と呼びます).ここで

knap.show();

とすると,問題の中身が表示されます(showSystem()と同じ).

 システムオブジェクトと数理最適化モデルの構成要素については,一般的な原則として以下があります.

System_NAMEのオブジェクトsについてs.xNAME.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のモデル中のxobjの値が表示されます.

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]);

としたのと同じ,変数と添字の書式付表示となります.


 

 

上に戻る