2014-10-16 66 views
0

在我之前的問題中: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 

在此先感謝! !

回答

0

這很簡單,可以通過在您的用戶定義的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 <- pstop命令之前,只是增加。

+0

感謝您對n8sty的評論。你的建議似乎解決了問題的一部分,但我仍然得到一個確定性的輸出(它應該是隨機的)。任何線索爲什麼?我更新了代碼,這樣你就可以看到整個事情是令人討厭的榮耀。謝謝!! – Jesse001 2014-10-20 20:16:51

+0

@ Jesse001我真的不知道你要在這裏完成什麼。你希望你的函數在'step.max'或'p'之前停止嗎?你的代碼中沒有什麼特別清楚 - 嘗試使用'set.seed'包含一些預期的輸出。 – n8sty 2014-10-21 02:10:44

+0

我想要做的是在每個步驟之前運行函數z,定義爲如上所述的step.prob。如果z> P,這是一個預設的截止點,那麼它應該停止行走。如果不滿足條件,那麼步行應該繼續,直到達到step.max。 我會編輯上面的代碼,我昨晚在它上面取得了一些進展。 – Jesse001 2014-10-21 13:37:09