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

4.2 モデル兼ドライバのコール

 次は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()とNuorium Optimizerのライブラリとリンクするとロードモジュールが作成できます.VC++のメニューの「プロジェクト」から「スタートアップ プロジェクトに設定」を選び,次のようにこのプロジェクトを選択します.

 続いて実行します:

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

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

C:\app\x64\Release\noClass.exe (プロセス 10156) は、コード 0 を伴って終了しました。
このウィンドウを閉じるには、任意のキーを押してください . . .

 

 

上に戻る