RosenbrockをDakotaで最適化したまとめ - materialsintegration/optimization_by_sipmi GitHub Wiki
Dakota1を利用して、Rosenbrock関数2の評価を行い、最適化を行い、最適解を導き出した。そのまとめである。
※1:Dakota とは米国サンディア国立研究所で開発されたオープンソースの最適化システムである。各種最適化、感度解析、パラメー
タ同定および信頼性解析に取り組み可能な手法が多数搭載されている。
※2:数学的な最適化において、Rosenbrock 関数は非凸関数であり、Howard H. Rosenbrock によって1960 年に導入され、最適化アル
ゴリズムのパフォーマンステスト問題としてよく使われる関数である。
概要
Rosenbrockの最適化の変数として、入力値XとYを変数とし、Rosenbrock関数を目的関数として、最適化の評価を行った。

graph TD;
dakota000[Dakota最適化ツール]
dakota001{判定}
dakota002[interface:Rosenbrock関数の駆動スクリプト]
dakota003[response:戻り値を評価]
dakota004[終了]
dakota000==>|実行開始|dakota001
dakota001==>|パラメータ生成|dakota002
dakota001==>|終了|dakota004
dakota003==>dakota001
dakota002==>|postprocess|dakota003
Rosenbrock関数は以下の図のような入力(底辺)と出力(縦軸)を得る。

環境
評価に使用した環境を以下に記す。
- CentOS7.x
- Dakota:6.7
- Python:3.6
Dakotaについて
Dakotaの実行に関して、簡単に説明する。
パラメータファイル
Dakotaの駆動には、まずパラメータファイルが必要である。いくつかのテンプレートをDakotaが用意しているので、それを使用してパラメータファイルを作成する。パラメータファイルは以下の構造を持つ。主な変更点を以下に列挙する。それぞれについて記述する。
- パラメータファイルの例
environment,
graphics
tabular_graphics_data
tabular_graphics_file = 'tabulargraphics.dat'
method, conmin_frcg
id_method ="frcg"
max_iterations = 10000
convergence_tolerance=1e-7
scaling
variables,
continuous_design = 2
cdv_initial_point = 0.0 0.0
cdv_lower_bounds = -5.0 -5.0
cdv_upper_bounds = 5.0 5.0
cdv_descriptor = 'V001' 'V002'
cdv_scale_type 'value'
cdv_scales 0.01
interface,
system #asynch evaluation_concurrency = 5
analysis_driver = 'simulator_script.sh'
parameters_file = 'params.in'
results_file = 'results.out'
dprepro
responses,
objective_functions = 1
numerical_gradients
method_source dakota
interval_type central
fd_step_size = 1
no_hessians
- method:最適化手法の指定
- variables:変数の指定
- interface:目的関数の駆動法の指定
- response:目的関数からDakotaへ戻される評価値の処理方法の指定
method、手法の詳細
最適化手法は以下のものを実施した。それぞれについて結果を後述する。
- conmin_fcgr:制約付き最小化共役勾配最適化法
- max_iterations:10000(1万回まで試行を許可)
- convergence_tolerance:1e-7(評価の際、小数点以下7桁まで見る)
variables、変数詳細
Rosenbrockの2つの入力を変数として使用する。値は、2変数とも、初期値を1.05、最小値を-5.0、最大値を5.0とした。
interface、目的関数
- analysis_dirver:実行用のスクリプトを指定する。
- スクリプトの概要
- Rosenbrock関数を処理して出力を標準出力へ出力する。
- スクリプトの概要
response
- objective_functions:1を指定する
- numerical_gradientを指定。
- method_source:dakota
- interval_type:central
- fd_step_size:.01
- no_hessiansを指定
検証
- 評価全体
78回の評価を行い、全体として11秒かかった。 - 評価結果は以下の通りで、想定通りの最適値に収束している。
%eval_id interface x y obj_fn 1 NO_ID 1.05 1.05 0.278125 2 NO_ID 1.048976102 1.050484357 0.2510654971 3 NO_ID 1.04488051 1.052421784 0.1568840215 4 NO_ID 1.029777524 1.059566277 0.0009633461047 5 NO_ID 1.02600584 1.060996905 0.007580120897 6 NO_ID 1.02933981 1.059732305 0.0008645055029 7 NO_ID 1.029394308 1.059711633 0.0008643733622 8 NO_ID 1.004102953 1.05767965 0.2446154354 9 NO_ID 1.029141395 1.059691314 0.0008805028857 10 NO_ID 1.029324439 1.05970602 0.0008638122711 11 NO_ID 1.023877776 1.04950996 0.0007103953393 12 NO_ID 1.025451779 1.052456468 0.0007297165374 13 NO_ID 1.023169126 1.048183379 0.0007079782462 14 NO_ID 1.017666209 1.035338496 0.0003214596375 15 NO_ID 1.018367528 1.036975512 0.0003383052748 16 NO_ID 1.016769176 1.033244644 0.0003142577126 17 NO_ID 1.008303532 1.019039895 0.000627742365 18 NO_ID 1.013557452 1.0278556 0.0002148172649 19 NO_ID 1.014570315 1.029555111 0.0002163820622 20 NO_ID 1.022031326 1.021844581 0.0520300497 21 NO_ID 1.013714915 1.027743903 0.0001896858415 22 NO_ID 1.013797439 1.027685363 0.0001913670104 23 NO_ID 1.011250628 1.022784686 0.0001290369231 24 NO_ID 1.011795288 1.023880778 0.0001414111462 25 NO_ID 1.00411678 1.00842828 2.01081886e-05 26 NO_ID 1.003676867 0.9963374619 0.01217915139 27 NO_ID 1.004109437 1.008226472 1.68961013e-05 28 NO_ID 1.004109999 1.008241914 1.689461415e-05 29 NO_ID 0.9979976763 1.008110397 0.0146717256 30 NO_ID 1.004048876 1.008240598 1.799245098e-05 31 NO_ID 1.004087987 1.00824144 1.694933085e-05 32 NO_ID 1.001053838 1.008176155 0.003682407761 33 NO_ID 1.004052708 1.008240681 1.783675208e-05 34 NO_ID 1.004088925 1.00824146 1.693918319e-05 - 試行結果
