喰うか?食われるか?: (遺伝的アルゴリズムを用いた)行動パターン進化  〜JAVA プログラム

(Up)


<原理>


 最適化の一つの方法として、遺伝的アルゴリズムがあります。 この方法は、複数の個体に最適化課題に対応した遺伝子を組み込み、個体間で競争させて課題に適した個体ほど子孫を多く残こさせることにより、次第に最適解へ近づこうというものです。
 この方法では、次世代に子孫(遺伝子)を残す時に、一定の割合で遺伝子に突然変異をおこさせ、さらに、個体間で遺伝子の交換(交配)をおこなうことにより、単なるランダムサーチ以上の効果を上げることができます。
 また、遺伝的アルゴリズムを利用すると 課題の評価式を明示的に数式化できなくても適合する解を見つけることができます。(ただし、完全な最適解ではなく、ある程度適した解)

 さて、本シミュレーションでは、デモとしての面白さから、バーチャル空間上(水中)に生息する簡単な「虫」の行動パターンを進化させてみました。
 自然界の様々な生き物は、実に 自然界に適合している様に見えます。 それは、形状や機能のみならず、生物の行動パターンにも見られます。  たとえは、ファーブル昆虫記に見られるように、 蜂などは、巧みに獲物を捕らえたり、巣を作ったりします。 これは、誰からも教えられたのではなく、先天的に組み込まれたものです。

 本シミュレーションは、 「虫」の”形状”として、体の太さ・口の大きさ等を進化させ、「虫」の”行動”としては、体内に組み込まれたニューラルネットワークの各ニューロン間の結合係数を進化させて、  如何なる形状を持つ「虫」が、どの様な行動を取れば、生存競争に打ち勝つかをシミュレートしてみました。

 図1に、本シミュレーション空間内に生息する「虫」の体構造と、その「虫」が持つ遺伝子構造を示します。


  

                 図1 「虫」の体の構造と 「虫」が持つ遺伝子の構造



 「虫」は、感覚器として、前方に2つの視覚センサー(目)及び、後方に1つの触覚センサー(尾)を持ちます。 運動は、体の両端にある運動効果器(鰭)を動かすことで推力を得ます。 運動空間は水中とし、水と「虫」の比重はほぼ1:1(静かにじっとしていても水面に浮かぶことも水中に沈降することも無い)とします。
 ニューラルネットワークは 感覚器と運動効果器へ結合したニューロンと、直接外部には接続していない(隠れ)ニューロンを持たせています。
 遺伝子は1本とし、目と目の間の距離等の体の形状を決定する遺伝子と、ニューラルネットワークのシナプス結合の強度を決定する遺伝子を、図1の右側に示すように一列に並べています。

 どの個体が生存競争に打ち勝つかを示す”評価関数”が、進化の方向を決定します。 本シミュレーションでは、評価値として、「個体」が摂取したエネルギー量を用い、それが多いもの程、子孫を残す確率が高くなるものとしました。
 
 虫が口を開けて進行すると、空間に均質に存在する僅かな有機物を摂取して 個体の持つエネルギーが自然に増加するものとします。  しかし、個体同士が接近すると、そこで喰う・喰われるの関係を発生します。 相手の背後から高速で接近した個体は、相手から一定のエネルギーを奪い、相手と正面から衝突する場合には、口の大きいものが相手からエネルギーを奪うことができるとします。(図2参照)
 


       

                       図2 「虫」の個体間の競争

 「個体」は、一定量以上のエネルギーを貯えると「成熟」したものとし、自分の遺伝子を子供に与え、自分は死滅します。 他に成熟個体が存在すれば、そこで交配が発生し、遺伝子の一部分を入れ替えます。


 バーチャル空間(水中)に生息する「虫」に働く力学的な「力」として、図3に示すように、水の抵抗力と、運動効果器の推進力を考えます。 「虫」は運動効果器に接続したニューロンの発火強度に比例した量だけ、自分の持つエネルギーを推進力に変換します。(運動ニューロンが強く発火するほど鰭を強く動かし高い推力を得る)  一方、水の抵抗力は、運動速度の2乗に比例して大きくなるものとします。 左右の推進力に違いがあれば、回転力(トルク)が生じ「虫」は向きを変えることができます。
 横に広い「虫」は、前進移動時に水の抵抗力を多く受けて速度を出せず、スリムな「虫」と同じ速力を出そうと思えば、それだけ、多くの推力が必要で、貯えたエネルギーを多く消費します。 しかし、広い「虫」は、運動効果器の間隔が重心より離れている為に回転トルクが大きく素早く向きを変えることができます。

          
            図3 「虫」の運動に影響を与える力


