Sunday, June 28, 2015

群れの行動に関する統一理論は可能か

タマス・ヴィチェックの説。
「観察される現象は多種多彩だが、それを生み出すのは単純ないくつかの基本的自然法則(例えば熱力学の法則のような)かもしれない」
» 「群れ」の科学 Page6 « WIRED.jp

 スティーヴン・ウルフラムの説。
「 群れに見られる創発特性は、雪片や貝殻や脳や、さらには宇宙そのものの複雑さをつくっているものと同一の、単純なプログラムに基づいている」
» 「群れ」の科学 Page6 « WIRED.jp

イアン・カズンの説。
「株価も神経システムも魚の群れも説明できる隠された理論があるかは疑わしいと思っています。それはどちらかというと無邪気な考えというものです。何もかもに当てはまる方程式があると考えるのは危険です」
» 「群れ」の科学 Page7 « WIRED.jp

統一的な説明は可能だとするほうにロマンを感じるが、ロマンチックなものが真理というわけではないし…。

Monday, June 22, 2015

模倣による障害物の回避行動

鳥か魚の群れが空中か水中を飛んでいるまたは泳いでいるとする。
障害物があれば彼らはそれを避けて移動する。
次のアニメはそれを簡単ににシミュレートしたもので、群れが障害物を回避する様子を示している。



ここで画面の中央に置いた円が障害物。
それぞれの鳥または魚の行動は、
1. 各個体はどれも同じ速さで移動する。
2. 移動する方向は、自分の近くにいる個体が向かっている方角の平均値とする。
3. 障害物に近づいた個体は円の接線方向に向きを変える。
というルールによっている。

これらのルールに従って移動する群れに何が起こるか。障害物にどう対応するか。
画面の右上から降りてくる大群の動きにその特色が顕著に現れている。
この群れがまっすぐ進めばほとんどの個体は障害物に突き当たり、それぞれに回避行動を取らなければならない。けれども実際に起きていることはそうではない。
群れの先頭にいる少数の個体は、障害物に近づいたことを知ってルール3により自ら進む方向を変える。これに対して、あとに続く多数の個体は障害物を察知して向きを変えるのではなく、ルール2によって周囲の個体の動きを真似ることで結果的に障害物を回避している。

群れのメンバーの大半は、障害物や危険物をそれと意識せずに避けている。他のメンバーの行動を真似るだけでそうしたことが可能になる。
はやい話が「烏合の衆」である。オンライン辞書を見ると、
「規律も統制もなく、ただ寄り集まっているだけの集団。秩序のない人々の集まりや軍勢にいう。からすの集まりが無秩序でばらばらであることから」
とある。ただ寄り集まって、たがいの動きを真似ているだけの群れが、「用心」や「判断」といったコストを払うことなく、といっても障害物に直面した個体は自発的な行動をとるのだが、全体としては少ないコストで行動を最適化している。

関連記事 » robottage: 鳥の群舞の簡単シミュレーション

Thursday, June 18, 2015

空中のハトと地上のハト

空中で群れているハトと地上で群れているハトの違い。
空中のハトは集団的で、地上のハトは個人的。

空を舞うハトの群れは協調的に見える。
群れは同じ方向を目指して飛ぶ。直線的ということではなく、ときには直線的に一方向を目指し、ときには渦を巻いて飛ぶ。全体として協調的で、見た目に美しい形状をなして飛翔する。
地上から舞い上がった瞬間も同様で、同じ方向を目指して舞い上がり、協調的な舞いを見せて、どこかへ集団で去って行ったり、いっせいに地上に舞いもどったりする。

地上で群れているハトは、「群れている」という点では集団的だが、個々には勝手に動いている。
少数の群れを見ているとそのことがかえってよくわかる。それぞれ勝手に動いていた個体どうしが、ときに並行して歩くことがある。しかしそれは協調性の現れというより、身体の接触を避けるためにたまたま並行して歩いたとしか見えない。2羽のハトがしばし寄り添うことがあっても、すぐに離れて別々の方向へ歩いてゆく。
空中にあるときのような協調性は地上では見られない。地上では群れがそろって一方向に進むとか、渦状をなすとかはない。

