ノイズによって振動しなくなる?
- 少し改良:ノイズ入りの方法
- 改良点は第51行
- 改良前
dir<-sample(c(which(u==min(u)),which(u==min(u))),1)
-
- 改良後
dir<-sample(c(rep(which(u==min(u)),times=10),1:8),1)
- つまり
- 移動する方向を決めるとき:dir <-sample(...,1)
- 基本的には:rep(... , 10)
- 他のクイーンの効き筋を避けて移動するが:which(u==min(u))
- それ以外の場所にも動ける: c(...,1:8)
- アニメーションは
- N=10
- Qの数が7個
- 今回の方法で
- 振動はしていない
- Qの数が少ないときはよいが
- Qの数が多いと時間がかかりすぎてたどり着かない
N<-10 T<-2000 A<-B<-matrix(0,N,N) A[sample(1:N^2,7)]<-1 #7個のクイーンをおく u<-c() for ( t in 1:T){ for (i0 in N:1){ for (j0 in N:1){ if(A[i0,j0]>0){ for(k in 1:A[i0,j0]){ # i <- i0 # j <- j0 # 8 1 2 # 7 9 3 # 6 5 4 #周囲(1から8)と今いる場所(9の場所)にいくつのクイーンが"効いて"いるかを調べる for (d in 1:9){ dir <- d i <- i0 j <- j0 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 == N+1){j <- N} #縦横ナナメの成分をとってくる(一昨日の記事と同じやりかた) u0<-c(A[i,],A[,j],diag(A[max(1,i-j+1):min(i+N-j,N),max(1,j-i+1):min(j+N-i,N)]),diag(A[min(i+j-1,N):max(1,i+j-N),max(1,j+i-N):min(i+j-1,N)])) u[d]<-sum(u0) #これが効いている数(自分の効きも含まれる) } i <- i0 j <- j0 #自分の今いる場所(9の場所)に他のクイーンの効きがあるときは効きの少ないところへ移動する #他のクイーンが効いていないとき(u[9]==4のとき)は動かない if(u[9] !=4){ dir<-sample(c(rep(which(u==min(u)),times=10),1:8),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 == N+1){j <- N} B[i,j]<-B[i,j]+1 } } } } if(min(A-B)==0){ #定常状態になったら終了 image(A,col=topo.colors(20)) break }else{ A<-B #次のステップへ B<-matrix(0,N,N) image(A,col=topo.colors(20)) } }