DEAPの使い方

DEAPの使い方

DEAP(Distributed Evolutionary Algorithms in Python)は、進化的アルゴリズムを簡単に実装できる強力なPythonライブラリです。

DEAP遺伝的アルゴリズム遺伝的プログラミング進化的戦略などの進化的計算技術をサポートします。

以下にDEAPの使い方を紹介します。

インストール

まず、DEAPをインストールします。

1
pip install deap

基本的な使い方

以下は、DEAPを使って簡単な遺伝的アルゴリズムを実装する例です。

この例では、1次元の関数$ ( f(x) = x^2 ) $の最小値を見つけることを目標とします。

ステップ1: 必要なモジュールのインポート

1
2
import random
from deap import base, creator, tools, algorithms

ステップ2: 適応度と個体の定義

1
2
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

ステップ3: 個体と集団の初期化関数の定義

1
2
3
4
5
6
def create_individual():
return [random.uniform(-10, 10)]

toolbox = base.Toolbox()
toolbox.register("individual", tools.initIterate, creator.Individual, create_individual)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

ステップ4: 評価関数の定義

1
2
3
4
def evaluate(individual):
return (individual[0]**2,)

toolbox.register("evaluate", evaluate)

ステップ5: 遺伝的操作(交叉、突然変異、選択)の定義

1
2
3
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)

ステップ6: メインループの実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def main():
random.seed(42)

# 初期集団の生成
population = toolbox.population(n=300)

# 統計情報の記録
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", lambda x: sum(f[0] for f in x) / len(x))
stats.register("min", lambda x: min(f[0] for f in x))
stats.register("max", lambda x: max(f[0] for f in x))

# 遺伝的アルゴリズムの適用
population, log = algorithms.eaSimple(population, toolbox, cxpb=0.5, mutpb=0.2, ngen=40, stats=stats, verbose=True)

return population, log

if __name__ == "__main__":
population, log = main()

詳細な説明

  1. 個体と適応度の定義:

    • creator.create("FitnessMin", base.Fitness, weights=(-1.0,))最小化問題の適応度を定義します。
    • creator.create("Individual", list, fitness=creator.FitnessMin) は個体を定義します。
  2. 個体と集団の初期化:

    • toolbox.register("individual", tools.initIterate, creator.Individual, create_individual) は個体の初期化方法を定義します。
    • toolbox.register("population", tools.initRepeat, list, toolbox.individual) は集団の初期化方法を定義します。
  3. 評価関数の定義:

    • toolbox.register("evaluate", evaluate) は個体の適応度を評価する関数を登録します。
  4. 遺伝的操作の定義:

    • 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)選択方法を定義します。
  5. メインループの実行:

    • 初期集団を生成し、遺伝的アルゴリズムを適用して進化させます。
    • 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)が記録されています。

以下はそれぞれの項目についての説明です。

各項目の説明

  1. gen: 世代数。進化のステップを示します。
  2. nevals: 評価された個体の数。その世代で評価された個体の数を示します。
  3. avg: 平均適応度。その世代の個体の平均適応度(この場合、xの2乗の平均)です。
  4. min: 最小適応度。その世代の中で最も小さい適応度(最小値)を示します。
  5. 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を用いた進化的アルゴリズムが適応度関数の最小化問題を効率的に解決できたことがわかります。

世代を重ねるごとに適応度が改善され、最終的には非常に小さな適応度の個体が得られました。