地上のハトの個人性は舞い上がった瞬間に崩れ、群れは集団的行動に移る。
この移行について「集団的意思」といったものを想定する必要はない。まず1羽が飛び上がり、他の個体がつぎつぎにこれを模倣する結果、全体の動きが集団的になると考えられる。これについては「模倣で生まれる群れの集合知」を参照。

Sunday, June 14, 2015

鳥の群舞の簡単シミュレーション

鳥の群れが空を舞う様子をシミュレートしてみた。
それぞれの鳥は、

1. すべて同じ速さで飛ぶ。
2. 飛ぶ方向は、近くにいる鳥の向かっている方角の平均値とする。

という単純な原則とし、さらにプログラムを簡単にするため、

3. 立体空間ではなく平面上のシミュレーションとする。
4. 鳥同士はいくら近づいてもよい。重なってもかまわない。

とした。

シミュレーション結果の例。


いちおう鳥の群舞らしく見える。
この動画はループしていて、画面全体に鳥の散らばっている状態が最初で、群れが右上に消えていくところが最後。画面から消えた鳥はまっすぐに遠ざかり、もどって来ることはない。
地上の草むら、風、天敵などアイテムの追加や、鳥の飛行区域の限定など宿題。すべての鳥の方向がそろってしまうのもおもしろくないので、個々の鳥の飛行方向にゆらぎを与えること等も。

プログラムは Processing で書いた。
コードは次のとおり。要検討事項は多いが、とりあえず動いてる。
int canvasW = 400, canvasH = 400;
int population = 500;
float neighborhoud = 50;
float speed = 1.5;
Bird[] birds = new Bird[population];

class Bird {
  float x, y, dir;
 
  Bird(float tempX, float tempY, float tempDir) {
    x = tempX;
    y = tempY;
    dir = tempDir;
  }
 
  void display() {
    arc(x, y, 20, 20, dir-PI-0.2, dir-PI+0.2);
  }
  
  float newDir() {
    float accumX = cos(dir), accumY = sin(dir);
    for (int i = 0; i < population; i++) {
      if (dist(x, y, birds[i].x, birds[i].y) < neighborhoud) {
        accumX += cos(birds[i].dir);
        accumY += sin(birds[i].dir);
      }
    }
    return atan2(accumY, accumX);
  }
}

void setup() {
  size(canvasW, canvasH);

  fill(0);
  for (int i = 0; i < population; i++) {
    birds[i] = new Bird(random(0, canvasW),
                        random(0, canvasH),
                        random(0, TWO_PI));
  }
}

void draw() {
  background(204);
  for (int i = 0; i < population; i++) {
    birds[i].display();
    float newdir = birds[i].newDir();
    birds[i].dir = newdir;
    birds[i].x += speed * cos(newdir);
    birds[i].y += speed * sin(newdir);
  }
}
このプログラムの難点は、群れの行動に対する個々の鳥の影響度合いが平等でないことで、鳥(Bird オブジェクト)の配列 birds の先頭に近い鳥ほど影響力が大きい。「追記] atan2の使い方もいけない。

Sunday, June 7, 2015

ライオンより強いバッファローがライオンに追われて逃げるわけ

YouTube にはライオンとアフリカンバッファロー(アフリカ水牛)の戦いを記録した動画がたくさんアップされている。これらを見ていると、戦いの参加者数によって経過と結果がパターン化でき、おおまかには4つに分類できる。

複数のライオン vs 1頭のバッファロー: 複数のライオンが背後からバッファローを襲い、首筋、背中、尻などにかじりつく。バッファローは倒されて食われてしまう。このようなケースは、ライオンの連携がうまく運んで、バッファローの群れから1頭を引き離すことに成功したときに起こる。
1頭のライオン vs 複数のバッファロー: ふつうはライオンが逃げ出して戦いが終わる。逃げられない場合、ライオンはバッファローの角に引っ掛けられて空中に放り上げられ、脇腹などに重傷を負う。悪くするとなぶり殺しにされる。
複数のライオン vs 複数のバッファロー: この場合もライオンが逃げ出す。一般にバッファローを襲うライオンの群れは数頭から10頭未満だが、バッファローの群れは桁違いに大きく、数の優劣で勝負が決まる。
1頭のライオン vs 1頭のバッファロー: 1対1の戦いはほとんどないが、群れと群れの戦いの中で一時的にそのような局面になることがある。ライオンは背後からバッファローにかじりつくが、体力で勝るバッファローに振り払われる。正面から向かい合ったときはバッファローが勝つ。

