「自然淘汰」が終わったら次に「次世代の遺伝子を作る」処理をおこないます。
「次世代の遺伝子を作る」ブロックの中身は以下の通りです。
まず、「『次世代の遺伝子のリスト』のすべてを削除する」で「次世代の遺伝子のリスト」を空にしています。
次に「ネコの数」分だけこどもの遺伝子をつくり、「次世代の遺伝子のリスト」に追加していきます。こどもの遺伝子を作る処理は、「父親の遺伝子」と「母親の遺伝子」を引数にした「『父親の遺伝子』と『母親の遺伝子』を交叉させる」ブロックの中でおこなっています。父親の遺伝子と母親の遺伝子は、それぞれ「交配プール」のリストの中から、「1から『交配プールの長さ』までの乱数」番目を選び出すことで、ランダムにピックアップしています。
この場合、交配プールから一度以上何度かピックアップされる遺伝子が出てきたり、1度目は父親として選ばれたのに、2度目には母親として選ばれたりと、現実の世界で考えると少しおかしなことが発生するのですが、遺伝的アルゴリズムはあくまでも生物を模してはいるが、厳密に模倣する必要まではないので、ここではよしとしています。
「『父親の遺伝子』と『母親の遺伝子』を交叉させる」ブロックの中身を見ていきましょう。
「こどもの遺伝子」は「父親の遺伝子」と「母親の遺伝子」を交叉させて作ります。交叉の方法にも、いくつか方法があるのですが、ここでは交叉するポイントを2箇所決めて、真ん中の部分を入れ替えるという「二点交叉」(*1)という方法をとっています。
2箇所の交叉するポイントを決めて、それぞれ「交叉の開始場所」と「交叉の終了場所」の変数に入れています。最初の交叉ポイントは「1から『遺伝子の長さ / 2』までの乱数」によって、遺伝子の真ん中より以前の前半部分にランダムに決めています。2つ目の交叉ポイントは、「『交叉の開始場所』から『遺伝子の長さ』までの乱数」で、最初の交叉ポイント以降、遺伝子の最後までのどこかに決めています。
2つの交叉ポイントが決まったら、「こどもの遺伝子」を空にして、変数 i を1から「遺伝子の長さ」まで変化させながら、「二点交叉」の通りに「こどもの遺伝子」をつくっていきます。
変数 i が「交叉の開始場所」よりも小さければ、つまり交叉開始場所に到達するまでは、「こどもの遺伝子」は「父親の遺伝子」の並び通りに作ります。「こどもの遺伝子」にそれまでの「こどもの遺伝子」に「『父親の遺伝子』の i 番目の文字」をつなげている部分です。
次に「交叉の開始場所」以降で「交叉の終了場所」に到達するまでは、「母親の遺伝子」をつなげています。そして「交叉の終了場所」を過ぎたら、再び「父親の遺伝子」をつなげています。こうすることで、2つの交叉ポイントにはさまれた部分が「母親の遺伝子」、それ以外の部分は「父親の遺伝子」という「こどもの遺伝子」ができあがります。
こうして1つの「こども遺伝子」ができあがったら、「次世代の遺伝子のリスト」に追加します。
このあと、次章で解説する「突然変異」が起こります。
「突然変異」が起こったあと、変数 i を 1 から「ネコの数」まで変えながら、「『遺伝子のリスト』の i 番目を『次世代の遺伝子のリスト』の i 番目で置き換える」ことによって、「遺伝子のリスト」に入っている遺伝子を次世代の遺伝子に入れ替えています。
これで一通り1世代あたりの処理は完了しました。最後に「世代を 1 ずつ変える」ことで、世代に入っている値を 1 増やします。





