遺伝的アルゴリズム最適化 戻る
進化計算・最適化

遺伝的アルゴリズム最適化シミュレーター

Rastrigin・Ackley等の難関ベンチマーク関数に対しGAを実行。個体群が適応度地形を探索しながら最適解に収束する様子をリアルタイム可視化。

パラメータ設定
目的関数
個体群サイズ N
突然変異率
交叉率
最大世代数
現在の状態
計算結果
0
世代
最良適応度
最良 x
最良 y
多様性(標準偏差)
0.05
突然変異率
0.80
交叉率
200
最大世代
適応度地形(コンター)+ 個体群(白点)+ 最良個体(赤星)
最良適応度の推移
理論・主要公式
$$f(x,y)=20+x^2+y^2-10(\cos 2\pi x+\cos 2\pi y)$$

定義域 $[-5,5]^2$、最小値 $f(0,0)=0$

遺伝的アルゴリズム最適化とは

🙋
遺伝的アルゴリズムって、生物の進化を真似して最適解を見つけるって聞きましたけど、具体的にどうやってるんですか?
🎓
大まかに言うと、ランダムな解の集団(個体群)を作って、良い解を選び(選択)、組み合わせ(交叉)、時々ランダムに変え(突然変異)ながら、世代を重ねて解を改良していくんだ。このシミュレーターの上のスライダーで「個体群サイズ N」や「突然変異率」を変えられるから、まずはデフォルト値で「実行」ボタンを押して確認してみて。点(個体)が山だらけの地形を探索しながら、一番低い谷(最適解)に集まっていく様子が見えるよ。
🙋
え、山だらけの地形って?Rastrigin関数って何ですか?確かにグラフを見るとボコボコしてますね。
🎓
そのボコボコがポイントなんだ。Rastrigin関数は、真ん中の深い谷(大域的最適解)の周りに、無数の浅い谷(局所最適解)が並んだ、いわば「だまし穴だらけ」のテスト関数。普通の勾配法を使うと、最初に落ちた浅い谷から抜け出せなくなる。でも遺伝的アルゴリズムは、複数の点で同時に探すから、どこかの点が深い谷を見つけやすくて、他の点もそこに引き寄せられる。パラメータで「交叉率」を下げてみると、情報の共有が減って収束が遅くなるのがわかるよ。
🙋
なるほど!でも、実務のCAE設計で、こんなボコボコした関数を最適化することってあるんですか?
🎓
もちろんあるよ。例えば自動車のエンジン燃焼室の形状を最適化する時、燃費や排ガスを計算するCAEシミュレーションは複雑で、パラメータを変えると出力がガタガタに変動する「ノイジー」な関数になる。それはRastrigin関数のように多くの局所解がある状態に近い。遺伝的アルゴリズムは、そのシミュレーションをブラックボックスとして扱い、入出力の関係だけから最適な形状パラメータを探せるんだ。シミュレーターで「目的関数」をAckley関数に切り替えてみて。また違った地形で、アルゴリズムがどう振る舞うか観察してみよう。

よくある質問

交叉率や突然変異率を調整してみてください。突然変異率が低すぎると局所解に陥りやすく、高すぎると収束が遅れます。また、個体数(ポピュレーションサイズ)を増やすと探索の多様性が向上し、収束性が改善されることがあります。
どちらも多峰性ベンチマーク関数ですが、Rastriginは周期的な凹凸が均一で局所解が多数存在するのに対し、Ackleyは中央付近に急峻な谷を持ち、外側はほぼ平坦です。Ackleyの方が大域解への収束が難しく、GAの探索能力をより厳しく評価できます。
本ツールは乱数シードの固定機能を備えていないため、毎回わずかに異なる探索経路になります。傾向(収束世代・最終適応度の分布)を把握するには、同じパラメータで複数回実行して結果のばらつきを観察してください。厳密な再現が必要な研究用途では、シード固定に対応した実装(Python の random.seed 等)を利用します。
本ツールの定義域は [-5,5]×[-5,5] に固定されています。4つのベンチマーク関数(Rastrigin・Ackley・Sphere・Rosenbrock)はいずれもこの範囲内に大域的最適解を持つため、範囲変更なしで探索特性を比較できます。実問題では設計変数の物理的な上下限に合わせて探索空間を設定します。

