optimize_ga_swarm_remc プログラム仕様
多目的最適化手法(GA、PSO、REMC、Nelder-Mead)を比較するためのスクリプト
本スクリプトは、指定された最適化手法(遺伝的アルゴリズム、粒子群最適化、レプリカ交換モンテカルロ法、Nelder-Meadシンプレックス法)を用いて、Ackley関数をベースとした目的関数を最小化します。 パラメータ数(2または4)に応じて最適化対象の次元が変わり、コマンドライン引数を通じて各種設定を動的に変更することが可能です。 2パラメータの場合には、目的関数の3Dプロットも表示されます。
関連リンク: optimize_ga_swarm_remc.py 技術ドキュメント
- optimize.optimize_ga_swarm_remc.AckleyFunc(X, Y)[ソース]
Ackley関数を計算します。
Ackley関数は、広範囲の平坦な領域と多数の局所最適解を持つことで知られる 多目的最適化のテスト関数です。
:param : :type : param X: 第一変数。 :param : :type : type X: float or numpy.ndarray :param : :type : param Y: 第二変数。 :param : :type : type Y: float or numpy.ndarray
- 戻り値:
returns: Ackley関数の値。
rtype: float or numpy.ndarray
- class optimize.optimize_ga_swarm_remc.Particle(bounds)[ソース]
ベースクラス:
object粒子群最適化 (PSO) における個々の粒子を表すクラス。
各粒子は、現在位置、速度、自己最良位置、自己最良スコアを保持します。
- update_position(bounds)[ソース]
粒子の位置を更新し、探索範囲内にクリップします。
現在の速度に基づいて粒子の位置を更新します。 更新後、位置が bounds で指定された範囲を超えた場合、その範囲内に強制的に収めます。
:param : :type : param bounds: 各次元の探索範囲。例: [[low1, high1], [low2, high2]] :param : :type : type bounds: list[list[float]]
- 戻り値:
returns: なし (粒子の位置はインプレースで更新されます)
rtype: None
- update_velocity(global_best_position, inertia, cognitive, social)[ソース]
粒子の速度を更新します。
現在の速度、自己最良位置への傾向、およびグローバル最良位置への傾向に基づいて、 粒子の速度を更新します。
:param : :type : param global_best_position: 全粒子の中で見つかった最良の位置。 :param : :type : type global_best_position: numpy.ndarray :param : :type : param inertia: 慣性重み。 :param : :type : type inertia: float :param : :type : param cognitive: 認知係数(自己の最良位置への影響度)。 :param : :type : type cognitive: float :param : :type : param social: 社会係数(全体最適位置への影響度)。 :param : :type : type social: float
- 戻り値:
returns: なし (粒子の速度はインプレースで更新されます)
rtype: None
- optimize.optimize_ga_swarm_remc.callback(xk)[ソース]
最適化プロセス中のコールバック関数。
print_level が1の場合、現在のイテレーション数、目的関数値、および 現在のパラメータを出力します。 iter グローバル変数をインクリメントして、コールバック呼び出し回数を記録します。
:param : :type : param xk: 現在の最適解候補のパラメータ配列。 :param : :type : type xk: numpy.ndarray
- 戻り値:
returns: なし
rtype: None
- optimize.optimize_ga_swarm_remc.crossover(parent1, parent2)[ソース]
遺伝的アルゴリズムにおける2つの親個体から子個体を生成します。
一点交叉 (one-point crossover) を使用し、親1と親2の遺伝子を組み合わせて 2つの新しい子個体を作成します。
:param : :type : param parent1: 最初の親個体(パラメータ配列)。 :param : :type : type parent1: numpy.ndarray :param : :type : param parent2: 第二の親個体(パラメータ配列)。 :param : :type : type parent2: numpy.ndarray
- 戻り値:
returns: 生成された2つの子個体。
rtype: tuple[numpy.ndarray, numpy.ndarray]
- optimize.optimize_ga_swarm_remc.exchange_acceptance(delta, temp1, temp2)[ソース]
レプリカ交換モンテカルロ法における交換受理確率を計算します。
二つのレプリカのエネルギー差と温度に基づいて、交換が行われる確率を計算します。
:param : :type : param delta: 二つのレプリカのエネルギー差 (E2 - E1)。 :param : :type : type delta: float :param : :type : param temp1: 最初のレプリカの温度。 :param : :type : type temp1: float :param : :type : param temp2: 第二のレプリカの温度。 :param : :type : type temp2: float
- 戻り値:
returns: レプリカ交換の受理確率。
rtype: float
- optimize.optimize_ga_swarm_remc.genetic_algorithm(objective_function, bounds, population_size, callback=None, tol=1e-05, nmaxiter=1000, mutation_rate=0.01)[ソース]
遺伝的アルゴリズム (GA) を用いて最適化問題を解きます。
指定された目的関数を最小化するために、選択、交叉、突然変異の操作を繰り返し、 個体群を進化させます。
:param : :type : param objective_function: 最小化する目的関数。numpy.ndarray を引数にとり、float を返します。 :param : :type : type objective_function: callable :param : :type : param bounds: 各変数の探索範囲。例: [[low1, high1], [low2, high2]] :param : :type : type bounds: list[list[float]] :param : :type : param population_size: 個体群のサイズ(世代ごとの個体数)。 :param : :type : type population_size: int :param : :type : param callback: 各世代の終わりに呼び出されるコールバック関数。numpy.ndarray を引数にとります。 :param : :type : type callback: callable, optional :param : :type : param tol: 目的関数の値がこの許容誤差を下回った場合に収束と見なします。 :param : :type : type tol: float, optional :param : :type : param nmaxiter: 最大世代数(イテレーション数)。 :param : :type : type nmaxiter: int, optional :param : :type : param mutation_rate: 突然変異が発生する確率。 :param : :type : type mutation_rate: float, optional
- 戻り値:
returns: 最も良かった個体のパラメータと、そのときの目的関数値。
rtype: tuple[numpy.ndarray, float]
- optimize.optimize_ga_swarm_remc.main()[ソース]
スクリプトのメイン処理を実行します。
現在の設定(手法、探索範囲、初期推測値、最大イテレーション)を出力し、 選択された最適化手法または全ての最適化手法を順次実行します。
:param : :type : param: なし
- 戻り値:
returns: なし
rtype: None
- optimize.optimize_ga_swarm_remc.minimize_func(xk)[ソース]
最適化の目的関数を定義します。
グローバル変数 nparameters の値に応じて、2変数または4変数の Ackley関数ベースの関数を返します。 icall グローバル変数をインクリメントして、関数呼び出し回数を記録します。
:param : :type : param xk: 最適化されるパラメータの配列。 :param : :type : type xk: numpy.ndarray
- 戻り値:
returns: 計算された目的関数の値。
rtype: float
- optimize.optimize_ga_swarm_remc.mutate(individual, bounds, mutation_rate=0.01)[ソース]
遺伝的アルゴリズムにおける個体を突然変異させます。
各遺伝子について、mutation_rate の確率で、その遺伝子の範囲内で 新しいランダムな値に置き換えます。
:param : :type : param individual: 突然変異させる個体(パラメータ配列)。 :param : :type : type individual: numpy.ndarray :param : :type : param bounds: 各遺伝子の探索範囲。例: [[low1, high1], [low2, high2]] :param : :type : type bounds: list[list[float]] :param : :type : param mutation_rate: 突然変異が発生する確率。 :param : :type : type mutation_rate: float, optional
- 戻り値:
returns: なし (個体はインプレースで変更されます)
rtype: None
- optimize.optimize_ga_swarm_remc.optimize(method)[ソース]
指定された最適化手法を実行します。
グローバル変数 iter と icall をリセットし、選択された手法(GA, Simplex, PSO, REMC) で目的関数 minimize_func を最適化します。 結果として得られた最良のパラメータとスコア、および関数呼び出し回数を出力します。
:param : :type : param method: 使用する最適化手法 ('ga', 'simplex', 'pso', 'remc')。 :param : :type : type method: str
- 戻り値:
returns: なし
rtype: None
- optimize.optimize_ga_swarm_remc.particle_swarm_optimization(objective_function, bounds, num_particles, callback=None, tol=1e-05, nmaxiter=1000, inertia=0.5, cognitive=1.5, social=1.5)[ソース]
粒子群最適化 (PSO) アルゴリズムを用いて最適化問題を解きます。
粒子の群れが、自己の最良経験と群れ全体の最良経験に基づいて、探索空間内で 最適解を見つけようと試みます。
:param : :type : param objective_function: 最小化する目的関数。numpy.ndarray を引数にとり、float を返します。 :param : :type : type objective_function: callable :param : :type : param bounds: 各変数の探索範囲。例: [[low1, high1], [low2, high2]] :param : :type : type bounds: list[list[float]] :param : :type : param num_particles: 粒子群のサイズ。 :param : :type : type num_particles: int :param : :type : param callback: 各イテレーションでグローバル最良位置が更新されたときに呼び出されるコールバック関数。numpy.ndarray を引数にとります。 :param : :type : type callback: callable, optional :param : :type : param tol: 目的関数の値がこの許容誤差を下回った場合に収束と見なします。 :param : :type : type tol: float, optional :param : :type : param nmaxiter: 最大イテレーション数。 :param : :type : type nmaxiter: int, optional :param : :type : param inertia: 慣性重み。粒子の現在の速度への影響度。 :param : :type : type inertia: float, optional :param : :type : param cognitive: 認知係数。自己最良位置への粒子の引き付けの度合い。 :param : :type : type cognitive: float, optional :param : :type : param social: 社会係数。グローバル最良位置への粒子の引き付けの度合い。 :param : :type : type social: float, optional
- 戻り値:
returns: グローバル最良位置のパラメータと、そのときの目的関数値。
rtype: tuple[numpy.ndarray, float]
- optimize.optimize_ga_swarm_remc.plot()[ソース]
2D Ackley関数の3Dプロットを生成し表示します。
nparameters が2の場合にのみ呼び出されます。 最適化対象の関数の形状を視覚的に確認できます。
:param : :type : param: なし
- 戻り値:
returns: なし
rtype: None
- optimize.optimize_ga_swarm_remc.replica_exchange_monte_carlo(objective_function, bounds, num_replicas, temperatures, callback=None, tol=1e-05, nmaxiter=1000)[ソース]
レプリカ交換モンテカルロ法 (REMC) を用いて最適化問題を解きます。
異なる温度を持つ複数のレプリカ間で状態を交換することで、局所最適解からの脱出と 広範囲な探索を効率的に行います。
:param : :type : param objective_function: 最小化する目的関数。numpy.ndarray を引数にとり、float を返します。 :param : :type : type objective_function: callable :param : :type : param bounds: 各変数の探索範囲。例: [[low1, high1], [low2, high2]] :param : :type : type bounds: list[list[float]] :param : :type : param num_replicas: レプリカの数。 :param : :type : type num_replicas: int :param : 昇順にソートされている必要があります。 :type : param temperatures: 各レプリカに割り当てられる温度の配列。 :param : :type : type temperatures: numpy.ndarray :param : :type : param callback: 最良の個体が更新されたときに呼び出されるコールバック関数。numpy.ndarray を引数にとります。 :param : :type : type callback: callable, optional :param : :type : param tol: 目的関数の値がこの許容誤差を下回った場合に収束と見なします。 :param : :type : type tol: float, optional :param : :type : param nmaxiter: 最大イテレーション数。 :param : :type : type nmaxiter: int, optional
- 戻り値:
returns: 全てのレプリカの中で見つかった最良の個体のパラメータと、そのときの目的関数値。
rtype: tuple[numpy.ndarray, float]
- optimize.optimize_ga_swarm_remc.sampling(bounds)[ソース]
指定された範囲に基づいてランダムな点をサンプリングします。
各次元について、bounds で定義された下限と上限の間で一様乱数を生成します。
:param : :type : param bounds: 各変数の下限と上限を定義するリスト。例: [[low1, high1], [low2, high2]] :param : :type : type bounds: list[list[float]]
- 戻り値:
returns: サンプリングされたランダムな点の配列。
rtype: numpy.ndarray
- optimize.optimize_ga_swarm_remc.select_best_from_random_group(population, scores, k=3)[ソース]
ランダムに選択された個体群の中から最も良いスコアを持つ個体を選択します(トーナメント選択)。
population から k 個の個体をランダムに選び、その中から目的関数のスコアが 最も低い(最良の)個体を返します。
:param : :type : param population: 現在の世代の全個体リスト。 :param : :type : type population: list[numpy.ndarray] :param : :type : param scores: population の各個体に対応する目的関数のスコアリスト。 :param : :type : type scores: list[float] :param : :type : param k: トーナメントに参加する個体数。 :param : :type : type k: int, optional
- 戻り値:
returns: ランダムに選ばれたグループの中で最もスコアが良い個体。
rtype: numpy.ndarray