pymoo について
pymooは、単目的・多目的問題を扱うPython最適化フレームワークです。制約や混合変数、競合する目標に取り組む人向けに、アルゴリズム、パレート解の分析、可視化、意思決定の方法を案内します。
主な機能
- 01単目的・多目的アルゴリズム
- 02問題定義と制約のカスタマイズ
- 03パレートフロントの探索と分析
- 04ベンチマーク問題集
- 05結果の可視化と意思決定手法
活用シーン
- 01競合する目標間のトレードオフを探索
- 02制約付き・混合変数問題を最適化
- 03進化アルゴリズムをベンチマーク
- 04パレートフロントから解を選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill pymooインストール後、Claude Code で/pymooを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/algorithms.mdconstraints_mcdm.mdoperators.mdproblems.mdvisualization.mdscripts/custom_problem_example.pydecision_making_example.pymany_objective_example.pymulti_objective_example.pysingle_objective_example.py詳細
Pymoo - Python による多目的最適化
概要
Pymoo は、多目的問題を重視した最適化のための包括的な Python フレームワークです。最先端のアルゴリズム(NSGA-II/III、MOEA/D)、ベンチマーク問題(ZDT、DTLZ)、カスタマイズ可能な遺伝的オペレーター、多基準意思決定手法を使用して、単目的および多目的の最適化問題を解くことができます。目的同士が相反する問題において、トレードオフの解(パレートフロント)を見つけることに優れています。
このスキルを使用するタイミング
このスキルは、次のような場合に使用します。
- 1 つまたは複数の目的を持つ最適化問題を解く場合
- パレート最適解を見つけ、トレードオフを分析する場合
- 進化的アルゴリズム(GA、DE、PSO、NSGA-II/III)を実装する場合
- 制約付き最適化問題を扱う場合
- 標準的なテスト問題(ZDT、DTLZ、WFG)でアルゴリズムをベンチマークする場合
- 遺伝的オペレーター(交叉、突然変異、選択)をカスタマイズする場合
- 高次元の最適化結果を可視化する場合
- 競合する複数の解から意思決定を行う場合
- 二値、離散、連続、または混合変数の問題を扱う場合
中核となる概念
統一インターフェース
Pymoo は、すべての最適化タスクに対して一貫した minimize() 関数を使用します。
from pymoo.optimize import minimize
result = minimize(
problem, # What to optimize
algorithm, # How to optimize
termination, # When to stop
seed=1,
verbose=True
)
結果オブジェクトの内容:
result.X: 最適解の決定変数result.F: 最適解の目的関数値result.G: 制約違反量(制約がある場合)result.algorithm: 履歴を持つアルゴリズムオブジェクト
問題の種類
単目的: 最小化または最大化する目的が 1 つ 多目的: 相反する 2〜3 個の目的 → パレートフロント 多数目的: 4 個以上の目的 → 高次元のパレートフロント 制約付き: 目的 + 不等式/等式制約 動的: 時間によって変化する目的または制約
クイックスタートのワークフロー
ワークフロー 1: 単目的最適化
使用時: 1 つの目的関数を最適化する場合
手順:
- 問題を定義または選択する
- 単目的アルゴリズム(GA、DE、PSO、CMA-ES)を選択する
- 終了条件を設定する
- 最適化を実行する
- 最良解を取り出す
例:
from pymoo.algorithms.soo.nonconvex.ga import GA
from pymoo.problems import get_problem
from pymoo.optimize import minimize
# Built-in problem
problem = get_problem("rastrigin", n_var=10)
# Configure Genetic Algorithm
algorithm = GA(
pop_size=100,
eliminate_duplicates=True
)
# Optimize
result = minimize(
problem,
algorithm,
('n_gen', 200),
seed=1,
verbose=True
)
print(f"Best solution: {result.X}")
print(f"Best objective: {result.F[0]}")
参照: 完全な例は scripts/single_objective_example.py を参照してください
ワークフロー 2: 多目的最適化(2〜3 個の目的)
使用時: 相反する 2〜3 個の目的を最適化し、パレートフロントが必要な場合
アルゴリズムの選択: NSGA-II(2 目的・3 目的の標準)
手順:
- 多目的問題を定義する
- NSGA-II を設定する
- 最適化を実行してパレートフロントを得る
- トレードオフを可視化する
- 意思決定を適用する(任意)
例:
from pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.problems import get_problem
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter
# Bi-objective benchmark problem
problem = get_problem("zdt1")
# NSGA-II algorithm
algorithm = NSGA2(pop_size=100)
# Optimize
result = minimize(problem, algorithm, ('n_gen', 200), seed=1)
# Visualize Pareto front
plot = Scatter()
plot.add(result.F, label="Obtained Front")
plot.add(problem.pareto_front(), label="True Front", alpha=0.3)
plot.show()
print(f"Found {len(result.F)} Pareto-optimal solutions")
参照: 完全な例は scripts/multi_objective_example.py を参照してください
ワークフロー 3: 多数目的最適化(4 個以上の目的)
使用時: 4 個以上の目的を最適化する場合
アルゴリズムの選択: NSGA-III(多数目的向けに設計)
主な違い: 集団を導くための参照方向を必ず与える必要があります
手順:
- 多数目的問題を定義する
- 参照方向を生成する
- 参照方向を指定して NSGA-III を設定する
- 最適化を実行する
- Parallel Coordinate Plot を使って可視化する
例:
from pymoo.algorithms.moo.nsga3 import NSGA3
from pymoo.problems import get_problem
from pymoo.optimize import minimize
from pymoo.util.ref_dirs import get_reference_directions
from pymoo.visualization.pcp import PCP
# Many-objective problem (5 objectives)
problem = get_problem("dtlz2", n_obj=5)
# Generate reference directions (required for NSGA-III)
ref_dirs = get_reference_directions("das-dennis", n_dim=5, n_partitions=12)
# Configure NSGA-III
algorithm = NSGA3(ref_dirs=ref_dirs)
# Optimize
result = minimize(problem, algorithm, ('n_gen', 300), seed=1)
# Visualize with Parallel Coordinates
plot = PCP(labels=[f"f{i+1}" for i in range(5)])
plot.add(result.F, alpha=0.3)
plot.show()
参照: 完全な例は scripts/many_objective_example.py を参照してください
ワークフロー 4: カスタム問題の定義
使用時: 特定分野の最適化問題を解く場合
手順:
ElementwiseProblemクラスを拡張する- 問題の次元と境界を指定して
__init__を定義する - 目的(および制約)のために
_evaluateメソッドを実装する - 任意のアルゴリズムで使用する
制約なしの例:
from pymoo.core.problem import ElementwiseProblem
import numpy as np
class MyProblem(ElementwiseProblem):
def __init__(self):
super().__init__(
n_var=2, # Number of variables
n_obj=2, # Number of objectives
xl=np.array([0, 0]), # Lower bounds
xu=np.array([5, 5]) # Upper bounds
)
def _evaluate(self, x, out, *args, **kwargs):
# Define objectives
f1 = x[0]**2 + x[1]**2
f2 = (x[0]-1)**2 + (x[1]-1)**2
out["F"] = [f1, f2]
制約付きの例:
class ConstrainedProblem(ElementwiseProblem):
def __init__(self):
super().__init__(
n_var=2,
n_obj=2,
n_ieq_constr=2, # Inequality constraints
n_eq_constr=1, # Equality constraints
xl=np.array([0, 0]),
xu=np.array([5, 5])
)
def _evaluate(self, x, out, *args, **kwargs):
# Objectives
out["F"] = [f1, f2]
# Inequality constraints (g <= 0)
out["G"] = [g1, g2]
# Equality constraints (h = 0)
out["H"] = [h1]
制約の定式化ルール:
- 不等式:
g(x) <= 0の形で表す(0 以下のとき実行可能) - 等式:
h(x) = 0の形で表す(0 のとき実行可能) g(x) >= bは-(g(x) - b) <= 0に変換する
参照: 完全な例は scripts/custom_problem_example.py を参照してください
ワークフロー 5: 制約処理
使用場面: 問題に実行可能性の制約がある場合
アプローチの選択肢:
1. 実行可能性優先(デフォルト - 推奨)
from pymoo.algorithms.moo.nsga2 import NSGA2
# Works automatically with constrained problems
algorithm = NSGA2(pop_size=100)
result = minimize(problem, algorithm, termination)
# Check feasibility
feasible = result.CV[:, 0] == 0 # CV = constraint violation
print(f"Feasible solutions: {np.sum(feasible)}")
2. ペナルティ法
from pymoo.constraints.as_penalty import ConstraintsAsPenalty
# Wrap problem to convert constraints to penalties
problem_penalized = ConstraintsAsPenalty(problem, penalty=1e6)
3. 目的としての制約
from pymoo.constraints.as_obj import ConstraintsAsObjective
# Treat constraint violation as additional objective
problem_with_cv = ConstraintsAsObjective(problem)
4. 専用アルゴリズム
from pymoo.algorithms.soo.nonconvex.sres import SRES
# SRES has built-in constraint handling
algorithm = SRES()
参照: 制約処理の包括的なガイドについては references/constraints_mcdm.md を参照してください
ワークフロー 6: パレートフロントからの意思決定
使用場面: パレートフロントがあり、好みの解を選択する必要がある場合
手順:
- 多目的最適化を実行する
- 目的関数を [0, 1] に正規化する
- 選好の重みを定義する
- MCDM 手法を適用する
- 選択された解を可視化する
擬似重みを用いた例:
from pymoo.mcdm.pseudo_weights import PseudoWeights
import numpy as np
# After obtaining result from multi-objective optimization
# Normalize objectives
F_norm = (result.F - result.F.min(axis=0)) / (result.F.max(axis=0) - result.F.min(axis=0))
# Define preferences (must sum to 1)
weights = np.array([0.3, 0.7]) # 30% f1, 70% f2
# Apply decision making
dm = PseudoWeights(weights)
selected_idx = dm.do(F_norm)
# Get selected solution
best_solution = result.X[selected_idx]
best_objectives = result.F[selected_idx]
print(f"Selected solution: {best_solution}")
print(f"Objective values: {best_objectives}")
その他の MCDM 手法:
- 妥協計画法: 理想点に最も近い解を選択する
- ニーポイント: バランスのとれたトレードオフの解を見つける
- ハイパーボリューム寄与度: 最も多様性のある部分集合を選択する
参照:
- 完全な例については
scripts/decision_making_example.pyを参照してください - 詳細な MCDM 手法については
references/constraints_mcdm.mdを参照してください
ワークフロー 7: 可視化
目的関数の数に応じて可視化方法を選択してください:
2 目的: 散布図
from pymoo.visualization.scatter import Scatter
plot = Scatter(title="Bi-objective Results")
plot.add(result.F, color="blue", alpha=0.7)
plot.show()
3 目的: 3D 散布図
plot = Scatter(title="Tri-objective Results")
plot.add(result.F) # Automatically renders in 3D
plot.show()
4 目的以上: 平行座標プロット
from pymoo.visualization.pcp import PCP
plot = PCP(
labels=[f"f{i+1}" for i in range(n_obj)],
normalize_each_axis=True
)
plot.add(result.F, alpha=0.3)
plot.show()
解の比較: ペタルダイアグラム
from pymoo.visualization.petal import Petal
plot = Petal(
bounds=[result.F.min(axis=0), result.F.max(axis=0)],
labels=["Cost", "Weight", "Efficiency"]
)
plot.add(solution_A, label="Design A")
plot.add(solution_B, label="Design B")
plot.show()
参照: すべての可視化の種類と使用方法については references/visualization.md を参照してください
アルゴリズム選択ガイド
単目的問題
| アルゴリズム | 最適な用途 | 主な特徴 |
|---|---|---|
| GA | 汎用 | 柔軟で、演算子をカスタマイズできる |
| DE | 連続最適化 | 大域探索に優れる |
| PSO | 滑らかな地形 | 高速な収束 |
| CMA-ES | 困難・ノイズを含む問題 | 自己適応型 |
多目的問題(2〜3 目的)
| アルゴリズム | 最適な用途 | 主な特徴 |
|---|---|---|
| NSGA-II | 標準的なベンチマーク | 高速で、信頼性が高く、十分に検証されている |
| R-NSGA-II | 選好領域 | 参照点による誘導 |
| MOEA/D | 分解可能な問題 | スカラー化アプローチ |
多目的問題(4 目的以上)
| アルゴリズム | 最適な用途 | 主な特徴 |
|---|---|---|
| NSGA-III | 4〜15 目的 | 参照方向ベース |
| RVEA | 適応的な探索 | 参照ベクトルの進化 |
| AGE-MOEA | 複雑な地形 | 適応的な幾何 |
制約付き問題
| アプローチ | アルゴリズム | 使用場面 |
|---|---|---|
| 実行可能性優先 | 任意のアルゴリズム | 実行可能領域が大きい場合 |
| 専用 | SRES, ISRES | 制約が多い場合 |
| ペナルティ | GA + ペナルティ | アルゴリズムとの互換性 |
参照: 包括的なアルゴリズムリファレンスについては references/algorithms.md を参照してください
ベンチマーク問題
問題へのクイックアクセス:
from pymoo.problems import get_problem
# Single-objective
problem = get_problem("rastrigin", n_var=10)
problem = get_problem("rosenbrock", n_var=10)
# Multi-objective
problem = get_problem("zdt1") # Convex front
problem = get_problem("zdt2") # Non-convex front
problem = get_problem("zdt3") # Disconnected front
# Many-objective
problem = get_problem("dtlz2", n_obj=5, n_var=12)
problem = get_problem("dtlz7", n_obj=4)
参照: 完全なテスト問題リファレンスについては references/problems.md を参照してください
遺伝的演算子のカスタマイズ
標準的な演算子の設定:
from pymoo.algorithms.soo.nonconvex.ga import GA
from pymoo.operators.crossover.sbx import SBX
from pymoo.operators.mutation.pm import PM
algorithm = GA(
pop_size=100,
crossover=SBX(prob=0.9, eta=15),
mutation=PM(eta=20),
eliminate_duplicates=True
)
変数の種類による演算子の選択:
連続変数:
- 交叉: SBX(Simulated Binary Crossover)
- 突然変異: PM(Polynomial Mutation)
バイナリ変数:
- 交叉: TwoPointCrossover, UniformCrossover
- 突然変異: BitflipMutation
順列(TSP、スケジューリング):
- 交叉: OrderCrossover (OX)
- 突然変異: InversionMutation
参照: 包括的な演算子リファレンスについては references/operators.md を参照してください
パフォーマンスとトラブルシューティング
よくある問題と解決策:
問題: アルゴリズムが収束しない
- 個体群サイズを増やす
- 世代数を増やす
- 問題が多峰性かどうかを確認する(別のアルゴリズムを試す)
- 制約が正しく定式化されているか検証する
問題: パレートフロントの分布が悪い
- NSGA-III の場合: 参照方向を調整する
- 個体群サイズを増やす
- 重複排除を確認する
- 問題のスケーリングを検証する
問題: 実行可能解が少ない
- 制約を目的関数として扱う手法を使う
- 修復オペレーターを適用する
- 制約付き問題には SRES/ISRES を試す
- 制約の定式化を確認する(g <= 0 とすべき)
問題: 計算コストが高い
- 個体群サイズを減らす
- 世代数を減らす
- より単純なオペレーターを使う
- 並列化を有効にする(問題が対応している場合)
ベストプラクティス:
- スケールが大きく異なる場合は 目的関数を正規化する
- 再現性のために 乱数シードを設定する
- 収束を分析するために 履歴を保存する:
save_history=True - 解の品質を理解するために 結果を可視化する
- 利用可能な場合は 真のパレートフロントと比較する
- 適切な終了条件を使用する(世代数、評価回数、許容誤差)
- 問題の特性に合わせて オペレーターのパラメーターを調整する
リソース
このスキルには、詳細なリファレンスドキュメントと実行可能な例が含まれています:
references/
深い理解のための詳細なドキュメント:
- algorithms.md: パラメーター、使い方、選択ガイドラインを含む完全なアルゴリズムリファレンス
- problems.md: ベンチマークテスト問題(ZDT、DTLZ、WFG)と特性
- operators.md: 遺伝的オペレーター(サンプリング、選択、交叉、突然変異)と設定
- visualization.md: 例と選択ガイド付きのすべての可視化タイプ
- constraints_mcdm.md: 制約処理技術と多基準意思決定手法
リファレンスの検索パターン:
- アルゴリズムの詳細:
grep -r "NSGA-II\|NSGA-III\|MOEA/D" references/ - 制約手法:
grep -r "Feasibility First\|Penalty\|Repair" references/ - 可視化タイプ:
grep -r "Scatter\|PCP\|Petal" references/
scripts/
一般的なワークフローを示す実行可能な例:
- single_objective_example.py: GA による基本的な単一目的最適化
- multi_objective_example.py: NSGA-II による多目的最適化と可視化
- many_objective_example.py: NSGA-III による多数目的最適化と参照方向
- custom_problem_example.py: カスタム問題の定義(制約あり・なし)
- decision_making_example.py: 異なる選好による多基準意思決定
例の実行:
python3 scripts/single_objective_example.py
python3 scripts/multi_objective_example.py
python3 scripts/many_objective_example.py
python3 scripts/custom_problem_example.py
python3 scripts/decision_making_example.py
追加情報
インストール:
uv pip install pymoo
依存関係: NumPy、SciPy、matplotlib、autograd(勾配ベース手法で任意)
ドキュメント: https://pymoo.org/
バージョン: このスキルは pymoo 0.6.x に基づいています
よく使うパターン:
- カスタム問題には常に
ElementwiseProblemを使用する - 制約は
g(x) <= 0およびh(x) = 0として定式化する - NSGA-III には参照方向が必要である
- MCDM の前に目的関数を正規化する
- 適切な終了条件を使用する:
('n_gen', N)またはget_termination("f_tol", tol=0.001)