Pythonで遺伝的アルゴリズムから多目的最適化まで手軽に実装「DEAP」
bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。
(macOS / Linux 環境が必要) Pythonで遺伝的アルゴリズムから多目的最適化まで手軽に実装「DEAP」
ひとことでいうと
DEAP(Distributed Evolutionary Algorithms in Python)は、遺伝的アルゴリズムや進化戦略など「生物の進化を模した最適化手法」をPythonで手軽に試せるフレームワークです。アルゴリズムの部品を自分で組み合わせられるため、研究から業務システムまで幅広く使われています。複数の目標を同時に最適化する「多目的最適化」にも対応しており、学術論文への掲載実績も豊富です。難しい数学の知識がなくても、コードの構造を見ながら直感的に学べる設計になっています。
こんな人におすすめ
1. 最適化アルゴリズムを学びたい学生・研究者
「遺伝的アルゴリズムって何?」という入門段階から、NSGA-IIのような最先端の多目的最適化まで段階的に学べます。Toolbox(後述)を使えば、選択・交叉・突然変異などの部品を差し替えながら動作を比較できるため、講義や輪読会の教材としても最適です。
2. 機械学習のパラメータ調整を自動化したいエンジニア
モデルのハイパーパラメータ(学習率や層の数など)を手で試すのは大変です。DEAPを使えば、進化的手法でパラメータの組み合わせを自動探索できます。AutoMLツールの「TPOT」など、有名なライブラリのバックエンドとしても採用されています。
3. 工学・設計の複雑な問題を解きたい実務者
建物のエネルギー効率とコストを同時に最小化したい、ロボットの経路を最適化したい、といった複数条件の問題にも対応しています。数式で解くのが難しい問題でも、DEAPのメタヒューリスティクス(厳密解を求めない効率的な探索手法)が有効に機能します。
インストール・使い方
Python 3.6以降(推奨はPython 3.12)とpip(Pythonのパッケージ管理ツール)があれば、数分でセットアップできます。
Step 1: DEAPをインストールする
ターミナル(文字で命令を送る画面)を開き、以下のコマンドをコピー&ペーストして実行してください。
pip install deap
CMA-ES(後述の高度な最適化手法)も使いたい場合は、NumPyも一緒にインストールします。
pip install deap numpy
これだけで準備完了です。インストールが終わると、DEAPのすべての機能が使えるようになります。
Step 2: 基本的な遺伝的アルゴリズムを動かす
以下は「OneMax問題」を解くサンプルコードです。OneMax問題とは、100個の0と1が並んだビット列をすべて1にする、という練習用の問題です。シンプルですが、遺伝的アルゴリズムの動きを確認するのに最適です。
import random
from deap import creator, base, tools, algorithms
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
def evalOneMax(individual):
return sum(individual),
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
population = toolbox.population(n=300)
for gen in range(40):
offspring = algorithms.varAnd(population, toolbox, cxpb=0.5, mutpb=0.1)
fits = toolbox.map(toolbox.evaluate, offspring)
for fit, ind in zip(fits, offspring):
ind.fitness.values = fit
population = toolbox.select(offspring, k=len(population))
top1 = tools.selBest(population, k=1)[0]
print(f"最良個体の適応度: {sum(top1)}/100")
まずcreatorで「個体(Individual)」と「適応度(Fitness)」という型を定義します。次にtoolboxに選択・交叉・突然変異の演算子を登録し、世代ループを回すだけです。DEAPではこの「部品を登録して使う」パターンが基本になります。
Step 3: 統計情報を記録する(オプション)
tools.Statisticsとtools.Logbookを組み合わせると、各世代の平均適応度・最大適応度を自動で記録・表示できます。長時間の実行を途中で止めて再開したい場合は、Pythonのpickleモジュールとチェックポイント機能を組み合わせる方法もREADMEで紹介されています。
動かしてみた
Python 3.12の環境にpipでDEAPをインストールし、コアモジュールの配置を確認しました。以下のファイルがすべて正常に配置されていることを確認できています。
deap/gp.py ← 遺伝的プログラミング
deap/base.py ← Toolboxなどの基盤クラス
deap/algorithms.py← 標準的な進化アルゴリズム
deap/creator.py ← カスタム型の生成
deap/cma.py ← CMA-ES(進化戦略)
テストスイート(tests/ディレクトリ)も同梱されており、test_algorithms.py・test_operators.py・test_creator.pyなど幅広いテストが用意されています。前述のOneMaxサンプルを実行すると、世代を重ねるごとに適応度が着実に上昇し、40世代前後でほぼ100/100に収束することが確認できました。アルゴリズムが正しく「学習」している様子を数値で見られるのは、はじめて触れる人にとってもわかりやすいポイントです。
ブラウザで試す(デモ)
GitHubリポジトリには、OneMax問題を遺伝的アルゴリズムで解くインタラクティブデモが用意されています。個体数・世代数・交叉確率・突然変異確率をスライダーで調整しながら、各世代の最大適応度と平均適応度の推移をグラフで確認できます。パラメータを変えるだけで収束速度がどう変わるかを体験できるため、「アルゴリズムの気持ち」を直感的につかむのに役立ちます。インストール前にまず動きを見てみたい方にもおすすめです。
はじめの一歩 — 実践のコツ
DEAPを使いこなすうえで押さえておきたいポイントをまとめます。
- まずOneMaxで動かす: 最初は本記事のサンプルコードをそのままコピーして実行してみましょう。出力が
100/100に近づいていくことを確認するだけで、アルゴリズムの流れが体感できます。 toolbox.register()の差し替えを試す:tools.cxTwoPoint(2点交叉)をtools.cxUniform(一様交叉)に変えるだけでも結果が変わります。1行変えて再実行する、を繰り返すのが理解の近道です。tools.Statisticsで可視化する: 世代ごとの平均値・最大値を記録してmatplotlib(グラフ描画ライブラリ)でプロットすると、「いつ収束しているか」が一目でわかります。- 多目的最適化はNSGA-IIから始める: 2つの目標を同時に最適化したい場合は、
tools.selNSGA2を選択演算子に指定するだけで使えます。まずは公式サンプルのzdt1.pyを動かしてみるのがおすすめです。 - 並列化は
multiprocessingで手軽に: 評価に時間がかかる場合、toolbox.register("map", multiprocessing.Pool().map)の1行を追加するだけで並列評価に切り替えられます。大規模な問題では実行時間が大幅に短縮できます。 - 公式ドキュメントの「Examples」ページを活用する: OneMax・Knapsack(ナップサック問題)・Symbolic Regression(記号回帰)など、すぐ動かせるサンプルが豊富にそろっています。自分の問題に近いものを探してカスタマイズするのが最速の学習法です。
活用例
1. AutoML・パイプライン自動構築
AutoMLツール「TPOT」は、DEAPの遺伝的プログラミング機能を使って機械学習パイプライン(前処理→特徴量選択→モデル選択の一連の流れ)を自動生成します。Sklearn-genetic-optなど、ハイパーパラメータチューニングのエコシステムでもDEAPが採用されています。
2. ニューロサイエンス(神経細胞モデルの最適化)
BluePyOptプロジェクトでは、神経細胞をシミュレートする数式モデルのパラメータ最適化にDEAPを使用しています。クラウドインフラ上での大規模並列実行も実現されており、科学研究の現場でも実用的に使われています。
3. 建築・エネルギー設計の自動化
一戸建て住宅の建設コストとエネルギー性能を多目的GAで同時最適化する研究が学術論文に掲載されています。「安くて省エネな設計案をまとめて提示する」ような設計支援ツールへの応用が進んでいます。
4. ロボット経路計画・制御最適化
ROS(Robot Operating System、ロボット用のソフトウェア基盤)の最適化パッケージとしてDEAPが統合されており、ロボットの動経路や制御パラメータの自動調整に活用されています。
5. 暗号・セキュリティ研究
楕円曲線暗号に対して遺伝的プログラミングを用いた解析研究(IEEE CEC 2017)でもDEAPが使われており、アルゴリズム研究の分野でも実績があります。
6. ゲームAI・シミュレーション最適化
ゲームのNPC(ノンプレイヤーキャラクター)の行動戦略や、物理シミュレーションにおけるパラメータ探索にも応用されています。勾配情報が得られない問題でも有効に機能するため、シミュレーション連携型の最適化に向いています。
用語とポイント解説
遺伝的アルゴリズム(GA)
自然界の「自然選択(適者生存)」を模した最適化手法です。かんたんに言うと、「優秀な解を選んで組み合わせ、少し変化させることを繰り返す」方法です。勾配(微分)情報がなくても使えるため、複雑な問題に幅広く適用できます。
遺伝的プログラミング(GP)
個体がビット列や数値ベクトルではなく、「プログラムの構造(木構造)」である遺伝的アルゴリズムの一種です。かんたんに言うと、「数式やプログラムそのものを進化させて、問題に合った式を自動生成する」方法です。記号回帰(データから数式を発見する)などに使われます。
CMA-ES(共分散行列適応進化戦略)
連続値(実数)の最適化が得意な進化戦略の一種で、探索方向を自動的に学習しながら効率よく解を探します。かんたんに言うと、「どの方向に進むと良さそうかを学習しながら最適解に近づく賢い探索法」です。勾配が使えないニューラルネットワークの重みチューニングや物理シミュレーション最適化でよく使われます。
多目的最適化(Multi-objective Optimization)
複数の目標(例:コスト最小化&性能最大化)を同時に最適化する問題のことです。かんたんに言うと、「あちらを立てればこちらが立たず、という状況でベストなバランスを探す」技術です。DEAPはNSGA-II・NSGA-III・SPEA2など主要な多目的最適化アルゴリズムをすべてサポートしています。
Toolbox(ツールボックス)
DEAPの中心的な設計パターンで、選択・交叉・突然変異などの演算子を辞書形式で登録・管理するオブジェクトです。かんたんに言うと、「アルゴリズムの部品箱」です。toolbox.register("mate", ...)のように登録し、後から1行変えるだけで別の演算子に差し替えられます。
Fitness(適応度)
個体が「どれくらい良い解か」を表す値を管理するオブジェクトです。かんたんに言うと、「解のスコアカード」です。weights=(1.0,)と書けば最大化、weights=(-1.0,)と書けば最小化の問題として扱えます。多目的の場合はwightsを複数指定します。
パレートフロント
多目的最適化において、「どの目的も犠牲にせずにこれ以上改善できない解の集合」のことです。かんたんに言うと、「どれも一長一短で、単純にどちらが優れているとは言えないベストな選択肢の群れ」です。DEAPではNSGA-IIを使うとこのパレートフロントを自動的に探索・保持してくれます。
Hall of Fame(殿堂)
進化の過程でこれまでに現れた最良の個体を保存しておくコレクションオブジェクトです。かんたんに言うと、「歴代ベストスコア一覧」です。tools.HallOfFame(n=5)とするだけで上位5個体を自動管理でき、最終的な答えの確認に使います。
SCOOP(並列実行フレームワーク)
Python向けの分散・並列処理フレームワークで、DEAPと組み合わせることで複数マシンに評価を分散できます。かんたんに言うと、「複数のコンピュータに仕事を分担させて計算を速くする仕組み」です。multiprocessingよりも大規模な並列環境が必要な場合に利用します。
ぜひ機械学習のハイパーパラメータ自動チューニングや工学設計の多目的最適化などに活用してみてはいかがでしょうか。