4.2 モデル兼ドライバのコール
次はknapsackSolveをC++で呼び出しているメインルーチンを記述します.ここでは,第2章と同様にナップサック問題
の容量制約の上限値を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 を伴って終了しました。
このウィンドウを閉じるには、任意のキーを押してください . . .
上に戻る


