DEAP(Distributed Evolutionary Algorithms)
DEAP(Distributed Evolutionary Algorithms)は、遺伝的アルゴリズム(GA)や進化的計算を実装するための強力で柔軟なライブラリです。
以下に、DEAPの便利な使い方をいくつか紹介します。
インストール
まず、DEAPをインストールします。
1 | pip install deap |
基本的な使い方
1. 必要なモジュールのインポート
1 | import random |
2. 問題の設定
最大化問題の適応度を定義します。
1 | creator.create("FitnessMax", base.Fitness, weights=(1.0,)) |
3. 個体と集団の初期化
1 | toolbox = base.Toolbox() |
4. 適応度関数の定義
1 | def eval_function(individual): |
5. 遺伝的操作の定義
1 | toolbox.register("mate", tools.cxTwoPoint) |
6. 進化の実行
1 | def main(): |
ソースコードの詳細を説明します。
初期設定
1 | random.seed(42) |
random.seed(42)
:ランダムな値の生成に一貫性を持たせるためにシード値を設定します。population = toolbox.population(n=300)
:$300$個体の初期集団を生成します。toolbox.population
は、遺伝的アルゴリズムのために設定された関数です。ngen = 40
:進化の世代数を$40$に設定します。cxpb = 0.5
:交叉(crossover)の確率を$0.5$に設定します。mutpb = 0.2
:突然変異(mutation)の確率を$0.2$に設定します。
適応度の計算
1 | fitnesses = list(map(toolbox.evaluate, population)) |
fitnesses = list(map(toolbox.evaluate, population))
:初期集団の各個体の適応度を評価し、リストに格納します。for ind, fit in zip(population, fitnesses)
:各個体の適応度を設定します。
進化のループ
1 | for g in range(ngen): |
for g in range(ngen)
:40世代の進化を繰り返します。offspring = toolbox.select(population, len(population))
:次世代の個体を選択します。offspring = list(map(toolbox.clone, offspring))
:選択された個体をクローンします。
交叉と突然変異
1 | for child1, child2 in zip(offspring[::2], offspring[1::2]): |
for child1, child2 in zip(offspring[::2], offspring[1::2])
:2つずつペアにして交叉を行います。if random.random() < cxpb
:交叉確率に基づいて交叉を実行します。
交叉した個体の適応度を削除します(再評価のため)。for mutant in offspring
:突然変異を行います。if random.random() < mutpb
:突然変異確率に基づいて突然変異を実行します。
突然変異した個体の適応度を削除します(再評価のため)。
適応度の再計算
1 | invalid_ind = [ind for ind in offspring if not ind.fitness.valid] |
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
:適応度が無効な個体をリストにします。fitnesses = map(toolbox.evaluate, invalid_ind)
:無効な個体の適応度を再評価します。for ind, fit in zip(invalid_ind, fitnesses)
:再評価された適応度を個体に設定します。population[:] = offspring
:新しい世代の個体で集団を置き換えます。
統計の表示
1 | fits = [ind.fitness.values[0] for ind in population] |
fits = [ind.fitness.values[0] for ind in population]
:集団の各個体の適応度を取得します。mean
:適応度の平均値を計算します。sum2
:適応度の二乗和を計算します。std
:標準偏差を計算します。- 統計情報(最小値、最大値、平均値、標準偏差)を表示します。
最良個体の表示
1 | best_ind = tools.selBest(population, 1)[0] |
best_ind = tools.selBest(population, 1)[0]
:最も適応度の高い個体を選択します。- 最良個体とその適応度を表示します。
このコード全体は、遺伝的アルゴリズムを用いて集団の適応度を向上させるプロセスを実行しています。
交叉と突然変異によって新しい個体を生成し、選択と適応度の再計算を繰り返して、最適解を探索します。
結果解説
[実行結果]
-- Generation 0 -- Min: -23.62122528012338, Max: 63.23216847796773, Avg: 13.94750872866429, Std: 14.117844855355854 -- Generation 1 -- Min: -15.831634197388622, Max: 66.00568167314223, Avg: 25.843928872528465, Std: 12.001841010730187 -- Generation 2 -- Min: 1.571510798629661, Max: 67.7416705994344, Avg: 36.10924261516296, Std: 10.639830457934638 -- Generation 3 -- Min: 17.251545608296084, Max: 70.7377667641021, Avg: 45.18612876125583, Std: 10.224876102168013 -- Generation 4 -- Min: 29.187935928369605, Max: 76.1192756677395, Avg: 53.98213674983369, Std: 8.703585040850301 -- Generation 5 -- Min: 41.67182338605669, Max: 77.93473415749817, Avg: 61.70199699017955, Std: 6.187469589825239 -- Generation 6 -- Min: 52.09535714999056, Max: 78.79192555588493, Avg: 66.62043085395645, Std: 4.748183156856532 -- Generation 7 -- Min: 58.486933075200305, Max: 83.0666536496249, Avg: 70.36244867844377, Std: 4.261643906702605 -- Generation 8 -- Min: 63.62749493842264, Max: 85.16722313166508, Avg: 74.01199704669335, Std: 3.915234083237426 -- Generation 9 -- Min: 67.66567852603893, Max: 87.4679125976825, Avg: 77.51393726261347, Std: 3.6385551917724834 -- Generation 10 -- Min: 70.08903900813345, Max: 90.61910944047975, Avg: 80.6030591219591, Std: 3.427952443409654 -- Generation 11 -- Min: 73.06776847431156, Max: 95.86148332348742, Avg: 83.57800102942038, Std: 2.824878578319968 -- Generation 12 -- Min: 77.12960155059386, Max: 95.86148332348742, Avg: 85.74637442049743, Std: 2.5049934648819057 -- Generation 13 -- Min: 82.22740845194737, Max: 95.86148332348742, Avg: 87.80128821464989, Std: 2.320462412242403 -- Generation 14 -- Min: 83.51896359405892, Max: 97.09479936204475, Avg: 89.75269302806925, Std: 2.438380774085663 -- Generation 15 -- Min: 86.73351504224718, Max: 98.4456927207268, Avg: 91.818120209583, Std: 2.545988726836644 -- Generation 16 -- Min: 88.42499238474882, Max: 100.61389792354642, Avg: 94.09226319826075, Std: 2.285888831052674 -- Generation 17 -- Min: 89.24757995715294, Max: 102.6838520503081, Avg: 96.01564578409, Std: 1.9067732850766526 -- Generation 18 -- Min: 91.86451940577689, Max: 105.13304887155599, Avg: 97.59405316472665, Std: 1.8201684526510389 -- Generation 19 -- Min: 93.09487363840095, Max: 105.37632781629395, Avg: 98.87007574977343, Std: 1.8358356370881441 -- Generation 20 -- Min: 95.24057602651627, Max: 107.56442476215851, Avg: 100.38936719083868, Std: 1.9591513525426185 -- Generation 21 -- Min: 95.29981673148842, Max: 108.63304220299476, Avg: 102.00671712709355, Std: 2.0950703250083142 -- Generation 22 -- Min: 96.9630117534801, Max: 110.31319320264738, Avg: 103.90216297981273, Std: 2.067124226863785 -- Generation 23 -- Min: 100.13912350972645, Max: 113.4146271725918, Avg: 105.59576786559764, Std: 2.047165583227913 -- Generation 24 -- Min: 102.0215365337707, Max: 115.17904279346358, Avg: 107.4314699463842, Std: 2.3470974433739396 -- Generation 25 -- Min: 101.42703170477672, Max: 116.50175575861405, Avg: 109.58206484666111, Std: 2.4236312803244817 -- Generation 26 -- Min: 101.55536223691173, Max: 118.77525231829321, Avg: 111.70036923801922, Std: 2.28186217906567 -- Generation 27 -- Min: 107.3971040840559, Max: 121.77595229614845, Avg: 113.44641244359892, Std: 2.204699713517585 -- Generation 28 -- Min: 108.38391918591364, Max: 121.77595229614845, Avg: 115.29798093245587, Std: 2.071478865376343 -- Generation 29 -- Min: 110.67133487335356, Max: 123.20042811966078, Avg: 116.85867616964943, Std: 2.1699761375316644 -- Generation 30 -- Min: 111.89626831109847, Max: 125.59998028693536, Avg: 118.75443109463095, Std: 2.2065782226142097 -- Generation 31 -- Min: 112.3320132990261, Max: 131.74710678901693, Avg: 120.59690320624509, Std: 2.374984092571527 -- Generation 32 -- Min: 116.66719981073696, Max: 131.74710678901693, Avg: 122.65200536117692, Std: 2.4849500246592715 -- Generation 33 -- Min: 117.25502174406162, Max: 132.02720181664301, Avg: 124.73500348653724, Std: 2.4570849635967265 -- Generation 34 -- Min: 119.70615322562539, Max: 135.4831278203402, Avg: 126.87729177862992, Std: 2.2600095543595398 -- Generation 35 -- Min: 121.96222528366903, Max: 137.06036837117406, Avg: 128.61471631011202, Std: 2.371858244077739 -- Generation 36 -- Min: 123.52343627859534, Max: 140.32944805635685, Avg: 130.8766887732697, Std: 2.5972125655787104 -- Generation 37 -- Min: 124.32891522567849, Max: 140.32944805635685, Avg: 133.02356239681754, Std: 2.7282315847206964 -- Generation 38 -- Min: 128.16134079141833, Max: 142.86296023338744, Avg: 135.31205585347038, Std: 2.590081093067741 -- Generation 39 -- Min: 129.5504839313883, Max: 144.2923424762007, Avg: 137.54003014174438, Std: 2.3489147662185395 Best individual is [16.147497336125568, 18.199133247639097, 18.530466738053317, 14.238184371788577, 11.022451884629906, 11.344285227423816, 12.731661935485569, 13.755150647187078, 16.52025636666822, 11.803254721199565], (144.2923424762007,)
この実行結果は、遺伝的アルゴリズムの進化過程を示しています。
各世代の統計値が出力されており、世代ごとに次の情報が記載されています:
- Min: その世代における個体の最小評価値
- Max: その世代における個体の最大評価値
- Avg: その世代における個体の平均評価値
- Std: その世代における評価値の標準偏差
以下に、各世代における主な傾向を説明します:
初期世代 (Generation $0$):
- 評価値は広範囲に分布しており、最小値は$-23.62$、最大値は$63.23$です。
- 平均値は$13.95$で、標準偏差は$14.12$と高めで、個体の多様性が高いことを示しています。
中間世代 (Generation $1~20$):
- 評価値の最小値と最大値は上昇傾向にあり、個体の適応度が徐々に向上しています。
- 平均値も一貫して上昇しており、遺伝的アルゴリズムが効果的に良い個体を選択・交配していることを示しています。
- 標準偏差は徐々に減少しており、個体の評価値が集中的になっていることを示しています。
後期世代 (Generation $21~39$):
- 評価値の最小値と最大値がさらに上昇し、最大値はGeneration $39$で$144.29$に達しています。
- 平均値も上昇し続けており、最終的には$137.54$に達しています。
- 標準偏差は世代によって若干の変動はあるものの、全体的には減少傾向にあります。
最良の個体:
- 最良の個体は、評価値144.29を達成した個体であり、具体的な遺伝子(パラメータ)の値は以下の通りです:
$ [16.15, 18.20, 18.53, 14.24, 11.02, 11.34, 12.73, 13.76, 16.52, 11.80] $
この結果から、遺伝的アルゴリズムが適切に機能し、世代を重ねるごとに適応度の高い個体が生まれていることが分かります。
評価値が安定的に向上しているため、アルゴリズムが良好に収束していると考えられます。