ライフゲーム
- 昨日のつづき(こちら)
- 昨日は独立の運動
- 今回は次ステップが周囲の状況に依存する
- いくつか入れてみたいパラメータも書いてみた
- 局所ルールが全体にどれだけ影響するか
- 組織的な形、動きとなるかどうか
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} #オーガナイザーを突如出現させる場合 }