酔歩の応用:種の絶滅のシミュレーション

問題設定

酔歩の応用問題として種の絶滅の問題を Galton-Watson過程と呼ばれる考え方にもとづく非常に簡単なモデルで考える。 実はこの過程はもともと貴族の家系の絶滅を扱うために考えられたモデルなので、 名字の絶滅にも応用できるし、種よりずっとミクロなレベルで遺伝子の絶滅 などに応用できる。

モデル

  1. 種の数をNとし、最初はすべて種に同数の個体がいるとする。
  2. 各時間ステップで、個体数は増殖率にしたがって個体数を変化させる。ただし、増殖率は平均値のまわりで毎回ランダムに変動するものとする。
  3. 個体数が0になった系統はそれ以上変化しない(絶滅)。
  4. 所定のステップ数に達するか、 それ以前に全系統の個体数の総和があらかじめ決められた 総個体数に達したら終了する(飽和)。つまり、他の種より先に大増殖できた種が世界を支配する。

プログラム

以下のようなプログラムを書いてみた
#include<stdio.h>
#include "rnd.h"
#define NMAX 1000000
#define N 100
main()
{ int i,j,k,nn,ninit,randinit,step;
  int a[N],sum;
  int rseed[RND_P];
  double r[N],rate;

  scanf("%d%d%d%lf%d",&nn,&ninit,&step,&rate,&randinit);

  ranset(randinit, rseed);

  for(i=0; i<nn; ++i){a[i]=ninit;}
  for(j=0; j<step; ++j){
   drnd(r,nn,rseed);
   for(i=0; i<nn; ++i){ a[i] *= (r[i]*2*rate);}
   for(i=0; i<nn; ++i)printf(" %d",a[i]);
    printf("\n");
   
   sum = 0;
   for(i=0; i<nn; ++i) sum += a[i];
   if(sum > NMAX) break;
  }
  }
なにをしているかわかるだろうか。 このプログラムでは、r[i]が0から1までの間に均等に分布する乱数(一様乱数)なので、10回に1回は0.1以下の小さな値が出る。平均増殖率が1でも個体数がいきなり1/10に落ちてしまうような事態も起きるが、個体数が非常に多くなってくると現実にそのようなことが起きるとは考えづらい。確率論的に正しく考えると、個体数が多いときには増殖率は「正規分布」になると考えるべきである。ここでは、簡単のために一様分布のままとした。

「正規分布」はめんどくさいにしても、もう少し現実的にするためには、増殖率を「平均増殖率×乱数」ではなく、「平均増殖率+小さい幅の変動を表わす乱数」とすればよいだろう。たとえば
   for(i=0; i<nn; ++i){ a[i] *= (rate + haba*(r[i]-0.5));}
とでもすれば増殖率はrateの両側にhaba/2の範囲で均等に分布することになる。もちろん変数habaは定義しておかなくてはならない。これも試してみるとよいだろう。

NMAXの設定は必須というわけではないので、最大ステップ数だけを終了条件にしてもかまわないだろう。
次へ