椋鳥と鷹の行動をシミュレーションしてみた

『「みんなの意見」は案外正しい』があまりに面白かったので、ちょっと遊んでみることにしました。
いろいろエピソードがあったけど、ビジュアル的にも面白いものできそうなので、ムクドリの話をシミュレーションで実証しました!

この著作の中では、このように書かれています…
外部から観察していると、群れを守ろうとするリーダーが群れの動きを導いているように見える。そこまでいかないにしても、椋鳥たちは少なくともお互い協調して、群れの生き残りのためにあらかじめ合意した戦略に沿って動いているように見える。だが、どちらの見解も間違っている。椋鳥は次の四つのルールに従って行動している。
①中心にできるだけ近いところにいるようにする
②隣の個体と二、三羽分の距離を空けて飛ぶようにする
③ほかの個体にぶつからないようにする
④鷹に襲われたら逃げる

ほかの個体の次の行動を知っている椋鳥はいない。ほかの個体に命令する椋鳥もいない。群れが正しい方向に進み、捕食者の攻撃を避け、バラバラになっても群れがもう一度まとまれることを保証するのは四つのルールだけだ。


ムクドリには、指揮をするリーダーがいるわけでも、あらかじめ合意した戦略があるわけでも、お互いの協調しているわけでもなく、単純な四つのルールで行動していると。
じゃあ、このルールだけで本当に鷹から逃げつつ群れがまとまっていられるのか!?シミュレーションで実証してみよう!


まず、ルールについてもう少し定量的に表現してみる、

①中心にできるだけ近いところにいるようにする
まず、N羽のムクドリが3D空間上にいることを考える。それぞれのムクドリは全ムクドリの位置座標の重心点に向かおうとする。ただし、②、③、④の条件の方が優先順位が高い。

②隣の個体と二、三羽分の距離を空けて飛ぶようにする
お互いの距離は群れの大きさに影響するので、とても重要なパラメータ。ムクドリ同士の距離が、ある一定値(Dsとする)以下になる場合は、重心点から遠ざかるように行動する。
近づきすぎた場合にどう行動させるか、難しかしい。遠ざかる方に行動したところで、ぶつかる可能性はある。しかし、あまり複雑な条件検討をしたくはなかったので、取りあえず、近づきすぎたら、広がる方に少し動くようにさせるだけに。

③ほかの個体にぶつからないようにする
正直この条件と②の違いが微妙。②は正しい方向に進むときのルールで、③は鷹に襲われた時のルールにも聞こえる。ここでは、②についての条件で満たせていることとしよう。

④鷹に襲われたら逃げる
これはとても単純、鷹との距離が一定値(Dhとする)以下になった場合に、鷹から遠ざかる方向に全速力で移動する。この条件が一番、優先順位高い。


ざっと、まとめると
鷹が近づきすぎたら、反対方向に逃げる。
鷹が十分遠ければ、群れの中心に行こうとする。
でも、他の個体と近づきすぎたら中心から遠ざかる。
こんな感じかなぁ~



あと、力学的な行動の制限も加えました。

ムクドリ
最大速度=12ピクセル
加速度=10ピクセル

最大速度=20ピクセル
加速度=2ピクセル

これはどういうことかというと
鷹はムクドリに比べて、早く飛べるはず!なので、
鷹は1フレームあたり最大20ピクセルの速度で移動できるように、
ムクドリは最大12ピクセルに設定。
でも、きっとムクドリの方が小回り効きそう!(願望)
ということで、鷹は2ピクセルずつ、ムクドリは10ピクセルずつ速度を変化させられるように設定しました。あと、鷹は一番近い位置のムクドリの方向に移動するように設定!
この力学的な条件の範囲で、さきほどのルール通りに、各個体は速度を変化させる、というわけです。



シミュレーションの動画はこちら!

赤がムクドリ、大きな青が鷹と思ってください。ムクドリは基本的には群れようとしていますが、鷹が近づいてくると散り散りに逃げていきます。時折、一匹が追われることもありますが、小回りが利く分ちゃんと群れに戻って来られます。このシミュレーションではパラメータを以下のように設定しています。
ムクドリの数 N = 50 
ムクドリ同士の距離 Ds = 20ピクセル
鷹から逃げる行動をとる距離 Dh = 200ピクセル

このシミュレーションでは、鷹が一番近いムクドリを襲おうとすると標的が定まらず、獲物を得られないこともわかりました。群れの数やムクドリ同士の距離によって、鷹を上手くかく乱できるかどうかが決まると考えられます。
しかし、鷹の飛翔能力(小回り効かない)を悪く設定していることがかなり大きい。基本的に、鷹の動きは、惑星の公転運動と同じように、ムクドリ方向の向心力をもつ円運動をしています。この向心力にあたるのが、加速度の設定。加速度によって円運動の半径が変わってきます。

試しに、加速度を6ピクセルに設定しました。
すると、、、


シミュレーション開始後すぐに、一匹が追い回される状況になってしまいました。こうなってしまうと実際には、飛び疲れたムクドリは捕まってしまうでしょう。



というわけで、
それぞれの飛翔能力の設定が結末を左右しそうではありますが、確かに4つの条件だけでムクドリは群れとして秩序だった行動をとることが実証されたといっていいでしょう。
ここから、いろいろとパラメータを振って、実際のムクドリの群れの数が適性か、とかいろいろと検証はできそうですね…やりはしませんけど。




~補足情報~
OS:Windows 8.1
開発環境
Microsoft Visual Studio Express 2012
openFrameworks v0.8.4

コメント

このブログの人気の投稿

入力インピーダンスってなに?

脳の3DグラフィックをOpenFrameworksで作成

デトロイト美術館展 上野の森美術館