実世界での応用

構造トポロジー最適化: 材料をどこに配置すべきかを決める設計で、SIMP法などの感度情報に基づく手法の初期設計や、離散的な設計変数(穴を開ける/開けない)の探索に遺伝的アルゴリズムが用いられます。軽量化しながら強度を確保する自動車部品や航空機部材の設計に応用されています。

エンジン燃焼最適化: 燃焼室形状、噴射タイミング、バルブタイミングなど多数のパラメータが燃費と排ガス性能に複雑に影響します。CAEシミュレーション(CFD)と遺伝的アルゴリズムを組み合わせ、大域的な最適パラメータセットを探索します。

アンテナ・電磁界デバイス設計: アンテナの形状やフィルタの構造をパラメータ化し、所望の周波数特性を得るために遺伝的アルゴリズムで探索します。電磁界シミュレーション1回の計算コストが高いため、効率的な探索が求められる分野です。

航空機の翼型設計: 揚力と抗力の比(揚抗比)を最大化する翼の形状を探す問題です。複数の設計条件(離着陸時、巡航時)を同時に満たす多目的最適化として遺伝的アルゴリズムが適用されるケースもあります。

よくある誤解と注意点

このシミュレーターで遺伝的アルゴリズム(GA)に慣れると、「万能の最適化ツール」と誤解しがちだ。まず、GAは必ずしも「最適解」を見つける保証はない。あくまで「非常に良い解」を高い確率で見つける手法だ。特に実務では、計算コストが莫大になる。例えば、車体の衝突安全性を最適化する場合、1回のCAE解析に数時間かかる。個体数100、世代数50なら、単純計算で5000回の解析が必要で、現実的ではない。実務では、初期設計を決定するための大まかな探索や、他の手法では手がかりがつかめない問題の初期解生成に使われることが多い。

次に、パラメータ設定の魔術に頼らないこと。「突然変異率は0.01が黄金律」といった迷信は捨てよう。最適なパラメータは問題によって大きく変わる。このツールで試してほしいのは、突然変異率を極端に高く(例:0.5)すると個体群がランダムウォークして収束しなくなる一方、低くしすぎ(例:0.001)すると初期の多様性が失われ、最初に捕まった局所解から抜け出せなくなる様子だ。実務では、最初はデフォルト値で走らせ、解の多様性が早く失われるなら突然変異率を上げ、逆に収束が遅すぎるなら選択圧を強めるといった調整が必要になる。

使い方ガイド

  1. 個体群サイズを設定(スライダー: 20~200個体)し、Rastrigin関数またはAckley関数を選択します。これらは多峰性で局所最適解が多数存在するベンチマーク関数です。
  2. 突然変異率(スライダー: 0.01~0.3)と交叉率(スライダー: 0.5~0.95)を調整し、最大世代数(スライダー: 50~500世代)を設定して実行ボタンを押します。
  3. 2D適応度地形(コンター)上で個体群と最良個体の探索軌跡を観察し、最良適応度の収束曲線と個体群の多様性(標準偏差)の推移から、GAの探索特性を分析します。

具体的な計算例

Rastrigin関数(f(x,y) = 20 + x² + y² - 10(cos(2πx) + cos(2πy)))の最小化: 個体群サイズ200、交叉率0.8、突然変異率0.1、最大500世代で実行すると、初期世代の最良適応度(数十のオーダー)が世代を追って数 J 以下まで下がり、終盤には理論最小値0に近い値へ収束します。多様性(標準偏差)も序盤の大きな値から徐々に低下し、収束が進む様子が確認できます。乱数で毎回値は変動するため、ここでは桁感のみを示します。

実務での注意点