グリッド型探索#

ここでは、グリッド型探索を行い Himmelblau関数の最小化問題を解析する方法について説明します。 グリッド型探索はMPI並列化に対応しています。具体的な計算手順は minsearch の場合と同様です。 探索グリッドはパラメータを元にプログラム内部で生成します。

サンプルファイルの場所#

サンプルファイルは sample/analytical/mapper にあります。 フォルダには以下のファイルが格納されています。

  • input.toml

    メインプログラムの入力ファイル

  • plot_colormap_2d.py

    計算結果を可視化するためのプログラム

  • do.sh

    本チュートリアルを一括計算するために準備されたスクリプト

入力ファイルの説明#

メインプログラム用の入力ファイル input.toml について説明します。記述方法の詳細については「入力ファイル」の章および グリッド型探索 mapper を参照してください。

[base]
dimension = 2
output_dir = "output"

[solver]
name = "analytical"
function_name = "himmelblau"

[runner]
[runner.log]
interval = 20

[algorithm]
name = "mapper"
seed = 12345

[algorithm.param]
max_list = [6.0, 6.0]
min_list = [-6.0, -6.0]
num_list = [31, 31]

[base], [solver], [runner] のセクションについては Nelder-Mead法による探索(minsearch)の場合と同じです。

[algorithm] セクションでは、使用するアルゴリズムとその設定を行います。

  • name は使用するアルゴリズムの名前です。このチュートリアルでは、グリッド探索による解析を行うので、 mapper を指定します。

[algorithm.param] セクションで探索するパラメータのグリッドを指定します。

  • min_listmax_list はそれぞれ探索範囲の最小値と最大値を指定します。

  • num_list はパラメータの各方向へのグリッド点の個数を指定します。

ここではデフォルト値を用いるため省略しましたが、その他のパラメータについて詳細は「入力ファイル」の章を参照してください。

計算の実行#

最初にサンプルファイルが置いてあるフォルダへ移動します。(以下、ODAT-SEパッケージをダウンロードしたディレクトリの直下にいることを仮定します。)

$ cd sample/analytical/mapper

メインプログラムを実行します。計算時間は通常のPCで数秒程度で終わります。

$ mpiexec -np 4 odatse input.toml | tee log.txt

ここではプロセス数4のMPI並列を用いた計算を行っています。 実行すると output ディレクトリとその下に各ランクのフォルダが作成され、ランクごとの計算結果が出力されます。 同時に、以下のような出力が標準出力に書き出されます。

name            : mapper
seed            : 12345
param.max_list  : [6.0, 6.0]
param.min_list  : [-6.0, -6.0]
param.num_list  : [31, 31]
Iteration : 3/240
Iteration : 3/241
Iteration : 3/240
Iteration : 3/240
Iteration : 6/240
Iteration : 6/241
...
[3] minimum_value: 1.95200000e-01 at 721 (mesh [-2.8, 3.200000000000001])
complete main process : rank 00000003/00000004
end of run
Make ColorMap

961 個の格子点が 4 プロセスに分配されるため、担当点数はランクごとに 240 または 241 となります。 進捗は数点ごとにまとめて出力され、複数ランクの出力が混ざるため、行の順序は実行のたびに変わります。

標準出力には探索の進捗状況が表示されます。 各グリッド点(メッシュ)で評価されたパラメータ x1, x2 とその関数値は、最終的に output/ColorMap.txt に出力されます。 今回の場合は、

-6.000000 -6.000000 890.000000
-5.600000 -6.000000 753.769600
-5.200000 -6.000000 667.241600
-4.800000 -6.000000 622.121600
-4.400000 -6.000000 610.729600
-4.000000 -6.000000 626.000000
-3.600000 -6.000000 661.481600
-3.200000 -6.000000 711.337600
-2.800000 -6.000000 770.345600
...

のような結果が得られ、 1列目、2列目に x1, x2 の値、3列目に関数値が記載されます。

計算結果の可視化#

ColorMap.txt を図示することで、関数の値が小さいパラメータがどこにあるかを推定することができます。そのような 2次元パラメータ空間のプロットを作成するプログラムが plot_colormap_2d.py に用意されています。

$ python3 plot_colormap_2d.py

上記を実行すると output/ColorMapFig.pdf が作成され、Himmelblau関数の関数値を表す等高線の上に、各グリッド点で評価した関数値がカラーマップとしてプロットされます。

../_images/res_mapper.png

グリッド型探索における2次元パラメータ空間上での関数値のカラーマップ。#