最適化セミナーのご案内

4.1.2 モデル兼ドライバのコール(VC++)

 次はknapsackSolveをC++で呼び出しているメインルーチンを記述します.ここでは,第2章と同様にナップサック問題

\[\begin{array}{@{}ll@{}}
  \mbox{目的関数の係数:} & c = (\begin{matrix} 6 & 8 & 4 & 3 & 4 \end{matrix}) \\
  \mbox{制約式の係数:}   & a = (\begin{matrix} 4 & 2 & 3 & 6 & 7 \end{matrix})
\end{array}\]

の容量制約の上限値を1から30の間で動かすような問題を考えます.このルーチンもプロジェクトnoClassに追加されています.

#include <stdio.h>

// main()の中でコールする最適化手続き(最適化ライブラリ)
int knapsackSolve(int narg,double* aarg,double barg,double* carg
        ,double* xarg,double* farg);
void main()
{
// 問題のデータ
  int narg = 5;
  double aarg[5] = {4,2,3,6,7};
  double carg[5] = {6,8,4,3,4};
  double xarg[5];
  double barg = 20;
  double farg;

  int errCode;

  // bargを変化させながらknapsackSolveを繰り返しコールする
  int ib;
  for ( ib = 1 ; ib <= 30; ++ib ) {
    barg = (double) ib;
    errCode = knapsackSolve(narg,aarg,barg,carg,xarg,&farg);
    printf("errCode=%d b=%g obj=%g ",errCode,barg,farg);
    printf(" x= ");
    int i;
    for ( i = 0 ; i < narg ; ++i ) {
      printf("%1.0f ",xarg[i]);
    }
    printf("\n");
  }
}

 これを前項のknapsackSolve()とNumerical Optimizerのライブラリとリンクするとロードモジュールが作成できます.VC++のメニューの「プロジェクト」から「スタートアップ プロジェクトに設定」を選び,次のようにこのプロジェクトを選択します.

 つづいてVC++GUIの実行を選択:

 次のような出力が得られます.

errCode=0 b=1 obj=0  x= 0 0 0 0 0
errCode=0 b=2 obj=8  x= 0 1 0 0 0
errCode=0 b=3 obj=8  x= 0 1 0 0 0
errCode=0 b=4 obj=8  x= 0 1 0 0 0
errCode=0 b=5 obj=12  x= 0 1 1 0 0
errCode=0 b=6 obj=14  x= 1 1 0 0 0
    (中略)
errCode=0 b=26 obj=25  x= 1 1 1 1 1
errCode=0 b=27 obj=25  x= 1 1 1 1 1
errCode=0 b=28 obj=25  x= 1 1 1 1 1
errCode=0 b=29 obj=25  x= 1 1 1 1 1
errCode=0 b=30 obj=25  x= 1 1 1 1 1
続行するには何かキーを押してください . . .

 

 

上に戻る