09.07 BOIDSv0.00 ~集ウ~

目標であった「イワシのトルネード」を行うには、もう1つのルール「集う」=「 結合(Cohesion) 」が必要になります。そこで「避ケル」「整エル」に「集ウ」をルールとして追加してみましょう。

問題は「どこに、どうやって集めるか」ということです。

よくわからないので一般的なボイドサンプルとしてネットに出回っているものを参考にすると、どうやら集合体の「重心」を用いているようです。論理としては自分以外のポッド座標をX,Y成分ごとに集計し平均化します。すると次のようなプログラムになります。


/************************************************************************
* ルール:中心集中                           *
************************************************************************/
void rule1(int index)
{
  int len;

  centerIwashi.x = 0;
  centerIwashi.y = 0;

  len = Iwashi_Count; /* 自分を除くセンターポジションを求める */
  for (int i = 0; i < len; i++)
  {
    if (i != index)
    {
      centerIwashi.x += iwashi[i].x;
      centerIwashi.y += iwashi[i].y;
    }
  }
  centerIwashi.x = centerIwashi.x / (len - 1);
  centerIwashi.y = centerIwashi.y / (len - 1);

  /* センターポジションの1%を移動量とする */
  iwashi[index].vx += (centerIwashi.x - iwashi[index].x) / CENTER_V;
  iwashi[index].vy += (centerIwashi.y - iwashi[index].y) / CENTER_V;
}


では、その結果 個体数を10個の場合と100個の場合を動画で見てください。

【BOIDS MODEL V0 00 ~集ウ10~】



【BOIDS MODEL V0 00 ~集ウ100~】





09.08 BOIDSv0.00 ~集ウ~までの問題点

BOIDS v0.00で必要な3つの条件を満たすプログラムを作ってみましたが、いわしの群れに見えますでしょうか?

少なくともGGEには全く「生き物の動き」とはほど遠いように見えます。
100個体事例は、ほとんどブラウン運動と変わりありませんねぇ! なぜか?


① 論理の矛盾
大きな問題点としては、「分離」と「結合」は相反する論理であるということです。
つまり、くっ付いていけば必ず距離によって分離しなければならないということです。分離すると重心移動する。
こういうのって機械制御だと高速の場合「振動」の原因となり、あまりしない論理なのです。

② 重心への集結
ウナギの養殖場で食べ物を投げ込むと気持ち悪いほどウナギが寄ってきて餌にありつこうとする光景をテレビなどで目にすることがありますが、この場合BOIDS的にいえば「 結合(Cohesion) 」が1点集中している事例です。ウナギの場合は空間上の間合いがなく、ウナギ本体の体積が保持されるだけになるため見た目気持ち悪い状態になりますが、今回の場合、重心と自位置との差分の割合が分離速度になる為、近いと遅く遠いと速い速度で分離するため非常に不自然な動きになっています。

③ 数が多くなると
数が少ないうちは、ある程度の間合いを取りながら移動しますが、多くなってくると様々な支障が出てきます。
重心へ移動しようとしても周囲に他のポッドが妨げとなって容易に分離できないため、全体的印象で見るとランダムウォーク状態になってしまう傾向があります。