<シミュレーション>


 「虫」が生息する空間は、 680×400ドットのトーラス空間(ドーナツ空間)を想定しています。
 他の「虫」を捕食した「虫」は、口が白く光ります。 エネルギーを十分に貯えた個体(成熟した個体)は、体の下半身が光ります。
 複数の成熟した「虫」が存在すれば、両者の間で、交配が発生し、遺伝子の交叉が発生します。 成熟した「虫」が1個体しか存在しない時には、自家受精して、遺伝子の交叉は発生しません。
 本シミュレーションでは、「虫」が生存できる最大数は有限とし、新たに生まれた個体の占める位置は、既に死んだ個体(黒色)上か、子孫を残して死亡した親の何れかの位置とします。
 
 遺伝的アルゴリズムを用いて計算する場合、「世代が一斉に交代する方法」と、「世代の一部が交代する方法」がありますが、本シミュレーションでは、世代の一部が交代する方法を用いているため、親子が共存します。
  
注意: 1個の個体が無限に存在する事を防ぐ為、個体のエネルギーが一定以下になった場合、及び、発生から一定時間以上経過した個体は、強制的に死亡させています。

 さて、シミュレーションを繰り返し行ったところ、約100世代経過したところで、系は3つのパターンが現れる場合があるようです。

 すなわち、

 パターン1: 猪突猛進タイプ
         ひたすら高速で前進する個体で世界が占められる場合。
                   虫の形状はスリム型が多い。

 パターン2: ストーカータイプ
         背後から付け回し、相手のエネルギーを分捕る個体で世界が占められる場合。
                  虫の形状は縦横とも均整がとれている。

 パターン3: ドッグファイトタイプ
         相手が、背後にくると、それを回避し、且つ、お互いに相手の背後に回り込もうとする個体で世界が占められる場合。
                    虫の形状は縦横とも均整がとれている。

 (パターン2が生じる場合が非常に多いです)
 
 水の抵抗や個体の最大数等(評価関数)を変更すれば、行動パターンも異なった方向へ進化して行くと考えられます。

  
<計算結果例>

     進化前(初期)
  動画

                        
     約110世代後
  動画


 

<参考文献> 

1) 星野 力 著     進化論は計算しないとわからない        (1998)共立出版
2) L.デービス著     遺伝子アルゴリズムハンドブック          (1994)森北出版
3) 北野 宏明著     遺伝的アルゴリズム1,2              (H7)産業図書
4) 安居院 猛著     ジェネッテックアルゴリズム             (1994)昭晃堂
5) 星田 昌紀著     遺伝子情報処理への挑戦             (1994)共立出版
6) 米澤 保雄著     遺伝的アルゴリズム                 (1993)森北出版
7) 和田 健之助著     デジタル生命の進化                 (1994)岩波書店
8) 北野 宏明著      進化するコンピューター              (1993)ジャストシステム
9) Richard Fifield  遺伝子と脳                     (H8)丸善
10)松本 元著      神経細胞が行う情報処理とそのメカニズム  (1991)倍風館
11)中野 肇著      ニューロコンピューター              (H1)技術評論社
12)中野 肇著      ニューロコンピューターの基礎          (1990)コロナ社
13)合原 一幸著   ニューラルコンピューター             (S53)東京電気大学出版局
14)松葉 育雄著   ニューラルシステムにおける情報処理      (1993)昭晃堂
15)船橋 誠壽著   ニューロコンピューティング入門        (H4)オーム社

キーワード: 遺伝的アルゴリズム、Javaプログラム、シミュレーション、行動進化、人工生命


(JAVAプログラム実行へ)                                 (Topへ)

 Javaソースプログラムは、上記(Javaプログラム実行へ)の頁からダウンロードできます(ウイルスチェック済み)。

 補足
 
 制作した別の人工生命プログラム
   (人工生命進化シミュレーション実験:C++ソースプログラム付き)

初版:2013/06/12 |





蛇島伸吾