魚の鬼ごっこ: 魚の群れ行動(群知能)発生    捕食者/被捕食者あり  〜JAVA プログラム

(Up)


<原理>


  魚、鳥、動物、 自然界では、色々生物が群をつくります。
 なぜ、この様に群れて暮らす生物が多いのでしょうか? また、これらの群を統率する方法はどの様にして行っているのでしょうか?
 これらの疑問に答える一つの回答があります。 
 1.集団を統率するリーダーは存在しない。 
 2.集団を、構成する個体は、周りを見て、自らの対処のしかたを決定しているだけである。
 3.集団全体としての動作は、上記2により勝手に生じる。(創発という)

 多数の個体が群として行動するシミュレーションを、最初に、CGであらわしたのは、クレイグ・レイノルズの 鳥の行動シミュレーション:BOID (1987) が最初です。
 BOIDでは、 個体の行動パターンを下記の3つの規則をアルゴリズム化して、プログラムしてあります。

 規則:1 個々の鳥は、群の仲間との距離をある一定の大きさに維持することにより、ぶつかるのを避ける。
 規則:2 個々の鳥は、周りの鳥とスピードと方向を合わせる。
 規則:3 個々の鳥は、自分の周りの鳥のグループの中心に向かおうとする。

 本シミュレーションも基本的に同様の規則を用いています。
 図1に シミュレーション上の魚の3つの基本行動パターンを示します。
 魚の背後は死角であり、そこにいる他の魚を認識することは出来ません。 魚の認識範囲に複数の魚が存在する時には、近くに存在する魚からの影響を受け易いものとします。 自分の周りに一匹も魚が見えない時には、仲間を探して、ランダムに方向を変えます。

                  
                               図1 魚の基本行動規則 


 普通は、「魚の群れ」をシミュレーションするには、これだけの規則で十分かもしれませんが、本シミュレーションでは、少し工夫を凝らして、2種類の魚の間に喰う・喰われるの関係を入れてみました。 本シミュレーションでは、上記の魚を 別なハンター魚が狙っています。 この為、小さな魚は、図2に示すように ハンター魚から逃げるために、さらに一つの規則を追加します。すなわち、第4の規則として、

 規則:4 ハンターを認知したならば、ハンターの進行方向と直角方向に逃げる。 複数のハンターを認知したならば、近くに存在するハンターからの影響を多く受ける。


 一方で、ハンター魚には、餌魚に対する捕食の為の行動パターンとして、下記行動パターンを追加します。(図2参照)

 規則:5 餌魚を発見したならば、その方向へ直進する。
 規則:6 同じ方向に複数の餌魚を発見したならば、最も近い魚をターゲットに選択する。
 規則:7 現在位置から等距離に複数の餌魚を発見したならば、現在の進行方向へ最も近い魚をターゲットに選択する。

         
           図2 異種類の魚が存在するときの行動規則  

             
<シミュレーション>


  空間は、無限に広がった空間を想定しています。 画面上では、都合上 680×400ドットの空間に、全ての魚を表示し、右端へ隠れた魚は、左端から出てきますが、この時の魚は同一空間ではない事に注意して下さい。 また、餌魚が食い尽くされて、シミュレーションがすぐに終了しない様にするため、魚の数は不変で、食われても死なないで、すぐに、現実に復帰するものとしています。

 さて、シミュレーションを開始すると、小さな魚は、群を形成し始めます。 一方、ハンター魚は、魚群を発見し、突っ込んできます。 魚群は、ハンターの攻撃をかわすものの、バラバラにはならずに、群の形は保ったままです。 群に留まるかぎり、ハンターに食われる危険性は減少します。  群に突っ込んだハンター魚は、多くの魚に幻惑されてなかなかターゲットを絞る事が出来ないようにみえます。 しかし、希に、群から離れた個体が発生すると、それが格好の餌食となる傾向にあります。 
 現実世界でも、弱い生物が群をなすのは 本シミュレーションのように 敵の攻撃をかわすのに都合がよいためだと思われます。 
 一方、ハンター側からいえば、多数で攻撃すると、逃げる側の方向を定めにくくし、全体としての捕食率を上げることができるのでしょう。

 実際に、魚の数を変えて シミュレーションを行なってみると それが良く解ります。
 魚の数を変化させた時の、捕食率のシミュレーション結果を表1に示します。

      表1  魚の数と捕食率の関係(シミュレーション結果)
    小魚(匹)    ハンター魚(匹)  捕食率(一匹当たり
1000計算時間の捕食回数)
         1          1  3〜6回
        10          1  0〜2回(但し、離れた個体がいない時)
         1          3  5〜7回

 1対1では、1000計算時間中に3〜6回の捕食が発生しますが、餌魚が10匹で集団を成すと、捕食回数は0〜2回に減少しています。 一方、1匹の餌魚を ハンター魚が集団で追いかけると、捕食する回数は、5〜7回に増加します。 つまり、食う側も食われる側も、「単独で行動するよりも、集団で行動した方が有利である」ことがわかります。これも一つの群知能といえます。

  シミュレーション頁の下側で 小魚の数とハンター魚の数を「1匹対1匹」、「16匹対1匹」、「16匹対3匹」、「16匹対10匹」、「222匹対6匹」に切り替えることができます。

 
 シミュレーション例(動画付き)
             

 <参考文献> 

1.服部 桂著            人工生命の世界              オーム社
2.Ellen Thro著        _  人工生命                  カットシステム
3.佐倉 統著            動き始めた人工生命           同文書院
4.科学シミュレーション研究会  複雑系・カオス・量子           講談社
5.吉永 良正            複雑系とは何か              講談社
6.日本情報処理開発協会    人工生命の方法               工業調査会
7.スティーブン・レビー著     人工生命                    朝日新聞社
8.佐倉 統                     フランケンシュタインの末裔たち       日本経済新聞社
9.ルーディ・ラッカー著         人工生命研究室                ASCII

キーワード: 魚の群れ、Javaプログラム、シミュレーション、創発、複雑系、人工生命


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

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

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

初版:2013/06/12 |



蛇島伸吾