最適化セミナーのご案内

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

 driver.cpp(UNIX版ではuseClass.cc)で行っているように,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 = %d\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]);

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


 

 

上に戻る