在随机游走中引入停止功能
问题描述:
在我之前的问题中:How do I put arena limits on a random walk?社区帮助在一个舞台上创建了一个随机游走功能。此功能旨在模拟鱼在区域内移动,但现在我需要在满足特定条件时决定何时停止。在随机游走中引入停止功能
我认为这将会像 {{if(z>P)break}}
一样简单放在循环函数之前。我想让它理解的是“如果这个条件满足,那么停下来,否则继续下去,直到你达到最大步数。
反而它导致我的随机游走成为确定性的(我总是得到相同的路径和它step.max从未停止)
主要问题:我如何告诉随机游走停止如果Z>点
参考:?
step.max<-125
step.prob<-function(n.times=step.max){
draw=sample(0:100,1,replace=T)
CS<-sample(draw,size=1,replace=TRUE)
CS.max<-100
step.num<-15
SP<-((CS/CS.max)*(1-(step.num/step.max))+(step.num/step.max))*100
if(SP>P){stop('Settled at step number',P)}else{SP
}
}
z<-step.prob(1) #renaming the above function to be easier to reference later
P<-80 #preset cutoff point for value z, ranges from 0-100
walkE <- function(n.times=125,
xlim=c(524058,542800),
ylim=c(2799758,2818500),
start=c(525000,2810000),
stepsize=c(4000,4000)) {
plot(c(0,0),type="n",xlim=xlim,ylim=ylim,
xlab="Easting",ylab="Northing")
x <- start[1]
y <- start[2]
steps <- 1/c(1,2,4,8,12,16)
steps.y <- c(steps,-steps,0)
steps.x <- c(steps,-steps[c(1,5,6)],0)
points(x,y,pch=16,col="red",cex=1)
for (i in 1:n.times) {
repeat {
xi <- stepsize[1]*sample(steps.x,1)
yi <- stepsize[2]*sample(steps.y,1)
newx <- x+xi
newy <- y+yi
if (newx>xlim[1] && newx<xlim[2] &&
newy>ylim[1] && newy<ylim[2]) break
}
lines(c(x,newx),c(y,newy),col="blue")
x <- newx
y <- newy
if(z>P){stop(points(newx,newy,col="green",cex=1))}
#this is where I want it to stop if z>P
else
if(z<P){points(newx,newy,pch=1,col="blue",cex=1)}
else
if(step.max){points(newx,newy,pch=16,col="green",cex=1)}
set.seed(101)}
}
walkE(step.max) #run above random walk function walkE looped for the step.max number
在此先感谢! !
答
这很简单,可以通过在您的用户定义的step.prob
函数中插入stop(...)
函数来完成。
step.prob<-function(n.times=step.max, p){
draw=sample(0:100,1,replace=T)
CS<-sample(draw,size=1,replace=TRUE)
CS.max<-100
CS.max
step.num<-15
SP<-((CS/CS.max)*(1-(step.num/step.max))+(step.num/step.max))*100
if(SP > p) {
stop('Your random walk exceeded ', p)
} else {
SP
}
}
如果这不行,请查看break
命令。
所以,当随机游走值>号码:
step.prob(p=300000)
# Error in step.prob(p = 3) : Your random walk exceeded 3
如果你想设置该函数返回给p值,你可以在SP <- p
的stop
命令之前,只是增加。
感谢您对n8sty的评论。你的建议似乎解决了问题的一部分,但我仍然得到一个确定性的输出(它应该是随机的)。任何线索为什么?我更新了代码,这样你就可以看到整个事情是令人讨厌的荣耀。谢谢!! – Jesse001 2014-10-20 20:16:51
@ Jesse001我真的不知道你要在这里完成什么。你希望你的函数在'step.max'或'p'之前停止吗?你的代码中没有什么特别清楚 - 尝试使用'set.seed'包含一些预期的输出。 – n8sty 2014-10-21 02:10:44
我想要做的是在每个步骤之前运行函数z,定义为如上所述的step.prob。如果z> P,这是一个预设的截止点,那么它应该停止行走。如果不满足条件,那么步行应该继续,直到达到step.max。 我会编辑上面的代码,我昨晚在它上面取得了一些进展。 – Jesse001 2014-10-21 13:37:09