# 遺伝的アルゴリズム ## [事前クイズ](https://ff-quizzes.netlify.app/en/ai/quiz/41) **遺伝的アルゴリズム** (GA) は、AIにおける**進化的アプローチ**に基づいており、集団の進化の方法を利用して、特定の問題に対する最適解を得る手法です。1975年に[ジョン・ヘンリー・ホランド](https://wikipedia.org/wiki/John_Henry_Holland)によって提案されました。 遺伝的アルゴリズムは以下のアイデアに基づいています: * 問題の有効な解を**遺伝子**として表現できる * **交叉**によって2つの解を組み合わせ、新しい有効な解を得ることができる * **選択**を使用して、ある**適応度関数**を基により最適な解を選ぶ * **突然変異**を導入して最適化を不安定化させ、局所的な最小値から抜け出す 遺伝的アルゴリズムを実装するには以下が必要です: * 問題の解を**遺伝子** g∈Γ を使ってコード化する方法を見つける * 遺伝子の集合 Γ 上で**適応度関数** fit: Γ→**R** を定義する。関数値が小さいほど良い解を意味する。 * 2つの遺伝子を組み合わせて新しい有効な解を得る**交叉**メカニズム crossover: Γ2→Γ を定義する。 * **突然変異**メカニズム mutate: Γ→Γ を定義する。 多くの場合、交叉と突然変異は遺伝子を数値列やビットベクトルとして操作する単純なアルゴリズムです。 遺伝的アルゴリズムの具体的な実装はケースによって異なりますが、全体的な構造は以下の通りです: 1. 初期集団 G⊂Γ を選択する 2. このステップで実行する操作(交叉または突然変異)をランダムに選択する 3. **交叉**: * ランダムに2つの遺伝子 g1, g2 ∈ G を選択する * 交叉を計算する g=crossover(g1,g2) * fit(g)1) または fit(g)2) の場合、対応する遺伝子を g に置き換える 4. **突然変異** - ランダムに遺伝子 g∈G を選択し、それを mutate(g) に置き換える 5. 適応度が十分に小さい値になるか、ステップ数の制限に達するまで、ステップ2から繰り返す ## 典型的な課題 遺伝的アルゴリズムで解決される典型的な課題には以下が含まれます: 1. スケジュールの最適化 1. 最適な梱包 1. 最適な切断 1. 全探索の高速化 ## ✍️ 演習: 遺伝的アルゴリズム 以下のノートブックで学習を続けてください: [このノートブック](Genetic.ipynb)で遺伝的アルゴリズムを使用した2つの例を確認できます: 1. 宝物の公平な分配 1. 8クイーン問題 ## 結論 遺伝的アルゴリズムは、物流や探索問題を含む多くの問題を解決するために使用されます。この分野は心理学とコンピュータサイエンスのトピックを融合させた研究に触発されています。 ## 🚀 チャレンジ 「遺伝的アルゴリズムは実装が簡単だが、その挙動を理解するのは難しい。」[出典](https://wikipedia.org/wiki/Genetic_algorithm) 遺伝的アルゴリズムの実装例(例えば、数独パズルの解決)を調査し、それがどのように機能するかをスケッチやフローチャートで説明してください。 ## [事後クイズ](https://ff-quizzes.netlify.app/en/ai/quiz/42) ## 復習と自己学習 [この素晴らしい動画](https://www.youtube.com/watch?v=qv6UVOQ0F44)を視聴して、遺伝的アルゴリズムで訓練されたニューラルネットワークを使ってコンピュータがスーパーマリオをプレイする方法について学びましょう。このようなゲームプレイ学習については[次のセクション](../22-DeepRL/README.md)でさらに学びます。 ## [課題: ディオファントス方程式](Diophantine.ipynb) あなたの目標は、整数解を持つ**ディオファントス方程式**を解くことです。例えば、a+2b+3c+4d=30 という方程式を考えてみてください。この方程式を満たす整数解を見つける必要があります。 *この課題は[この投稿](https://habr.com/post/128704/)に触発されています。* ヒント: 1. 解を [0;30] の範囲で考えることができます 1. 遺伝子として、解の値のリストを使用することを検討してください [Diophantine.ipynb](Diophantine.ipynb) を出発点として使用してください。 ---