【進化から学ぶ】遺伝的アルゴリズムとは?仕組み・手順・活用事例をわかりやすく解説🧬
「自然淘汰」や「遺伝」をヒントにしたアルゴリズム、遺伝的アルゴリズム(Genetic Algorithm, GA)。
機械学習・最適化問題・自動設計など、さまざまな分野で使われています。
この記事では、GAの仕組み・アルゴリズムの流れ・具体的な使い方を、初心者向けにやさしく解説します💡
遺伝的アルゴリズムとは?
**遺伝的アルゴリズム(GA)は、生物の進化の過程(自然選択・突然変異・交叉)**を模倣して、最適解を探すアルゴリズムです。
一般的な数式ではなく、「世代交代」を通じて、より良い解に進化していくのが大きな特徴です🌱
GAの基本の考え方
GAでは、次のようなステップを繰り返します:
-
初期集団(個体群)の生成
-
適応度の評価(どれだけ良いか)
-
選択(優秀な個体を選ぶ)
-
交叉(親の遺伝子を混ぜる)
-
突然変異(少しだけ変化させる)
-
新世代を作り、繰り返す
このサイクルを何十回、何百回と繰り返すことで、最適解に近づいていきます🔥
遺伝子(個体)の表現方法🧬
GAでは「解」を**遺伝子(chromosome)**として表現します。
例)0と1のビット列で「旅行の順番」や「機械の配置」などを表す:
個体A=[1,0,1,1,0,0,1]\text{個体A} = [1, 0, 1, 1, 0, 0, 1]
このビット列が進化の対象になります。
各ステップの詳細🧩
✅ 初期集団の生成
ランダムに複数の解を生成。スタートは適当でOK!
✅ 適応度(Fitness)評価
各個体が「どれだけ良いか」をスコア化。
→ 例:コストが低いほど高得点など。
✅ 選択(Selection)
適応度が高い個体ほど選ばれやすくする。
代表的なのは「ルーレット選択法」や「トーナメント選択法」。
✅ 交叉(Crossover)
2つの個体(親)から新しい個体(子)を作る。
例:
親A: [1 0 1 | 1 0 0]
親B: [0 1 0 | 1 1 1]
↓
子: [1 0 1 | 1 1 1]
✅ 突然変異(Mutation)
ランダムにビットをひっくり返すことで多様性を保つ。
[1,0,1,0]⇒[1,0,0,0][1, 0, \textcolor{red}{1}, 0] \Rightarrow [1, 0, \textcolor{blue}{0}, 0]
GAの強み・弱み⚖️
強み ✅ | 弱み ❌ |
---|---|
局所解に陥りにくい(グローバル探索) | 収束に時間がかかる場合あり |
数式不要、ブラックボックスでも使える | パラメータ調整が難しいことも |
並列処理しやすい | 厳密な最適解が保証されない |
実例:旅行セールスマン問題(TSP)
「最短で全都市を巡る順番は?」
この組合せ最適化問題も、GAで解くことができます。
-
各個体:都市の並び順
-
適応度:移動距離の逆数
-
交叉:順番の一部を親からコピー
-
突然変異:都市の位置を入れ替える
実際にGAでTSPを解くと、短時間でかなり良い解が得られます⏱️✨
Pythonで簡単なGA(ライブラリなし)
import random
def fitness(x):
return -abs(42 - x) # 42に近づける問題
population = [random.randint(0, 100) for _ in range(10)]
for generation in range(50):
population.sort(key=fitness, reverse=True)
next_gen = population[:2] # エリート選択
while len(next_gen) < 10:
parents = random.sample(population[:5], 2)
child = (parents[0] + parents[1]) // 2
if random.random() < 0.1:
child += random.randint(-5, 5)
next_gen.append(child)
population = next_gen
print("Best solution:", population[0])
まとめ📝
-
遺伝的アルゴリズムは「進化の仕組み」を応用した最適化手法
-
選択・交叉・突然変異を使って解を洗練していく
-
数式不要で直感的に使える!
-
複雑な組合せ問題や探索問題に強い
「迷路の自動生成」「機械のレイアウト最適化」「AIキャラクターの行動進化」など、創造的な応用も広がっています🌟
GAの具体的な実装チュートリアルや、Pythonライブラリ(DEAP、PyGADなど)の紹介記事もご希望があればお届けします📘お気軽にリクエストしてください!