DEAPの使い方
DEAP(Distributed Evolutionary Algorithms in Python)は、進化的アルゴリズムを簡単に実装できる強力なPythonライブラリです。
DEAPは遺伝的アルゴリズム、遺伝的プログラミング、進化的戦略などの進化的計算技術をサポートします。
以下にDEAPの使い方を紹介します。
インストール
まず、DEAPをインストールします。
1 | pip install deap |
基本的な使い方
以下は、DEAPを使って簡単な遺伝的アルゴリズムを実装する例です。
この例では、1次元の関数$ ( f(x) = x^2 ) $の最小値を見つけることを目標とします。
ステップ1: 必要なモジュールのインポート
1 | import random |
ステップ2: 適応度と個体の定義
1 | creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) |
ステップ3: 個体と集団の初期化関数の定義
1 | def create_individual(): |
ステップ4: 評価関数の定義
1 | def evaluate(individual): |
ステップ5: 遺伝的操作(交叉、突然変異、選択)の定義
1 | toolbox.register("mate", tools.cxBlend, alpha=0.5) |
ステップ6: メインループの実行
1 | def main(): |
詳細な説明
個体と適応度の定義:
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
は最小化問題の適応度を定義します。creator.create("Individual", list, fitness=creator.FitnessMin)
は個体を定義します。
個体と集団の初期化:
toolbox.register("individual", tools.initIterate, creator.Individual, create_individual)
は個体の初期化方法を定義します。toolbox.register("population", tools.initRepeat, list, toolbox.individual)
は集団の初期化方法を定義します。
評価関数の定義:
toolbox.register("evaluate", evaluate)
は個体の適応度を評価する関数を登録します。
遺伝的操作の定義:
toolbox.register("mate", tools.cxBlend, alpha=0.5)
は交叉方法を定義します。toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1)
は突然変異方法を定義します。toolbox.register("select", tools.selTournament, tournsize=3)
は選択方法を定義します。
メインループの実行:
- 初期集団を生成し、遺伝的アルゴリズムを適用して進化させます。
algorithms.eaSimple
はシンプルな進化アルゴリズムを実行します。
応用例
DEAPはこの他にも、複雑な最適化問題や機械学習モデルのハイパーパラメータチューニングなど、多岐にわたる応用が可能です。
進化的アルゴリズムの基本的な操作を組み合わせることで、さまざまな問題に対して効果的な解を見つけることができます。
結果解説
[実行結果]
gen nevals avg min max 0 300 35.1213 0.000137411 99.7714 1 186 11.3106 0.000137411 142.071 2 189 2.06073 8.09465e-05 57.5294 3 182 0.311408 8.09465e-05 5.859 4 201 0.0476175 1.43496e-07 0.537461 5 184 0.0264013 1.43496e-07 1.98748 6 165 0.0187372 1.43496e-07 2.3111 7 184 0.00584479 4.66901e-08 1.01736 8 171 0.0143057 1.74459e-09 2.7338 9 183 0.03766 3.42508e-11 3.13119 10 196 0.0139445 2.70198e-13 1.71795 11 174 0.00763203 9.98396e-12 2.2896 12 183 0.0279807 2.19087e-12 3.16397 13 172 0.0445861 5.71099e-14 4.10532 14 197 0.0404401 9.19872e-16 4.16248 15 193 0.00869942 1.0381e-16 1.68343 16 168 0.017233 4.54004e-18 4.39632 17 190 0.0282809 4.54004e-18 3.99426 18 181 0.00581783 4.54004e-18 1.35411 19 171 0.0169429 1.1955e-20 1.48987 20 178 0.00411972 1.1955e-20 0.942579 21 168 1.49487e-05 1.1955e-20 0.00448462 22 162 0.0339901 2.64989e-24 3.10837 23 190 0.0281804 2.64989e-24 2.458 24 183 0.00136639 2.64989e-24 0.406396 25 192 0.00143387 2.64989e-24 0.415259 26 184 0.0123394 2.64989e-24 1.53045 27 181 0.0065535 1.01205e-25 0.865262 28 174 0.0104235 1.01205e-25 3.07322 29 165 0.0185256 3.81818e-26 2.29195 30 194 0.0189607 8.40103e-28 2.17665 31 177 0.022405 5.31745e-28 4.24237 32 168 0.00344535 1.27978e-30 0.688723 33 198 0.0134132 1.27978e-30 1.96295 34 196 0.0149899 2.52342e-33 2.83645 35 174 0.0222204 8.61228e-34 3.91442 36 199 0.0133543 2.52342e-33 2.43717 37 186 0.0186542 1.59323e-33 2.38034 38 185 0.0256567 9.92576e-36 4.04765 39 182 0.0165402 9.92576e-36 3.32881 40 171 0.00423898 8.06979e-36 0.47821
この結果は、DEAPを用いて進化的アルゴリズムを実行した際の世代ごとの統計情報です。
各世代(gen)において、評価された個体数(nevals)、平均適応度(avg)、最小適応度(min)、最大適応度(max)が記録されています。
以下はそれぞれの項目についての説明です。
各項目の説明
- gen: 世代数。進化のステップを示します。
- nevals: 評価された個体の数。その世代で評価された個体の数を示します。
- avg: 平均適応度。その世代の個体の平均適応度(この場合、xの2乗の平均)です。
- min: 最小適応度。その世代の中で最も小さい適応度(最小値)を示します。
- max: 最大適応度。その世代の中で最も大きい適応度(最大値)を示します。
結果の解説
初期世代(世代0)
- avg: $35.1213$
- min: $0.000137411$
- max: $99.7714$
初期集団では適応度の平均が$35.1213$で、最小値が$0.000137411$、最大値が$99.7714$です。
このことから、初期集団には非常に幅広い適応度の個体が含まれていることがわかります。
世代ごとの進化
進化が進むにつれて、適応度の平均値(avg)は減少していきます。
これは、進化が進むことで適応度が改善されている(より良い個体が選択され、交叉されている)ことを示しています。
例えば、世代$3$では、
- avg: $0.311408$
- min: $0.0000809465$
- max: $5.859$
適応度の平均が$0.311408$に減少し、最小値も$0.0000809465$と非常に小さくなっています。
進化の過程で良好な個体が選択され続けていることがわかります。
最終世代(世代$40$)
- avg: $0.00423898$
- min: $8.06979e-36$
- max: $0.47821$
最終世代では、平均適応度が$0.00423898$まで減少し、最小値は$8.06979e-36$とほぼゼロに近づいています。
これは、進化的アルゴリズムが目標とする適応度関数の最小値を非常に効果的に探索したことを示しています。
まとめ
この結果から、DEAPを用いた進化的アルゴリズムが適応度関数の最小化問題を効率的に解決できたことがわかります。
世代を重ねるごとに適応度が改善され、最終的には非常に小さな適応度の個体が得られました。