これまで、1世代のネコ100匹を遺伝子の指定どおりに動かし、それぞれのりんごからの距離を求め、平均距離も求めました。
いよいよこれから、生物の進化を模した遺伝的アルゴリズムらしい処理をおこなっていきます。
まずは「自然淘汰」です。
「自然淘汰」ブロックの中身は以下の通りです。
次の世代の遺伝子を作るときに、その父親と母親の候補となる遺伝子を入れておくための「交配プール」というリストを用意しています。その中身をまずすべて削除して空にしています。
次に変数 i を1からネコの数の100まで変えていきながら、「距離のリスト」から各ネコのりんごからの距離を取り出し「平均距離」と比較します。
ここで自然淘汰のルールを説明します。遺伝的アルゴリズムでの「自然淘汰」には、様々な方法があります。たとえばすぐに思いつきそうなのが、優秀な遺伝子、つまりりんごに近かったネコだけの遺伝子を残す方法で、これは「エリート主義」と呼ばれています。
成績の悪かったネコにもチャンスがある、りんごからの距離に応じて選ばれる確率が変わるルーレット(りんごからの距離が近かったネコは面積が大きい)を用意し、それを回して決める「ルーレット選択」という方法もあります。今回はこれに近い方法で「自然淘汰」をおこなうようにします。
Scratchのスクリプトの「『ネコの数』回繰り返す」の中を見てみましょう。りんごからの距離が平均距離よりも近かったネコは無条件に選出され、「交配プール」のリストに追加されます。平均距離よりも遠かったネコの場合は、「1から2までの乱数」が1だったときだけ「交配プール」のリストに追加されます。つまりこの場合は確率1/2で選出されるのです。
平均距離よりも遠かったネコと近かったネコがもしちょうど半数ずつだとすると、近かったネコが遠かったネコよりも2倍あたりやすい以下のようなルーレットを回すようなイメージになります。
こうして全部のネコの遺伝子に対して、「交配プール」のリストに追加するかどうかを決め終わると、「自然淘汰」のプロセスは終了します。
次は選出した遺伝子が入っている「交配プール」から父親と母親の遺伝子を選びだし、交配して新しい遺伝子を作ります。


