NSGA-II(Non-dominated Sorting Genetic Algorithm II)の概要
NSGA-II(Non-dominated Sorting Genetic Algorithm II)は、多目的最適化問題を解くための進化的アルゴリズム(EA: Evolutionary Algorithm)の一種で、”遺伝的アルゴリズムの概要と適用事例および実装例について“で述べている遺伝的アルゴリズム(GA: Genetic Algorithm)をベースにした複数の目的関数を同時に最適化するように設計されたものとなる。これは特に、パレート最適(Pareto optimal)な解を求める際に優れた性能を発揮する。
NSGA-IIの主な特徴としては、以下のようなものが挙げられる。
-
非優越ソート(Non-dominated Sorting)
- 個体をパレート最適性に基づいてランク付けする。
- 同じランク内の個体同士は支配関係がなく、異なるランク間ではより低ランクの個体が優先される。
-
クラウディング距離(Crowding Distance)
- 多様性を維持するために、パレートフロント上の個体間の距離を計算。
- クラウディング距離が大きい個体を優先することで、解の分布を均等に保つ。
-
エリート主義(Elitism)
- 親と子を合わせた集合から次世代を選択することで、良い解を保持。
- これにより、収束性が向上し、探索の安定性が増す。
-
選択・交叉・突然変異
- トーナメント選択に基づき、優れた個体を選択。
- 一様交叉(Simulated Binary Crossover, SBX)や多様な突然変異(Polynomial Mutation)を適用して、探索の多様性を確保。
アルゴリズムのステップは以下のようになる。
-
初期集団の生成: ランダムに初期集団を生成。
-
適応度評価: 各個体の目的関数値を評価。
-
非優越ソートとクラウディング距離の計算: 個体をパレートフロントに基づいてランク付け。同じランク内では、クラウディング距離が大きい個体を優先。
-
選択・交叉・突然変異: トーナメント選択により親を選ぶ。SBX交叉や突然変異を適用して子世代を生成。
-
エリート主義による世代交代: 親集団と子集団を統合し、再び非優越ソートとクラウディング距離の計算を行う。上位の個体を次世代へ。
-
終了条件の判定: 指定した世代数に達するか、収束条件を満たすまで繰り返す。
NSGA-IIのメリットとしては以下のようなものがある。
- パレート最適解を一度に求められる(多目的最適化に適している)
- 多様な解を得られる(クラウディング距離による分散)
- 計算効率が高い(非優越ソートの改良により(O(MN^2)rightarrow O(MNlogN))の計算量)
NSGA-IIは、そのバランスの良さと計算効率の高さから、多目的最適化における標準的なアルゴリズムとして広く用いられている。
実装例
NSGA-IIのPythonによる実装例を示す。ここでは、代表的なライブラリであるDEAP(Distributed Evolutionary Algorithms in Python)を用いて、多目的最適化問題を解くコードを作成している。
問題設定: Schaffer関数(ZDT系のような二目的最適化問題)を対象に、NSGA-IIを適用する。
必要なライブラリのインストール
pip install deap numpy matplotlib
NSGA-IIの実装
import random
import numpy as np
import matplotlib.pyplot as plt
from deap import base, creator, tools, algorithms
# 適応度を最小化する(多目的最適化)
creator.create("FitnessMulti", base.Fitness, weights=(-1.0, -1.0)) # 最小化
creator.create("Individual", list, fitness=creator.FitnessMulti)
# 個体の生成
def create_individual():
return [random.uniform(-5, 5)] # 1次元の変数(Schaffer関数)
toolbox = base.Toolbox()
toolbox.register("individual", tools.initIterate, creator.Individual, create_individual)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 目的関数(Schaffer関数)
def schaffer(individual):
x = individual[0]
f1 = x**2 # 第一目的関数
f2 = (x - 2) ** 2 # 第二目的関数
return f1, f2
toolbox.register("evaluate", schaffer)
toolbox.register("mate", tools.cxSimulatedBinaryBounded, low=-5, up=5, eta=20.0)
toolbox.register("mutate", tools.mutPolynomialBounded, low=-5, up=5, eta=20.0, indpb=0.1)
toolbox.register("select", tools.selNSGA2)
# パラメータ設定
POP_SIZE = 100
NGEN = 50
CXPB, MUTPB = 0.7, 0.2
# 初期集団生成
pop = toolbox.population(n=POP_SIZE)
hof = tools.ParetoFront()
# 統計情報の収集
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("min", np.min, axis=0)
stats.register("max", np.max, axis=0)
# 進化の実行
algorithms.eaMuPlusLambda(pop, toolbox, mu=POP_SIZE, lambda_=POP_SIZE,
cxpb=CXPB, mutpb=MUTPB, ngen=NGEN,
stats=stats, halloffame=hof, verbose=True)
# 結果のプロット
f1_vals = [ind.fitness.values[0] for ind in hof]
f2_vals = [ind.fitness.values[1] for ind in hof]
plt.scatter(f1_vals, f2_vals, c="red")
plt.xlabel("f1 (x^2)")
plt.ylabel("f2 ((x-2)^2)")
plt.title("Pareto Front (NSGA-II)")
plt.show()
説明
-
DEAPの設定
creator.create("FitnessMulti", base.Fitness, weights=(-1.0, -1.0))
- 目的関数を2つ定義し、どちらも 最小化 する設定。
creator.create("Individual", list, fitness=creator.FitnessMulti)
- 個体の構造を定義(1次元の遺伝子を持つリスト)。
-
目的関数
f1(x) = x^2
f2(x) = (x-2)^2
- この2つの関数は、解空間上でパレートフロントを形成する。
-
進化戦略
cxSimulatedBinaryBounded
(SBX交叉)とmutPolynomialBounded
(多項式突然変異)を適用。selNSGA2
を用いてエリート主義による次世代選択。
-
アルゴリズムの実行
eaMuPlusLambda
を用いた進化の実行。hof
(Hall of Fame)にパレート最適解を保存。
-
結果のプロット
- 最終的な パレートフロント をプロットし、最適解の分布を確認。
実行結果
このコードを実行すると、最終的なパレートフロントが赤い点として描画される。Schaffer関数の特性上、x ≈ 0 から x ≈ 2 の間にパレートフロントが形成されることが確認できる。
実装上の特徴
- NSGA-IIは、多目的最適化問題の強力な手法であり、パレートフロントを探索可能。
- DEAPを用いることで、簡潔に実装可能。
- Schaffer関数の最適化を通じて、NSGA-IIの動作を確認できる。
適用事例
NSGA-II(Non-dominated Sorting Genetic Algorithm II)は、多目的最適化が必要なさまざまな分野で適用されている。以下に、具体的な事例を示す。
1. 自動車設計の最適化
- 事例: エンジン設計のパフォーマンス最適化
- 目的:
- 燃費の向上
- 排出ガスの低減
- エンジン出力の最大化
- 適用:
- エンジンの設計パラメータ(圧縮比、吸気バルブタイミング、燃料噴射量など)を遺伝的アルゴリズムで調整。
- NSGA-IIを用いてパレート最適解を探索し、燃費と排ガスのバランスを取る最適設計を求める。
- 効果:
- CO₂排出量を削減しつつ、燃費性能を向上。
- 従来の試行錯誤よりも設計時間を短縮。
2. 機械学習におけるハイパーパラメータ最適化
- 事例: ニューラルネットワークの最適化
- 目的:
- 精度の最大化
- 計算コストの最小化(学習時間の短縮)
- 適用:
- NSGA-IIを用いて、学習率・バッチサイズ・層の数などのハイパーパラメータを同時に最適化。
- 精度向上と計算時間削減のトレードオフを考慮。
- 効果:
- 高精度なモデルを効率的に構築可能。
- リソースを節約しながら最適なネットワーク構造を探索。
3. ロボット工学
- 事例: ロボットの経路計画
- 目的:
- 移動時間の短縮
- 障害物回避の安全性の向上
- エネルギー消費の最小化
- 適用:
- ロボットが目的地までの最適経路を探索する際、NSGA-IIを使って、移動距離・安全性・バッテリー消費を考慮した経路を探索。
- 効果:
- 省エネで最適な移動ルートを決定。
- 自律走行車やドローンの経路最適化に応用可能。
4. 金融工学
- 事例: ポートフォリオ最適化
- 目的:
- リスクを最小限に抑えつつ、リターンを最大化
- 適用:
- 株式・債券・仮想通貨などの資産配分を、リスクとリターンのトレードオフを考慮しながら最適化。
- NSGA-IIを用いて、異なるリスク許容度に対応するパレートフロントを求める。
- 効果:
- 投資家のリスク選好に応じた最適なポートフォリオを提案可能。
- 従来の単一指標ベースの最適化よりも柔軟な意思決定をサポート。
5. バイオインフォマティクス
- 事例: 遺伝子発現データ解析
- 目的:
- 疾患関連遺伝子の特定
- 遺伝子間の相互作用の解明
- 適用:
- マイクロアレイデータやRNA-Seqデータを用いて、疾患と関連する遺伝子のセットを探索。
- NSGA-IIで、「分類精度」と「特徴量の少なさ」のバランスを考慮したモデルを構築。
- 効果:
- バイオマーカーの発見に寄与し、がん研究や創薬に応用。
6. スマートグリッド最適化
- 事例: 再生可能エネルギーの電力配分
- 目的:
- 電力コストの削減
- 温室効果ガスの削減
- 電力供給の安定化
- 適用:
- 太陽光発電や風力発電の出力変動を考慮しながら、NSGA-IIで電力配分を最適化。
- 蓄電池の充放電スケジュールも同時に最適化。
- 効果:
- 持続可能なエネルギーマネジメントの実現。
- 供給安定性を維持しつつ、コストを削減。
7. 交通・物流最適化
- 事例: 配送ルート最適化
- 目的:
- 配送コストの削減
- 配送時間の短縮
- CO₂排出量の削減
- 適用:
- 物流ネットワーク内の複数のトラックのルートを、燃料消費・距離・時間のトレードオフを考慮して最適化。
- 効果:
- CO₂削減とコスト削減を両立。
- ドローン配送にも応用可能。
NSGA-IIは、多目的最適化が求められるさまざまな分野で活用されており、特に、自動車設計・機械学習・ロボット工学・金融工学・バイオインフォマティクス・スマートグリッド・物流 などで大きな成果を挙げている。「異なる指標のバランスを取りながら最適解を求める」 という課題に対して、NSGA-IIは非常に有効なアプローチとなる。
参考図書
NSGA-II(非支配ソート遺伝的アルゴリズムII)に関する参考図書について述べる。
1. 基礎理論・遺伝的アルゴリズムの理解
Deb, K. (2001). “Multi-Objective Optimization using Evolutionary Algorithms.” Wiley.
NSGA-IIの開発者であるKalyanmoy Debによる基本書。多目的最適化と進化的アルゴリズムの理論を詳細に解説。
Goldberg, D. E. (1989). “Genetic Algorithms in Search, Optimization and Machine Learning.” Addison-Wesley.
遺伝的アルゴリズム(GA)の基本を学ぶのに適した古典的な書籍。
2. NSGA-IIと多目的最適化の応用
Deb, K., Pratap, A., Agarwal, S., & Meyarivan, T. (2002). “A fast and elitist multiobjective genetic algorithm: NSGA-II.” IEEE Transactions on Evolutionary Computation, 6(2), 182-197.
NSGA-IIの元論文。アルゴリズムの詳細な説明や計算の流れが書かれている。
Coello Coello, C. A., Lamont, G. B., & Veldhuizen, D. A. (2007). “Evolutionary Algorithms for Solving Multi-Objective Problems.” Springer.
NSGA-IIを含む、多目的最適化の進化的アルゴリズムについて幅広く解説。
Konak, A., Coit, D. W., & Smith, A. E. (2006). “Multi-objective optimization using genetic algorithms: A tutorial.” Reliability Engineering & System Safety, 91(9), 992-1007.
実際の適用事例や、多目的GAの理論を分かりやすく説明。
3. 応用分野別のNSGA-II活用
Zitzler, E., Deb, K., & Thiele, L. (2000). “Comparison of multiobjective evolutionary algorithms: Empirical results.” Evolutionary Computation, 8(2), 173-195.
NSGA-IIを他の多目的最適化アルゴリズムと比較した論文。
Deb, K., & Jain, H. (2014). “An evolutionary many-objective optimization algorithm using reference-point-based non-dominated sorting approach, part I: Solving problems with box constraints.” IEEE Transactions on Evolutionary Computation, 18(4), 577-601.
高次元(4目的以上)の多目的最適化への拡張手法について解説。
Miettinen, K. (1999). “Nonlinear Multiobjective Optimization.” Springer.
数学的視点から多目的最適化を解説。工学や経済分野の適用例も豊富。
4. 実装とプログラミング
Luke, S. (2013). “Essentials of Metaheuristics.” Lulu.
NSGA-IIを含むメタヒューリスティクスの実装を学べる。Pythonコードの例もある。
Python: DEAP (Distributed Evolutionary Algorithms in Python)
PythonでNSGA-IIを実装するためのライブラリ。公式ドキュメントが充実しており、サンプルコードも豊富。
MATLAB: Global Optimization Toolbox
MATLABでNSGA-IIを使った多目的最適化が可能。実験的なシミュレーションが容易。
コメント