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

9.3 最適化計算結果result

 最適化計算の結果はresultというオブジェクトが保持しています.以下は,resultが保有する情報の一覧です.

名称 意味
nvars int 変数の数
nfunc int 関数の数
iters int 内点法の反復回数
fevals int 内点法の関数評価回数
optValue double 目的関数値
tolerance double 内点法の収束判定値
residual double 内点法の解における最適性条件の残差
elapseTime double 所要計算時間
peakPhysicalMemoryUsed size_t 物理メモリの最大使用量
peakVirtualMemoryUsed size_t 仮想メモリの最大使用量
hardPenalty double 制約充足問題ソルバWCSPによるハードペナルティ
semiHardPenalty double 制約充足問題ソルバWCSPによるセミハードペナルティ
softPenalty double 制約充足問題ソルバWCSPによるソフトペナルティ
errorCode int 終了時ステータス
(成功時:0,失敗時:エラー番号)
エラー番号はNuorium Optimizerマニュアルの付録に記載のものに従います
simpleErrorCode int 終了時ステータス
(成功時:0,失敗時:エラー番号)
エラー番号は付録A.1のものに従います
isFeasible() bool 実行可能解が得られているかどうか
(true:得られている,false:得られていない)

 

 以下は最適化計算結果を出力するモデルファイルの記述例です.

Variable x, y;
Objective f(type = minimize);
f = 2 * x + 3 * y;
x + 2 * y == 15;
x >= 0;
y >= 0;
solve();

simple_printf("関数の数         %d\n", result.nfunc);
simple_printf("内点法の反復回数 %d\n", result.iters);
simple_printf("関数評価回数     %d\n", result.fevals);
simple_printf("目的関数値       %e\n", result.optValue);
simple_printf("収束判定条件     %e\n", result.tolerance);
simple_printf("最適性条件残差   %e\n", result.residual);
simple_printf("所要計算時間     %d\n", result.elapseTime);
simple_printf("終了時ステータス %d\n", result.errorCode);

 以下出力例です.

関数の数         2
内点法の反復回数 5
関数評価回数     8
目的関数値       2.250000e+001
収束判定条件     1.000000e-008
最適性条件残差   3.978422e-008
所要計算時間     0
終了時ステータス 0

 resultオブジェクトには,アルゴリズム毎に有効なメソッドもあります.

 最適化計算を行った場合,実行可能解が得られたかどうかを表すisFeasible()関数を使用できます.返り値はbool型です.

 以下記述例です.

Variable x;
Variable y;
Variable z;
Variable s1;
Variable s2;
Variable s3;
IntegerVariable delta1(type = binary);
IntegerVariable delta2(type = binary);
IntegerVariable delta3(type = binary);
Parameter M = 10000;
Objective cost(type = minimize);
cost = delta1 + delta2 + delta3;
x + y + z == 12 + s1;
5 * x + 5 * y + 5 * z == 60 + s2;
0 <= s1 <= 1.0e-3;
0 <= s2 <= 1.0e-3;
-M * delta1 <= x <= M * delta1;
-M * delta2 <= y <= M * delta2;
-M * delta3 <= z <= M * delta3;
options.plevel = 0;
options.maxnod = 1;
options.method = "simplex";
solve();
simple_printf("feasible = %d\n", result.isFeasible());

 以下は,上記例のsimple_printf関数における出力例です.

feasible = 1

 制約充足問題ソルバWCSPで最適化計算を行った場合,ハード制約・セミハード制約・ソフト制約のペナルティをhardPenaltysemiHardPenaltysoftPenaltyに保持します.

 以下記述例です.

IntegerVariable x(type = binary);
x - 2 >= 0;
options.maxtim = 0.1;
options.method = "wcsp";
solve();
simple_printf("hard penalty = %f\n", result.hardPenalty);

 以下は,上記例のsimple_printf関数における出力例です.

hard penalty = 1.000000

 

 

上に戻る