0

In my previous question:How do I put arena limits on a random walk? the community helped create a random walk function in a set arena. This function is designed to simulate a fish moving through an area, but now I need to make it decide when to stop when a certain condition is satisfied.

I thought it would be as simple as {{if(z>P)break}} put in just before the loop function. What I want it to understand is "if this condition is satisfied then stop, otherwise keep going until you reach the maximum number of steps.

Instead it caused my random walk to become deterministic (I always get the same path and it never stops before step.max).

Main question: How do I tell the random walk to stop if z>P?

For reference:

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

Thanks in advance!!!

Community
  • 1
  • 1
Jesse001
  • 924
  • 1
  • 13
  • 37

1 Answers1

0

This is pretty easy and can be accomplished by inserting a stop(...) function in your user defined step.prob function.

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
  }
}

If this doesn't do it for you look into the break command.

So, when the random walk value is > p:

step.prob(p=300000)
# Error in step.prob(p = 3) : Your random walk exceeded 3

And if you want to set the value returned by the function to p you can just add in SP <- p before the stop command.

n8sty
  • 1,418
  • 1
  • 14
  • 26
  • thank you for your comment n8sty. Your suggest seems to fix part of the issue, but I'm still getting a deterministic output (it should be stochastic). Any clues as to why? I updated the code so you can see the whole thing in all it's annoying glory. Thanks!! – Jesse001 Oct 20 '14 at 20:16
  • @Jesse001 i really have no idea what you're trying to accomplish here. Do you want your function to stop before `step.max` or `p`? nothing in your code is particularly clear--try including some expected output using `set.seed`. – n8sty Oct 21 '14 at 02:10
  • What I'd like it to do is run function z, defined as step.prob as written above, before each step. If z>P, which is a preset cutoff point, then it should stop walking. If that condition is not satisfied, then the walk should continue until it reaches step.max. I'll edit the above code, I made some progress on it last night. – Jesse001 Oct 21 '14 at 13:37