ライフゲーム

KABIRA2010-11-22

  • 昨日のつづき(こちら
  • 昨日は独立の運動
  • 今回は次ステップが周囲の状況に依存する
    • いくつか入れてみたいパラメータも書いてみた
    • 局所ルールが全体にどれだけ影響するか
    • 組織的な形、動きとなるかどうか
N<-40
M<-40
T<-30
C<-B<-A<-matrix(0,N,M)

for (i in 1:N){
	for (j in 1:M){
		C[i,j]<-sample(0:1,1)
		}
	}
#C[c(20,21),]<-c(10)	

A<-C

#  8 1 2  #
#  7   3  #
#  6 5 4  #
#各方向の8マス分の合計を計算する
f8 <- function(a,b){
	a1<-c(a-2,a-1,a); b1<-c(b-2,b-1,b)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f1 <- function(a,b){
	a1<-c(a-2,a-1,a); b1<-c(b-1,b,b+1)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f2 <- function(a,b){
	a1<-c(a-2,a-1,a); b1<-c(b,b+1,b+2)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f7 <- function(a,b){
	a1<-c(a-1,a,a+1); b1<-b1<-c(b-2,b-1,b)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f3 <- function(a,b){
	a1<-c(a-1,a,a+1); b1<-c(b,b+1,b+2)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f6 <- function(a,b){
	a1<-c(a,a+1,a+2); b1<-c(b-2,b-1,b)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f5 <- function(a,b){
	a1<-c(a,a+1,a+2); b1<-c(b-1,b,b+1)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}
f4 <- function(a,b){
	a1<-c(a,a+1,a+2);b1<-c(b,b+1,b+2)
	sum(A[a1[0<a1 &a1<N+1],b1[0<b1 & b1<M+1]])-A[a,b]
	}


for ( t in 1:T){


for (i0 in N:1){
		for (j0 in M:1){
			if(A[i0,j0]>0){
				for(k in 1:A[i0,j0]){
					i <- i0
					j <- j0
			
			v<-c(f1(i,j),f2(i,j),f3(i,j),f4(i,j),f5(i,j),f6(i,j),f7(i,j),f8(i,j))  #各方向に存在する数のベクトル
			#which(v == max(v))
			if( max(v) > 3){        #仲間が近くにある程度いる場合
				dir<-sample(c(which(v == max(v)),which(v == max(v))),1)   #味方の多い方向へ移動することにする
				if(dir == 1 ){i <- i-1}
				if(dir == 2 ){i <- i-1; j <- j+1}
				if(dir == 3 ){j <- j+1}
				if(dir == 4 ){i <- i+1; j <- j+1}
				if(dir == 5 ){i <- i+1}
				if(dir == 6 ){i <- i+1; j <- j-1}
				if(dir == 7 ){j <- j-1}
				if(dir == 8 ){i <- i-1; j <- j-1}

				if(i == 0){i <- 1}      #境界条件
				if(i == N+1){i <- N}
				if(j == 0){j <- 1}
				if(j == M+1){j <- M}
			
				B[i,j]<-B[i,j]+1
#				if( runif(1) < 0.2){ B[i,j]<-B[i,j]+1 }      #たまに細胞分裂します  増え過ぎに注意
				
				}else{
#				break        #周りに仲間がいなくて孤立したときは死亡

				r <- runif(1)     #あるいはランダムウォーク #y軸方向の動き
				if(r < 1/3){
				i <- i-1
				}else if(r > 2/3){
				i <- i+1
				}
				r <- runif(1)             #x軸方向の動き
				if(r < 1/3){
				j <- j-1
				}else if(r > 2/3){
				j <- j+1	
				} 
		
				if(i == 0){i <- 1}      #境界条件
				if(i == N+1){i <- N}
				if(j == 0){j <- 1}
				if(j == M+1){j <- M}
			
				B[i,j]<-B[i,j]+1		#動いた後の場所をBに保存
	
				}
					
				
							
			


					}
			
				}
			}
		}
			A<-B
			B<-matrix(0,N,M)
			image(A,col=terrain.colors(20))
#			if(t == T/2){A[N/2,M/2]<-10}    #オーガナイザーを突如出現させる場合
			
	}