pymoo
多目的最適化フレームワーク。NSGA-II・NSGA-III・MOEA/Dなどのアルゴリズムやパレートフロント、制約処理、ZDT・DTLZベンチマークをサポートし、工学設計や最適化問題に活用できます。
description の原文を見る
Multi-objective optimization framework. NSGA-II, NSGA-III, MOEA/D, Pareto fronts, constraint handling, benchmarks (ZDT, DTLZ), for engineering design and optimization problems.
SKILL.md 本文
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, # 何を最適化するか
algorithm, # どのように最適化するか
termination, # いつ停止するか
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
# 組み込み問題
problem = get_problem("rastrigin", n_var=10)
# 遺伝的アルゴリズムを設定
algorithm = GA(
pop_size=100,
eliminate_duplicates=True
)
# 最適化を実行
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(二目的・三目的の標準)
ステップ:
- 多目的問題を定義する
- 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
# 二目的ベンチマーク問題
problem = get_problem("zdt1")
# NSGA-II アルゴリズム
algorithm = NSGA2(pop_size=100)
# 最適化を実行
result = minimize(problem, algorithm, ('n_gen', 200), seed=1)
# パレートフロントを可視化
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 を設定する
- 最適化を実行する
- 平行座標プロットを使用して可視化する
例:
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
# 多数目的問題(5 つの目的)
problem = get_problem("dtlz2", n_obj=5)
# 参照方向を生成(NSGA-III では必須)
ref_dirs = get_reference_directions("das-dennis", n_dim=5, n_partitions=12)
# NSGA-III を設定
algorithm = NSGA3(ref_dirs=ref_dirs)
# 最適化を実行
result = minimize(problem, algorithm, ('n_gen', 300), seed=1)
# 平行座標で可視化
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, # 変数の数
n_obj=2, # 目的の数
xl=np.array([0, 0]), # 下限
xu=np.array([5, 5]) # 上限
)
def _evaluate(self, x, out, *args, **kwargs):
# 目的関数を定義
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, # 不等式制約
n_eq_constr=1, # 等式制約
xl=np.array([0, 0]),
xu=np.array([5, 5])
)
def _evaluate(self, x, out, *args, **kwargs):
# 目的関数
out["F"] = [f1, f2]
# 不等式制約(g <= 0)
out["G"] = [g1, g2]
# 等式制約(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
# 制約付き問題で自動的に機能
algorithm = NSGA2(pop_size=100)
result = minimize(problem, algorithm, termination)
# 実行可能性を確認
feasible = result.CV[:, 0] == 0 # CV = 制約違反
print(f"Feasible solutions: {np.sum(feasible)}")
2. ペナルティ法
from pymoo.constraints.as_penalty import ConstraintsAsPenalty
# 制約をペナルティに変換するために問題をラップ
problem_penalized = ConstraintsAsPenalty(problem, penalty=1e6)
3. 目的関数としての制約
from pymoo.constraints.as_obj import ConstraintsAsObjective
# 制約違反を追加の目的として扱う
problem_with_cv = ConstraintsAsObjective(problem)
4. 専門的なアルゴリズム
from pymoo.algorithms.soo.nonconvex.sres import SRES
# SRES は組み込み制約処理を持つ
algorithm = SRES()
参照: references/constraints_mcdm.md で包括的な制約処理ガイドを確認してください
ワークフロー 6: パレートフロントからの意思決定
用途: パレートフロントを持つが、好ましい解を選択する必要がある場合
ステップ:
- 多目的最適化を実行する
- 目的関数を [0, 1] に正規化する
- 選好の重みを定義する
- MCDM 手法を適用する
- 選択した解を可視化する
疑似重み法を使用した例:
from pymoo.mcdm.pseudo_weights import PseudoWeights
import numpy as np
# 多目的最適化から結果を得た後
# 目的関数を正規化
F_norm = (result.F - result.F.min(axis=0)) / (result.F.max(axis=0) - result.F.min(axis=0))
# 選好を定義(合計が 1 になる必要がある)
weights = np.array([0.3, 0.7]) # f1 が 30%、f2 が 70%
# 意思決定を適用
dm = PseudoWeights(weights)
selected_idx = dm.do(F_norm)
# 選択した解を取得
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で完全な例を確認してくださいreferences/constraints_mcdm.mdで詳細な MCDM 手法を確認してください
ワークフロー 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) # 自動的に 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
# 単一目的
problem = get_problem("rastrigin", n_var=10)
problem = get_problem("rosenbrock", n_var=10)
# 多目的
problem = get_problem("zdt1") # 凸フロント
problem = get_problem("zdt2") # 非凸フロント
problem = get_problem("zdt3") # 非連続フロント
# 多数目的
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(シミュレーション二項交叉)
- 突然変異:PM(多項式突然変異)
二値変数:
- 交叉: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)
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- davila7
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/davila7/claude-code-templates / ライセンス: MIT
関連スキル
nano-banana-2
inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
nano-banana
Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。