アリの動き

アリの動きをシミュレートしてみた。
障害物(1pxの黒い点)を一定の間隔(density)で地図上に配置し、アリ(4px×4pxの赤い点)はランダムに4方向に動こうとする。もし行く先に障害物があればそれを右側に置いて前に進む。以後同様。実際にアリがこんなふうに進むかはとりあえず置いておきます。おそらく実際は、障害物を避け、安全な道を探し、最短経路も見つけたりもするのでしょう。

int map[][];
int X, Y, dir;
color black = color(0);

void setup(){
  size(400, 400);
  background(255);
  map = new int[width][height];
  float density = width * height* 0.3;
  for(int i = 0; i < density; i++){
    int x = int(random(0, width));
    int y = int(random(0, height));
    map[x][y] = 1;
  }
  for (int i = 0; i < width; i++){
    for (int j = 0; j < height; j++){
      if(map[i][j]==1)  set(i, j, black);
    }
  }
  do{
    X = int(random(0, width));
    Y = int(random(0, height));
  }while(map[X][Y]==1);
}

void draw(){
    background(255);
  for (int i = 0; i < width; i++){
    for (int j = 0; j < height; j++){
      if(map[i][j]==1)  set(i, j, black);
    }
  }
  
  fill(255,0,0);
  rect(X-2, Y-2, 4,4);
  
  dir = int(random(4));
  if(dir == 0){
    if(map[X][Y-1] == 1){
      map[X+1][Y-1] = 1;
      map[X][Y-1] = 0;
    }
    Y--;
  }
  else if(dir == 1){
    if(map[X+1][Y] == 1){
      map[X+1][Y+1] = 1;
      map[X+1][Y] = 0;
    }
    X++;
  }
  else if(dir == 2){
    if(map[X][Y+1] == 1){
      map[X-1][Y+1] = 1;
      map[X][Y+1] = 0;
    }
    Y++;
  }
  else{
    if(map[X-1][Y] == 1){
      map[X-1][Y-1] = 1;
      map[X-1][Y] = 0;
    }
    X--;
  }
  if(X-1<0) X = width; else if(X+1>width)  X = 0;
  else if(Y-1<0) X = height; else if(Y+1>height)  Y = 0;
  
  
}

動かすとこんな感じ。左上にぽつんとある赤い点がアリ(のモデル)です。
うごうごと動いて、小さくて分かりにくいのですが、障害物を動かしていきます。

とは言え、アリがどんな行動特性を持っているかを知らない限り、リアルなシミュレーションはできませんね。

Leave a Reply

Your email address will not be published. Required fields are marked *