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 を伴って終了しました。 このウィンドウを閉じるには、任意のキーを押してください . . .
上に戻る