全1638文字
PR

コンピューターの得意分野の1つがシミュレーションだ。自分でプログラムを書けば、架空生物の生命すらシミュレートできる。本特集ではプログラミング言語「Python」を使って人工生命を作る方法を解説する。

【有性生殖】

 今度は、「性」を導入します。同じ種の人工生命で、かつ、異なる「性」の個体と接触した場合に「生殖」を行うシミュレーションです。「生殖」にはリスクもあるという意味で、「生殖」に成功した「親」はダメージを受けるようにしました。自分のライフを「子」に分け与えて繁殖するイメージです。

 性別は3種類と定義しました。「性」は、個体の形で視覚的にわかるようにしました。三角形、四角形、五角形で表現しています。人工生命の種別はこれまで同様、赤と緑で表現しています。

 それらの条件を実装したのが、リスト10です。

リスト10●【有性生殖】のコード
リスト10●【有性生殖】のコード
[画像のクリックで拡大表示]

 RandomWalkerAWithSexという新たなクラスを、RandomWalkerAの拡張として作りました。RandomWalkerBWithSexも同様です。拡張部分は、オブジェクトの生成時にsexプロパティを0、1、2のいずれかの整数から選んだ乱数で初期化することと、これを用いた描画のサポートです。描画部分は、drawWithSexという別関数を作り、これでdrawメソッドを置き換える方法で定義しています。

 そして、「e.sex != o.sex and e.isReproductive() and o.isReproductive()」という判定部分で、「生殖」を制御します。「性」が異なり、かつ両者ともが「生殖期」にあることが条件です。前述したように、「生殖期」にあるかどうかはisReproductiveで判定します。

 さらに、衝突した両者のうちどちらか一方を「子」のひな形とします。どちらを選ぶかは、乱数で決めます。「be = random.sample([e, o], 1)[0]」の部分です。すでに場に存在する個体の数が多すぎないかという条件、「子」の性別における「生殖率」と乱数の比較(コードでは「1 - be.reproductionRate < random.random()」の箇所)を経て、「子」が誕生します。無性生殖の場合と同様に、copyを行い、reset、そして繁殖のもとになった2体のlifeを減らします。