如何将竞技场限制设置为随机行走? [英] How do I put arena limits on a random walk?
问题描述
我正在建立一个偏倚的相关随机游动,并且我设法建立了RW,并将其偏向于西风运动.
I'm building a biased correlated random walk, and I've managed to build the RW, and bias it for westerly movement.
问题:我需要将步行限制在一侧(或全部)上.
The issue: I need the walk to be bound on one (or all) side(s).
当前代码为:
walk<-function(n.times){
plot(524058:542800,2799758:2818500,type="n",
xlab="Easting",ylab="Northing")#arena
y<-2815550 ##startY
x<-542800 #startX
N<-4000
E<-4000
points(x,y,pch=16,col="red",cex=1)
for (i in 1:n.times) {
yi <- sample(c(N,N/2,N/4,N/8,N/12,N/16,
0,-N,-N/2,-N/4,-N/8,-N/12,-N/16),1)
xi<-sample(c(E,E/12,E/16, 0,-E,-E/2,-E/4,-E/8,-E/12,-E/16),1)
lines(c(x,x+xi),c(y,y+yi),col="blue")
x<-x+xi
y<-y+yi
}
}
iterations<-125
walk(iterations)
到目前为止,我最近使用的是
So far the closest I've come is using
if(y>2818500 | y<2799758 | x>542800 | x<524058) break
如果离开竞技场,就会停止步行.
which simply stops the walk if it leaves the arena.
推荐答案
该函数的稍作清理的版本:主要变化是添加了repeat {}
循环,该循环将重新选择步骤直到新位置在限制范围内(也可以使用while() {}
循环).
A slightly cleaned-up version of the function: the primary change is the addition of a repeat {}
loop that will re-pick the step until the new location is within the limits (could also use a while() {}
loop).
更新:没有足够仔细地阅读问题说明,忘记了偏见.该代码以与OP的代码相同的方式合并了偏差.对于N-S运动,平均步长为0;对于E-W运动,通过省略一些积极的步进可能性,我们得到mean(steps.x)
等于-0.0875;由于对步的可能性进行了统一采样,因此步行平均每步向0.0875*stepsize[1]
个单位向左漂移.
update: didn't read the problem statement carefully enough, forgot the bias. This code incorporates the bias in the same way that the OP's code does. For N-S movement the mean step length is 0; for the E-W movement, by leaving out some of the positive step possibilities, we get mean(steps.x)
equal to -0.0875; since the step possibilities are uniformly sampled, the walk drifts to the left by an average of 0.0875*stepsize[1]
units per step.
walk <- function(n.times=125,
xlim=c(524058,542800),
ylim=c(2799758,2818500),
start=c(542800,2815550),
stepsize=c(4000,4000)) {
## blank plot of arena
plot(c(0,0),type="n",xlim=xlim,ylim=ylim,
xlab="Easting",ylab="Northing")
## extract starting point
x <- start[1]
y <- start[2]
## define potential step sizes
steps <- 1/c(1,2,4,8,12,16)
## all possible positive or negative steps for N-S movement
steps.y <- c(steps,-steps,0)
## bias E-W movement by leaving out some positive steps
steps.x <- c(steps[c(1,5,6)],-steps,0)
## plot starting location
points(x,y,pch=16,col="red",cex=1)
for (i in 1:n.times) {
repeat {
## pick jump sizes
xi <- stepsize[1]*sample(steps.x,1)
yi <- stepsize[2]*sample(steps.y,1)
## new candidate locations
newx <- x+xi
newy <- y+yi
## IF new locations are within bounds, then
## break out of the repeat{} loop (otherwise
## try again)
if (newx>xlim[1] && newx<xlim[2] &&
newy>ylim[1] && newy<ylim[2]) break
}
lines(c(x,newx),c(y,newy),col="blue") ## draw move
## set new location to candidate location
x <- newx
y <- newy
}
}
set.seed(101)
walk(1000)
这篇关于如何将竞技场限制设置为随机行走?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!