- 数値列がある。それを入れ替えたい
- すべての要素が入れ替えられていて、一つとしてもとの順番になっていないようにする
- 使える関数があるかと思ったが見つからないので、作る
- バグがあったので少し修正しました(20110126)
shuffle<-function(x){
X<-length(x)
s<-sample(1:X)
ret<-1:X
evod<-X%%2
L<-(X-evod)/2
for(i in 1:L){
pre<-s[i*2-1]
post<-s[i*2]
ret[pre]<-post
ret[post]<-pre
}
if(evod==1){
post<-s[X]
ds<-1:(X-1)
t<-sample(ds[-which(ret==X)],1)
pre<-ret[s[t]]
ret[s[t]]<-post
ret[post]<-pre
}
x[ret]
}
x<-1:9
Niter<-10000
cp<-rep(0,Niter)
for(i in 1:Niter){
sx<-shuffle(x)
cp[i]<-min(abs(x-sx))
if(cumprod(x-sx)[length(x)]==0)print(sx)
}
min(abs(cp))
- この作業は任意次元の正規直交基底を回転させるため
- さらにそれは、曲線にあって接線方向の運動方向を決めるため
- 以下のソースはほんのメモ
shuffle<-function(x){
X<-length(x)
s<-sample(1:X)
ret<-1:X
evod<-X%%2
L<-(X-evod)/2
for(i in 1:L){
pre<-s[i*2-1]
post<-s[i*2]
ret[pre]<-post
ret[post]<-pre
}
if(evod==1){
t<-sample(s[-X],1)
pre<-ret[t]
post<-ret[X]
ret[t]<-post
ret[X]<-pre
}
x[ret]
}
x<-1:10
Niter<-10000
cp<-rep(0,Niter)
for(i in 1:Niter){
sx<-shuffle(x)
cp[i]<-min(abs(x-sx))
if(cumprod(x-sx)[length(x)]==0)print(sx)
}
min(abs(cp))
Niter<-10000
dt<-0.01
d<-2
xs<-matrix(0,Niter,d)
xs[1,]<-runif(d)
n<-3
ctrs<-matrix(runif(d*n),ncol=d)
M<-list()
for(i in 1:n){
ok<-TRUE
news<-rep(0,d)
while(ok){
s<-1:d
news<-rep(0,d)
already<-c()
for(j in 1:(d-1)){
already2<-c(already,j)
print(already2)
print(s[-already2])
news[j]<-sample(s[-already2],1)
already<-c(already,news[j])
}
if(s[-already]!=d){
news[d]<-s[-already]
ok<-FALSE
}
}
print(news)
cumprod(news-s)
pm<-1
M[[i]]<-matrix(0,d,d)
for(j in 1:d){
M[[i]][j,news[j]]<-pm
pm<-pm*(-1)
}
}
M
for(i in 2:Niter){
tmp<-rep(0,d)
for(j in 1:n){
tmpr<-sqrt(sum(xs[i-1,]-ctrs[j,])^2)
tmpv<-M[[j]]%*%(xs[i-1,]-ctrs[j,])/sqrt(sum(tmpv^2))
print(sum(tmpv*(xs[i-1,]-ctrs[j,])))
tmp<-tmp+tmpv/tmpr*dt
}
xs[i,]<-xs[i-1,]+dt*tmp
}
xs2<-rbind(xs,ctrs)
plot(as.data.frame(xs2))