このように集団対集団でも1対1でもライオンより強いバッファローだが、なぜかライオンに襲われるといっせいに逃げ出す。ほとんどの局面でライオンより強く、しかも頭数でライオンの群れを圧倒しているバッファローの群れが、どうしてライオンの襲撃を迎え撃たずに逃げてしまうのだろうか
そのわけは、動物の群れが仲間の動きを模倣する本能を持っていること(「模倣で生まれる群れの集合知」参照)、およびライオンが肉食であるのに対しバッファローが草食であることで説明できると思われる。

ライオンはバッファローを倒すと食事にありつける。つまりバッファローを襲い戦う強い動機がある。
いっぽう草食性のバッファローはライオンを倒しても得るものがない。もしかすると、襲撃者に報復する快感が大きいとか、あるいは、ネコが半死のネズミをいたぶるように、ライオンを宙に投げ上げて遊んでいるのかもしれないが、それらの可能性を除けばバッファロー側の戦いの動機は弱い。
すなわち、動機に関してライオンとバッファローは対等ではない。両者の遭遇にあっては、ライオンの側に「食う」という強い動機があるのに対し、バッファローの側には「食われる」という恐怖、言い換えればネガティブな動機しかない。それがとりあえずバッファローが戦いを避けて逃げ出す理由である。
バッファローが集団として逃走を開始することについては「模倣」で説明できる。ライオンの襲撃に気づいた1頭が逃げ出すと、まわりの仲間がそれにつられて逃げ出す。研究者らが主張しているように(「模倣で生まれる群れの集合知」)、模倣の伝播は言語的コミュニケーションよりずっと速く、最初の1頭の逃走は模倣によってたちまち群れ全体に広がり、群れとしての逃走がはじまる。戦いが起こるのはライオンがバッファローの群れに追いついてからである。

ところで、いったん逃げ出したバッファローの群れが戦いの場に引き返してくることがある。まず次の YouTube ビデオを見ていただきたい。再生回数7600万回を超える人気ビデオである。



ビデオには次のような経過が映されている。
川に沿ってバッファローの群れが移動している。
その前方でライオンが草むらに身を潜めて待ちかまえている。ライオンの群れが立ち上がって襲撃にかかると、バッファローの群れはいっせいに逃げ出す。
逃げ遅れた幼いバッファローが水際に転落し、3〜4頭のライオンが噛みつく。
もみあう間に水中からワニが走り出て、これもバッファローに噛みつく。
前門のライオン、後門のワニ。絶体絶命と思われる状況でバッファローの群れが引き返してきて、ライオンとワニを蹴散らす。ビデオがやや不鮮明で見逃しそうだが、6分27秒あたりで子バッファローが立ち上がって群にもどってゆくのが見られる。

逃走中のバッファローの動きを反転させたものは何だろう。
これも「模倣」で説明できそうである。
以下は想像でしかないのだが、子バッファローのいないことに気づいた母バッファローがまず反転したのではないか。それにつられて周囲のバッファローが元の方向に向きを変え、さらに集団として争いの現場にもどり、結果として小バッファローが救出された。そのような経過だったのではないか。
この想像は、群れにおけるリーダーとは何かという問題に展開できる。
乱暴に定式化しておけば、リーダーとは、群れにとって最適の選択を提示する者よりも、むしろ最も勢いのある選択をする者のことではないか。このビデオのケースでいえば、子バッファローの救出はかならずしも群れにとって最適の選択ではない。逃走をやめて引き返せば他のバッファローが犠牲になる可能性もある。だがこのケースでバッファローの群れは、得失を冷静に判断した「最適な選択」ではなく、子を思う母バッファローの「勢いのある選択」を模倣した。以上の想像が正しければだが、勢いのある行動で群れを反転させた母バッファローが、このケースでのリーダーである。

Friday, June 5, 2015

模倣で生まれる群れの集合知


おもにピーター・ミラー『群れのルール 群衆の叡智を賢く活用する方法』第4章「鳥」による。

