-1

正方格子上の 2 次元で自己回避ランダム ウォークをシミュレートし、パスをプロットしたいと考えています。

これまでのところ、この問題のコードを書きました。

n <- 100
x <- 0
y <- 0 

randomwalkx <- 0
randomwalky <- 0

for(i in 1:n){

  random <- sample(0:3, 1)

  if(random == 0){x <- x+1}
  if(random == 1){x <- x-1}
  if(random == 2){y <- y+1}
  if(random == 3){y <- y-1}

  xcheck <- x %in% randomwalkx
  ycheck <- y %in% randomwalky


  if(ycheck == "TRUE" && xcheck == "TRUE"){

    if(random==0){x<-x-1}
    if(random==1){x<-x+1}
    if(random==2){y<-y-1}
    if(random==3){y<-y+1}

  }else{
    randomwalkx <- c(randomwalkx, x)
    randomwalky <- c(randomwalky, y)
  }

}


  plot(randomwalkx,randomwalky,xlab='x',ylab='y')
  lines(randomwalkx,randomwalky,type='b')

ただし、パスは 1 つの斜め方向にのみ移動します。私が犯した間違いを誰かが見たり、この問題を解決したりできますか?

4

1 に答える 1

2

問題は次の行にあります。

if(ycheck=="TRUE"&&xcheck=="TRUE"){

その線が行っていることは、歩行が「後退」できないようにすることです。あなたの散歩が randomwalkx=(0,1,1,2), randomwalky=(0,0,-1,-1) になり、次のロールが x = x-1 になるとしましょう: 次の座標は 1 になります,- 1. x=1 と y=-1 の両方がランダム ウォーク履歴に存在するため、x または y のいずれかで同じ方向に進み続けるまで、ループはリロールされます。

行を次のように変更することでこれを修正できます

if(paste(x,y) %in% paste(randomwalkx, randomwalky)){
于 2015-03-16T18:52:40.063 に答える