これまでの処理だけでも、プログラムを実行すると、世代を重ねるごとにネコはりんごに近づいていけるでしょう。
しかし、たまたまある世代のネコのほとんどがりんごがある方向とは別の方向に進んでしまって、次の世代に正しくない方向に進んでしまった遺伝子の情報ばかりを引き継いでしまう、ということが起こってしまって、ネコの進化が止まってしまいます。
こうした状況を防ぐためにも、自然界で起こっている「突然変異」の考え方を取り入れます。自分以外のネコが皆決まったある方向に進んでいるのに、まったく違う方向に進む変わり者のネコをわざと作るのです。そうしてたまたま新たな方向に進んでチャレンジしたネコが成功すれば、そのネコの遺伝子が次世代に引き継がれます。
突然変異は、前回解説した「次世代の遺伝子を作る」処理の中で、父親の遺伝子と母親の遺伝子を交叉させてこどもの遺伝子を作った直後に発生します。
「突然変異」のブロックの中身は以下の通りです。
ここでは「次世代の遺伝子のリスト」に入っている遺伝子をもう一度取り出し、その遺伝子の文字列を一文字ずつたどりながら、「突然変異が起こる確率(%)」に設定した確率(ここでは3%)でランダムな遺伝子に入れ替えてしまっています。
外側のループで、変数 i を1から「ネコの数」まで変化させて、「次世代の遺伝子のリスト」の i 番目の遺伝子を操作しています。
内側のループでは、変数 j を用意し、変数「遺伝子」を空にした上で、j を 1 から「遺伝子の長さ」まで変化させて、i 番目の遺伝子の文字列の 1 文字目から「遺伝子の長さ」つまり文字列の最後までを操作します。
「1から100までの乱数」を発生させて、それが「突然変異が起こる確率(%) + 1」よりも小さければ、突然変異を発生させています。
突然変異が発生する場合は、「1から4までの乱数」をランダムな「遺伝子タイプ」として、1から4までに対応したU、D、R、Lに入れ替えています。
突然変異が発生しない場合は、「次世代の遺伝子の i 番目の j 番目の文字」がそのまま「遺伝子」にセットされています。つまりこの場合は何も変わってはいません。
最後に、こうして突然変異の操作をおこなった「遺伝子」を「次世代の遺伝子のリスト」の i 番目と置き換えて、リストに戻しています。
以上が「突然変異」の解説でした。