1919年、イギリスの鳥類学者エドマンド・セルスはスズメの群れの行動を観察していて、ある仮説に行き着いた。草のあいだでそれぞれに座ったり立ったりしていた数百羽、数千羽のスズメがいっせいに舞い上がり、空中でみごとな旋回を見せたかと思うと、次の瞬間にはいっせいに地上に舞い降りる。これほどの協調的な行動はどのようにして可能なのか。
従来の説では、鳥たちの一致した行動はリーダーの指示によるとされていたが、それはありえないとセルスは考えた。数千羽ものスズメの協調行動は、リーダーの指示によるとしたのでは協調のみごとさや同期の素早さが説明できない。彼が可能性を見いだした唯一の仮説は、鳥たちが何らかのテレパシーによって行動を同期させているというものだった。
今日までの研究でテレパシー説は捨てられているが、協調行動の謎を解明するというセルスの問題提起は正当なもので、群れの行動のカギとなるのが「模倣」であることが明らかになっている。

1986年、コンピュータグラフィックスの専門家クレイグ・レイノルズが、鳥の群れの動きをシュミレートするボイド(Boid)というシンプルなプログラムを作った。
このプログラムでは、鳥に見立てた多数の物体 boid (bird-oid=鳥もどき)に、
  1. 他のボイドと衝突しないこと
  2. 他のボイドと離れないこと
  3. 全体の流れに沿って飛ぶこと
この3つのルールを与えて、群れの動きをシュミレートする。boid 同士がたがいの距離によって離れたり近づいたりするだけのシンプルなモデルだが、シュミレーションの結果はきわめて鳥の群れの動きに近いものだった。

レイノルズが作成した Boid のシュミレーション映像。


次のリンク先にあるのは Processing による Boid のバリエーション。
画面上でクリックすると新しい boid が生まれて群れの動きに追随してゆく。
» Flocking/Examples/Processing.org

1995年、ハンガリーの物理学者タマス・ヴィセックは、磁性粒子の動きに着想を得て Boid に似たシミュレーションモデルを作った。このモデルでは、鳥や魚に見立てた個々の物体は単一のルールに従って同じ速度で動く。
そのルールとは「自分から見て一定の距離内にある物体が向かっている方向の平均値を取り、それを自分の進路とする」というもので、ヴィセックは物体の数を40個から最大1万個まで増やしてシュミレーションを行ったが、いずれの場合も物体は自然に密集しはじめた。最初は小さなグループがでたらめに動き回るだけだったが、次第に単一のグループにまとまって、同じ方向に動くようになるのが観察された。

2004年末から2007年にかけて、イタリア、フランス、ドイツ、ハンガリー、オランダの7つの研究機関から、生物学者、物理学者、コンピュータサイエンティストが参加して、「ムクドリの飛行(略称STARFLAG)」という調査プロジェクトが行われた。中心になったのはイタリアの研究機関で、調査対象にはローマ国立博物館の屋上から観察できるムクドリの群れが選ばれた。
現実の鳥の群舞を観察・解析する試みは早くから行われていたが、対象となる群れの大きさは10羽程度から100羽足らずであった。これに対して STARFLAG プロジェクトでは数百羽から数万羽の群れを対象とし、現代の高解像度ビデオカメラや画像解析技法を駆使して1羽ずつの個体の識別を可能にし、鳥たちが従っているルールを明らかにした。
博物館の屋上から見るムクドリの群れはたいがい球状をしているように見えたが、解析の結果はそれらがむしろ平らであることがわかった。「群れはジャガイモのような形状をしていると思ったが、実際にはポテトチップスみたいだった」と研究グループのメンバーはたとえている。
群れの中の個体の散らばり方も意外なもので、群れの中心より端のほうが密集度が高かった。ハヤブサなどの外敵に襲われた場合、中心部のほうがより安全である。そこで各個体が中心部に向かおうとして周辺部の密度が高くなるのだと見られている。
群れの協調行動の原理は、それまでの研究でも言われていたように、個体が他の個体の動きを模倣することだった。ただし、それぞれの個体が注意を払っている相手は6〜7羽にすぎなかった。情報が多すぎるとかえってノイズが混じり、行動が一貫しなくなるためだろうという。また相互作用する個体は、自分の前後ではなく左右の隣人であった。これはムクドリの目が頭の両脇に付いていることで説明できるという。

このような模倣による協調行動は、鳥の群れだけでなく、魚やトナカイの群れ、さらに人間の集団でも見られ、メンバーが他の個体を注視することで集合知を生み出す原動力となっている。