Rastrigin関数
Rastrigin関数の最小化を考えます。
Rastrigin関数は、多次元の最適化問題でよく使われる非線形かつ非凸な関数で、複数の局所最小値を持つため、グローバル最適化の良い例題です。
Rastrigin関数の定義は以下の通りです:
$$
f(\mathbf{x}) = An + \sum_{i=1}^{n} \left[ x_i^2 - A \cos(2 \pi x_i) \right]
$$
ここで、通常$ ( A = 10 ) $で、$ ( n ) $は次元数です。
この関数のグローバル最小値は$ (\mathbf{x} = \mathbf{0}) $であり、そのときの関数値は$0$です。
プログラム例
以下は、PythonでRastrigin関数を最適化するためのコードです。
scipy.optimize
モジュールのdual_annealing
関数を使用してグローバル最適化を行います。
1 | import numpy as np |
ソースコード解説
関数の定義:
- Rastrigin関数を定義します。
この関数は入力ベクトルx
に対して評価されます。
- Rastrigin関数を定義します。
最適化の設定:
- 最適化する範囲(ここでは、各次元が ([-5.12, 5.12]) の範囲にあります)を設定します。
dual_annealing
による最適化:- SciPyの
dual_annealing
関数を使用して、Rastrigin関数の最小値を求めます。
- SciPyの
結果の表示:
- 最適化結果として、最小値、最適解、および反復回数を表示します。
このコードを実行することで、Rastrigin関数のグローバル最小値を求めることができます。
Rastrigin関数の性質上、最適化アルゴリズムが局所最小値に陥らないようにするための良いテストケースとなります。
結果解説
[実行結果]
最適化結果: 最小値: 1.8474111129762605e-13 最適解: [-3.00458545e-08 -5.08182682e-09] 反復回数: 1000
最小値: 1.8474111129762605e-13
- これはRastrigin関数の最小値で、最適化アルゴリズムが見つけた関数の評価値です。
この値は非常に小さいことから、ほぼゼロに近いことを示しています。
Rastrigin関数の理論的なグローバル最小値は$0$なので、この結果は非常に良い最適化が行われたことを示しています。
- これはRastrigin関数の最小値で、最適化アルゴリズムが見つけた関数の評価値です。
最適解: [-3.00458545e-08 -5.08182682e-09]
- これは関数が最小値を取るときの入力ベクトル(解)です。
ここで示されている値は、非常に小さい数値(ほぼゼロ)です。
理論的な最適解はすべての変数がゼロのベクトル$ (\mathbf{0}) $なので、この結果は理論的な最適解に非常に近いことを示しています。 - 具体的には、$ (-3.00458545 \times 10^{-8}) $と$ (-5.08182682 \times 10^{-9}) $はどちらもゼロに非常に近い値です。
- これは関数が最小値を取るときの入力ベクトル(解)です。
反復回数: 1000
- これは最適化アルゴリズムが終了するまでに行われた反復(イテレーション)の回数です。
dual_annealing
アルゴリズムが設定された最大の反復回数に達したことを示しています。
最適化が成功し、非常に小さい最小値を見つけた一方で、アルゴリズムは最大反復回数まで探索を続けました。
- これは最適化アルゴリズムが終了するまでに行われた反復(イテレーション)の回数です。
最適化アルゴリズムと結果の評価
dual_annealing
アルゴリズム:- これは焼きなまし法(Simulated Annealing)に基づくグローバル最適化アルゴリズムです。
多くの局所最小値を持つ関数(非凸関数)の最適化に適しています。 - このアルゴリズムは、温度を徐々に下げながら探索範囲を狭めていくことで、局所最小値に陥ることを防ぎつつ、グローバル最小値を探索します。
- これは焼きなまし法(Simulated Annealing)に基づくグローバル最適化アルゴリズムです。
結果の評価:
- 最小値がほぼゼロであり、最適解が理論的な最適解(ゼロベクトル)に非常に近いことから、アルゴリズムは非常に効果的に動作したと評価できます。
- 最大反復回数に達したものの、最適化の目的は十分に達成されたと考えられます。
探索プロセスをさらに続ける必要はないでしょう。
まとめ
この結果は、Rastrigin関数の最小化においてdual_annealing
アルゴリズムが有効に機能したことを示しています。
最適化アルゴリズムは、非常に小さな関数値と理論的な最適解に近い解を見つけることができました。