7. 父親と母親の遺伝子から次世代の遺伝子をつくる

← 目次に戻る

< 6. 自然淘汰 8. 突然変異を起こす >

「自然淘汰」が終わったら次に「次世代の遺伝子を作る」処理をおこないます。

figure 36

「次世代の遺伝子を作る」ブロックの中身は以下の通りです。

figure 38

まず、「『次世代の遺伝子のリスト』のすべてを削除する」で「次世代の遺伝子のリスト」を空にしています。

次に「ネコの数」分だけこどもの遺伝子をつくり、「次世代の遺伝子のリスト」に追加していきます。こどもの遺伝子を作る処理は、「父親の遺伝子」と「母親の遺伝子」を引数にした「『父親の遺伝子』と『母親の遺伝子』を交叉させる」ブロックの中でおこなっています。父親の遺伝子と母親の遺伝子は、それぞれ「交配プール」のリストの中から、「1から『交配プールの長さ』までの乱数」番目を選び出すことで、ランダムにピックアップしています。

この場合、交配プールから一度以上何度かピックアップされる遺伝子が出てきたり、1度目は父親として選ばれたのに、2度目には母親として選ばれたりと、現実の世界で考えると少しおかしなことが発生するのですが、遺伝的アルゴリズムはあくまでも生物を模してはいるが、厳密に模倣する必要まではないので、ここではよしとしています。

「『父親の遺伝子』と『母親の遺伝子』を交叉させる」ブロックの中身を見ていきましょう。

figure 37

「こどもの遺伝子」は「父親の遺伝子」と「母親の遺伝子」を交叉させて作ります。交叉の方法にも、いくつか方法があるのですが、ここでは交叉するポイントを2箇所決めて、真ん中の部分を入れ替えるという「二点交叉」(*1)という方法をとっています。

figure 50

2箇所の交叉するポイントを決めて、それぞれ「交叉の開始場所」と「交叉の終了場所」の変数に入れています。最初の交叉ポイントは「1から『遺伝子の長さ / 2』までの乱数」によって、遺伝子の真ん中より以前の前半部分にランダムに決めています。2つ目の交叉ポイントは、「『交叉の開始場所』から『遺伝子の長さ』までの乱数」で、最初の交叉ポイント以降、遺伝子の最後までのどこかに決めています。

2つの交叉ポイントが決まったら、「こどもの遺伝子」を空にして、変数 i を1から「遺伝子の長さ」まで変化させながら、「二点交叉」の通りに「こどもの遺伝子」をつくっていきます。

変数 i が「交叉の開始場所」よりも小さければ、つまり交叉開始場所に到達するまでは、「こどもの遺伝子」は「父親の遺伝子」の並び通りに作ります。「こどもの遺伝子」にそれまでの「こどもの遺伝子」に「『父親の遺伝子』の i 番目の文字」をつなげている部分です。

次に「交叉の開始場所」以降で「交叉の終了場所」に到達するまでは、「母親の遺伝子」をつなげています。そして「交叉の終了場所」を過ぎたら、再び「父親の遺伝子」をつなげています。こうすることで、2つの交叉ポイントにはさまれた部分が「母親の遺伝子」、それ以外の部分は「父親の遺伝子」という「こどもの遺伝子」ができあがります。

こうして1つの「こども遺伝子」ができあがったら、「次世代の遺伝子のリスト」に追加します。

figure 39

このあと、次章で解説する「突然変異」が起こります。

「突然変異」が起こったあと、変数 i を 1 から「ネコの数」まで変えながら、「『遺伝子のリスト』の i 番目を『次世代の遺伝子のリスト』の i 番目で置き換える」ことによって、「遺伝子のリスト」に入っている遺伝子を次世代の遺伝子に入れ替えています。

これで一通り1世代あたりの処理は完了しました。最後に「世代を 1 ずつ変える」ことで、世代に入っている値を 1 増やします。

figure 41

*1 遺伝的アルゴリズム#二点交叉 - Wikipedia

< 6. 自然淘汰 8. 突然変異を起こす >

← 目次に戻る