遺伝的アルゴリズムは、「適者の生存」、染色体交差、突然変異などの自然な進化プロセスをシミュレートすることにより、問題の最良の解決策を求めるプログラムです。この記事では、遺伝的アルゴリズムの執筆方法を簡単に紹介し、独自のアルゴリズムを作成する際に考慮する必要があるいくつかの重要な要因について説明し、遺伝的アルゴリズムの実用的なアプリケーションの例をいくつか提供します。
キーポイント
不明な情報の亀裂
時間は2369年で、人間は星の海に広がっています。あなたは、忙しい深い星の基地に駐留している若くて知的な医師であり、星間旅行者、商人、時折の無法者と賑わっています。あなたが到着して間もなく、基地の店主があなたに興味を持ちました。彼は自分が単なる仕立て屋であると主張しているが、噂によると、彼は特に邪悪な体制のために働いている秘密のエージェントだと言っている。
あなたは毎週一緒に昼食を取り始め、政治から詩までのトピックについて話し合います。数ヶ月後でも、彼がロマンチックな感情を表現しているのか、それとも秘密を奪っているのかはまだわかりません(確かに秘密はありません)。多分両方。
あなたは医療小屋のオフィスに戻りましたが、彼が今言ったことについてまだ考えていました。突然、以前に近くのコンピューターで実行した遺伝子シーケンスシミュレーション実験により、アイデアが得られました。あなたはパスワード復号化の専門家ではありませんが、遺伝学の専門知識を使用して彼の情報を解読できるかもしれません! いくつかの理論最初に述べたように、遺伝的アルゴリズムは、進化を駆動してソリューションを検索する操作を使用するプログラムです。多くの反復後、アルゴリズムは、可能な一連のソリューションから最高の候補(推測)を選択し、それらを再結合し、どの組み合わせがソリューションに近づくかをチェックします。貧しい候補者は廃棄されます。 上記のシーンでは、秘密のメッセージのキャラクターはA-Z、スペース、または基本的な句読点です。これが次の32文字「アルファベット」を与えるとします:abcdefghijklmnopqrstuvwxyz - 。、!?それらは正しいです。それぞれの可能性を確認するには時間がかかりすぎます。代わりに、遺伝的アルゴリズムは12文字をランダムに選択し、テーラー/スパイに彼の情報の結果がどれだけ近いかを評価するように依頼します。これは、スコアが将来の候補者を微調整できるため、ブルートフォース検索よりも効果的です。フィードバックにより、各推測のフィットネスを測定し、できれば行き止まりで時間を無駄にしないようにすることができます。
3つの推測を行ったとします:homlk?wsrzdj、bgk ka!qtpxc、xelpocv.xlf!。最初の候補者は248.2、2番目は632.5、3番目は219.5でした。スコアの計算方法は状況によって異なりますが、これについては後で説明しますが、候補者とターゲット情報の偏差に基づいていると仮定しましょう。完全なスコアは0です(つまり、偏差なし、候補とターゲットは同じ)、より高いスコアは偏差が大きくなることを意味します。 248.2と219.5のスコアを持つ推測は、635.5のスコアを持つ推測よりも秘密情報の内容に近い。
将来の推測は、最高の試みの組み合わせによって行われます。候補者を結合するには多くの方法がありますが、今では単純なクロスオーバーアプローチを検討しています。新しい推測の各キャラクターは、最初または2番目の親候補から50〜50の確率をコピーしています。 homlk?wsrzdjとxelpocv.xlf!の2つの推測を取ると、子孫の最初の文字はHの確率が50%、xの50%の確率があり、2番目の文字はoまたはeです。すぐ。子孫はこんにちは?W.rld! ただし、親候補の値のみを使用する場合、複数の反復に問題があるかもしれません:多様性の欠如。 1つの候補者がすべてのAで構成され、もう1つの候補がすべてのBで構成されている場合、クロスオーバーによって生成された子孫はAとBでのみ構成されます。ソリューションにCが含まれている場合、私たちは残念です。 いくつかのコードを見せてください! 高度な概要と用語リストを考えると、今すぐコードを見たいと思うかもしれません。それでは、秘密の情報問題を解決するJavaScriptコードを見てみましょう。読書プロセス中に、どの方法が「voilerplateコード」と見なされる可能性があるか、どの方法が解決しようとしている問題により密接に関連しているかを考えるように勧めます。
コンストラクターは、シミュレーションに必要なさまざまなパラメーターを解くオブジェクトを使用します。これは、シミュレーションが実行される制約を定義する遺伝的アルファベット、ターゲットメッセージ、およびその他のパラメーターを指定する方法を提供します。上記の例では、世代ごとに100人の候補者が100人の人口を期待しています。これから、繁殖のために選択されるのは40個の染色体のみです。突然変異を導入する可能性は3%あり、それが発生した場合、2つの遺伝子に変化します。最大値は、100万世代後に解決策に収束しない場合、とにかくスクリプトを終了します。 アルゴリズムを実行するときに提供される年齢の人口、選択サイズ、最大数が非常に少ないことに言及する価値があります。より複雑な問題には、より大きな検索スペースが必要になる場合があり、これにより、アルゴリズムのメモリ使用量と実行にかかる時間が増加する場合があります。ただし、小さなバリアントパラメーターを使用することを強くお勧めします。彼らが大きくなりすぎると、フィットネスに基づいて繁殖候補者の利点が失われ、シミュレーションがランダムに検索され始めます。 randomint()、init()、run()などのメソッドは、ボイラープレートと見なされる場合があります。しかし、ボイラープレートがあるからといって、シミュレーションに実際的な影響を与えないという意味ではありません。たとえば、遺伝的アルゴリズムはランダム性を大きく使用します。組み込みのMath.random()関数は当社の目的に適していますが、他の問題については、より正確なランダムジェネレーターが必要です。 crypto.getRandomValues()は、より強力な暗号化ランダム値を提供します。 パフォーマンスも考慮されます。この記事では明確で理解しやすいように努めていますが、操作が繰り返されることを忘れないでください。ループ内のコードをマイクロ最適化し、より効率的なメモリデータ構造を使用し、コードを機能/メソッドに分離する代わりに、実装言語に関係なく、コードをインライン化する必要がある場合があります。 calcfitness()、select()、reprod()、さらにはstop()メソッドの実装は、解決しようとしている問題に固有のものです。 calcfitness()特定の予想された基準に基づいて染色体のフィットネスを測定する値を返します。私たちの場合、それは秘密のメッセージとどれだけうまく一致しますか。フィットネスの計算は、ほとんどの場合、状況固有です。たとえば、2つの値間のハミング距離またはレビンシュタイン距離を計算し、複数の測定値を組み合わせることさえできます。最終的に、Fitness関数は、Booleanの「Fit」/「Not Fit」だけでなく、手元の問題に基づいて有用な測定値を返すことが重要です。 select()メソッドは、エリート選択戦略を示しています。繁殖に最適な候補者のみが選択されています。前述したように、人口の個々の候補者のセットから最も適切な候補者を選択するトーナメントの選択や、候補者のプレッシャーの選択にますます大規模で大規模な候補者を課すボルツマン選択など、他の戦略があります。これらの異なる方法の目的は、染色体がすぐに明らかにならない場合でも、後で有益であることが証明される可能性のある遺伝子を提供する機会を確保することです。これらおよびその他の選択戦略の詳細な説明、および実装の例は、オンラインで簡単に見つけることができます。 k-point交差戦略の説明
遺伝的アルゴリズムは、エンターテイメントと収益性の両方に使用できます。おそらく、遺伝的アルゴリズムの実用的な応用の最も一般的な2つの例は、BoxCar 2DとNASAによって進化したXバンドアンテナです。 BoxCar 2Dは、遺伝的アルゴリズムを使用して、シミュレートされた地形を通過できる最高の「車」を進化させるシミュレーションです。車は8つのランダムベクターで構成され、車輪をランダムポイントに接続します。プロジェクトのWebサイトは、BoxCar2D.comで見つけることができます。これは、Aboutページにアルゴリズムを簡単に紹介し、最高のデザインのいくつかを示すランキングリストを提供します。残念ながら、このサイトはフラッシュを使用しており、多くの人にアクセスできないようになりました。この場合、興味がある場合はYouTubeでさまざまな画面録音を見つけることができます。また、rednuht.org/genetic_cars_2にあるHTML5テクノロジーを使用して、Rafael Matsunagaによって書かれた同様の(優れた)シミュレーションをチェックアウトすることもできます。
遺伝的アルゴリズムに関するよくある質問
// ... (Candidate class and GeneticAlgorithm class code as provided in the original text) ...
さまざまな選択戦略を説明する
2つの親染色体に限定されない。ランダムポリゴンを描画して画像を進化させるアルゴリズムを検討してください。この場合、染色体は画像データとして実装されています。各世代で、最も適切な画像が親として母集団から選択され、すべての子供候補者は、自分のポリゴンを親コピーに描くことによって生成されます。親染色体/画像は、親のユニークなバリエーション/図面です。
第一世代と第9世代に最適なレイアウトである写真は、最適化されたウェブサイトのデザインの論文
染色体としての問題をどのように表現できますか?私の有効な対立遺伝子は何ですか?
私はまた、プログラムが自然からインスピレーションを引き出す方法を理解するのを手伝ってくれることを願っています。フォーラムで自分の考えを自由に共有してください。
以上が遺伝的アルゴリズムの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。