【问题标题】:How do I put arena limits on a random walk?如何在随机游走中设置竞技场限制?
【发布时间】:2014-12-10 23:27:36
【问题描述】:

我正在构建一个有偏差的相关随机游走,并且我已经设法构建了 RW,并将其偏向于西风运动。

问题:我需要在一侧(或所有)侧绑定步行。

目前的代码是:

walk<-function(n.times){ 
   plot(524058:542800,2799758:2818500,type="n",
      xlab="Easting",ylab="Northing")#aren‌​a 
      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) 

到目前为止,我最接近的是使用

 if(y>2818500 | y<2799758 | x>542800 | x<524058)  break 

如果它离开竞技场,它只会停止步行。

【问题讨论】:

  • 我对此并不熟悉,但我怀疑可能需要更多信息才能获得有用的答案。您能否分享更多代码 - 关于如何构建 RW。当 RW 越过边界时,您希望发生什么?
  • 当它与边界相交时,我希望它在剩余的迭代次数中继续行走(基本上只是从墙上反弹并继续前进)
  • 当它从墙上反弹时,它会以相反的角度反射还是返回原来的方向?
  • walk 代码本身很简单: > walk plot(524058:542800,2799758:2818500,type="n",xlab="Easting",ylab ="Northing")#arena >yxNEpoints(x,y,pch=16,col="red",cex =1) >for (i in 1:n.times) >{yi xi行(c(x,x+xi),c(y,y+yi), col="blue") >xyiterationswalk(iterations)
  • 对不起,我还不知道如何让这个论坛里的代码读起来漂亮

标签: r random-walk


【解决方案1】:

该函数的略微清理版本:主要更改是添加了 repeat {} 循环,它将重新选择步骤,直到新位置在限制范围内(也可以使用 while() {} 循环) .

更新:没有仔细阅读问题陈述,忘记了偏见。此代码以与 OP 代码相同的方式包含偏差。对于 N-S 运动,平均步长为 0;对于 E-W 运动,通过省略一些积极的步骤可能性,我们得到 mean(steps.x) 等于 -0.0875;由于步的可能性是均匀采样的,因此步行平均每步向左漂移0.0875*stepsize[1] 个单位。

 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)

【讨论】:

  • 非常感谢您!如果我可以询问一下(我很抱歉,但我没有很好地阅读代码)。在阶跃函数中,我看不到偏差来自哪里/它是如何工作的。我需要对此进行多次调整,因此弄清楚这一点至关重要。非常感谢您的帮助!
  • 我只是以与您的代码相同的方式合并了偏见。对于 N-S 运动,平均步长为 0;对于 E-W 运动,通过省略一些积极的步骤可能性,我们得到 mean(steps.x) 等于 -0.0875;由于步的可能性是均匀采样的,因此步行平均每步向左漂移 0.0875*stepsize[1] 个单位。
  • 这太棒了。 Ben,可能会要求您评论您的代码。我不了解循环内部的过程。
  • 本,谢谢你的好意。当if 声明== T 时会发生什么?
猜你喜欢
  • 2015-06-16
  • 2021-02-09
  • 2021-07-25
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多