DEAP(Distributed Evolutionary Algorithms in Python)
DEAP(Distributed Evolutionary Algorithms in Python) は、進化計算(Evolutionary Computation) や遺伝的アルゴリズム(Genetic Algorithms) を含む進化的アルゴリズム のためのPythonライブラリです。
以下は、deapライブラリ の主な特徴と機能です。
1. 遺伝的アルゴリズムのサポート: deapは主に遺伝的アルゴリズム(Genetic Algorithms) を実装するためのツールボックスを提供しています。遺伝的アルゴリズム は、生物学的な進化の原則に基づいて問題を解く最適化手法です。
2. 進化計算アルゴリズム: deap は他の進化計算アルゴリズムもサポートしており、遺伝的プログラミング(Genetic Programming) 、進化戦略(Evolution Strategies) 、遺伝的プログラミング(Genetic Programming) などを含む様々な進化計算手法 を実装できます。
3. 柔軟性と拡張性: deapは柔軟かつ拡張性があり、ユーザーが独自の進化的アルゴリズムを構築するための豊富な機能を提供します。遺伝的操作 や適応度評価関数の定義 、進化戦略の設定 など、各要素を簡単にカスタマイズできます。
4. 統計情報の収集: deapは進化計算の過程で発生する*統計情報を収集し、 進化の様子**を視覚化するためのツールも提供します。 これにより、進化の効率や収束の速さなどを分析することが可能です。
5. 分散進化アルゴリズム: deapは分散進化計算 をサポートし、分散環境での進化計算 を実現できます。 これにより、複雑な最適化問題 を解決するために複数の計算ノードを利用することが可能です。
サンプルコード
以下は、deapライブラリ の基本的な使用例です。
この例は、遺伝的アルゴリズム を使用して1次元の関数の最小値 を求めるものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 !pip install deap from deap import base, creator, tools, algorithmsimport randomimport numpy as npcreator.create("FitnessMin" , base.Fitness, weights=(-1.0 ,)) creator.create("Individual" , np.ndarray, fitness=creator.FitnessMin) toolbox = base.Toolbox() toolbox.register("attr_float" , random.uniform, -5 , 5 ) toolbox.register("individual" , tools.initRepeat, creator.Individual, toolbox.attr_float, 1 ) toolbox.register("population" , tools.initRepeat, list , toolbox.individual) def evaluate (individual ): return individual[0 ]**2 , toolbox.register("mate" , tools.cxBlend, alpha=0.5 ) toolbox.register("mutate" , tools.mutGaussian, mu=0 , sigma=1 , indpb=0.2 ) toolbox.register("select" , tools.selTournament, tournsize=3 ) toolbox.register("evaluate" , evaluate) pop = toolbox.population(n=50 ) algorithms.eaMuPlusLambda(pop, toolbox, mu=10 , lambda_=50 , cxpb=0.7 , mutpb=0.2 , ngen=100 , stats=None , halloffame=None , verbose=True ) best_ind = tools.selBest(pop, 1 )[0 ] print ("最適な個体:" , best_ind)print ("最小値:" , best_ind.fitness.values[0 ])
このコードでは、2乗した値が最小 となるような1次元の関数を最適化 しています。
[実行結果]
gen nevals
0 50
1 45
2 40
3 43
4 45
5 41
6 42
7 45
8 47
9 43
10 43
11 46
12 42
13 49
14 47
15 47
16 43
17 46
18 46
19 45
20 43
21 46
22 47
23 47
24 45
25 44
26 45
27 42
28 41
29 48
30 45
31 42
32 47
33 45
34 45
35 46
36 45
37 47
38 47
39 46
40 44
41 42
42 46
43 39
44 43
45 49
46 45
47 45
48 40
49 46
50 43
51 47
52 45
53 46
54 46
55 46
56 46
57 45
58 44
59 43
60 48
61 48
62 46
63 42
64 46
65 49
66 40
67 44
68 47
69 48
70 48
71 44
72 45
73 45
74 44
75 46
76 44
77 48
78 48
79 43
80 42
81 43
82 42
83 48
84 41
85 42
86 47
87 45
88 45
89 43
90 43
91 43
92 45
93 47
94 47
95 43
96 44
97 48
98 45
99 45
100 44
最適な個体: [-2.50777571e-07]
最小値: 6.288939021627859e-14
ソースコード解説
このPythonスクリプトは、deapライブラリを使用して進化計算(遺伝的アルゴリズム) を実行し、1次元の関数を最適化 する例です。
以下にコードの章立てと詳細な説明を示します。
1. モジュールのインポート: 1 2 3 from deap import base, creator, tools, algorithmsimport randomimport numpy as np
必要なモジュールやライブラリをインポートしています。deapライブラリ に加え、random やnumpy も使用します。
2. 適応度クラスの作成: 1 2 creator.create("FitnessMin" , base.Fitness, weights=(-1.0 ,)) creator.create("Individual" , np.ndarray, fitness=creator.FitnessMin)
deap で遺伝的アルゴリズム を使用するために必要な適応度クラス と個体クラス を作成しています。
3. 遺伝子個体の初期化: 1 2 3 4 toolbox = base.Toolbox() toolbox.register("attr_float" , random.uniform, -5 , 5 ) toolbox.register("individual" , tools.initRepeat, creator.Individual, toolbox.attr_float, 1 ) toolbox.register("population" , tools.initRepeat, list , toolbox.individual)
遺伝子個体の初期化 を行っています。 個体は1次元の浮動小数点数からなり、その範囲は$-5$から$5$までです。
4. 適応度評価関数: 1 2 def evaluate (individual ): return individual[0 ]**2 ,
適応度関数 を定義しています。 この例では、最小値を求めるために個体の1乗を適応度 としています。
5. 遺伝的操作: 1 2 3 4 toolbox.register("mate" , tools.cxBlend, alpha=0.5 ) toolbox.register("mutate" , tools.mutGaussian, mu=0 , sigma=1 , indpb=0.2 ) toolbox.register("select" , tools.selTournament, tournsize=3 ) toolbox.register("evaluate" , evaluate)
遺伝的操作(交叉、突然変異、選択) を定義しています。 具体的な操作は、ブレンド交叉 、ガウシアン突然変異 、トーナメント選択 です。
6. 進化計算の実行: 1 2 pop = toolbox.population(n=50 ) algorithms.eaMuPlusLambda(pop, toolbox, mu=10 , lambda_=50 , cxpb=0.7 , mutpb=0.2 , ngen=100 , stats=None , halloffame=None , verbose=True )
初期個体を生成し、進化計算 を実行しています。eaMuPlusLambdaはμ+λ進化アルゴリズム を指します。
7. 結果の表示: 1 2 3 best_ind = tools.selBest(pop, 1 )[0 ] print ("最適な個体:" , best_ind)print ("最小値:" , best_ind.fitness.values[0 ])
進化計算の結果として、最適な個体 とその適応度 を表示しています。
適応度関数の最小値 が最適な解です。
結果解説
実行結果は、進化計算の各世代(generation)ごとの統計情報 を示しています。
各行には、進化計算の特定の世代における情報が含まれています。
gen: 世代数
nevals: 評価された個体数
例えば、最初の行では世代数$0$で$50$個体が評価されました。
最終的には$100$世代まで進化計算が行われています。
ここで注目すべきポイントは、最終的な結果です:
最適な個体: [-2.50777571e-07]
最小値: 6.288939021627859e-14
最適な個体は1つの次元を持つ浮動小数点数の配列で、その最小値はほぼゼロに非常に近い値 です。 進化計算は、遺伝的アルゴリズムを使用してこの最小値に収束 しました。
なお、最適な個体がゼロに近い値であることから、この例では1次元関数$ f(x) = x^2 $を最小化しています。 ゼロがこの関数の最小値 であり、進化計算がそれに収束 したことが示されています。