移動によって解を探す
- 一昨日のnクイーン問題
- 解を探そうと思い書いてみた
- この書き方では振動してしまって解にならなかった
- 一昨日のとこちらのときのハイブリッドのプログラミング
N<-10 T<-200 A<-B<-matrix(0,N,N) A[sample(1:N^2,9)]<-1 #とりあえず9個のクイーンをおく 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(which(u==min(u)),which(u==min(u))),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)) } }