Как мне подойти и решить эту проблему программирования улитки в R - PullRequest
1 голос
/ 01 декабря 2019

Я очень плохо знаком с программированием и пытаюсь решить эту проблему в R.

Улитка живет в центре матрицы 11 x 11 в координатах [6,6] ион хочет уйти на несколько мест подальше от своего дома. Он может двигаться только рядом с квадратом, в котором он находится в данный момент (влево, вправо, вверх и вниз), и если он находится на границе матрицы, он останавливается там, где он находится в данный момент. Верните матрицу, показывающую количество раз, когда улитка была замечена в каждом квадрате во время его приключения, используя функцию runif().

Функция будет выглядеть как ввод: new_snail_house(N)

Любая помощь в том, с чего начать, будет полезна, я знаю примерно правило о том, как перемещать улитку:

Up = [i, j-1]
Down = [i, j+1]
Left = [i-1, j]
Right = [i+1, j]

Я не имею ни малейшего представления о том, как бы я использовал это, хотя и как я использовал бы функцию runif(), чтобы получить количество наблюдений. Заранее спасибо!

1 Ответ

1 голос
/ 01 декабря 2019

Следующая функция выполняет то, о чем спрашивает вопрос. Конечно, есть более простые способы.

new_snail_house <- function(n){
  f <- function(y){
    h <- sample(c(FALSE, TRUE), 1)
    move <- sample(c(-1L, 1L), 1)
    if(h){
      if(move == -1L && y$col > 1) y$col <- y$col + move
      if(move == 1L && y$col < 11) y$col <- y$col + move
    }else{
      if(move == -1L && y$row > 1) y$row <- y$row + move
      if(move == 1L && y$row < 11) y$row <- y$row + move
    }
    y$visits[y$row, y$col] <- y$visits[y$row, y$col] + 1L
    y
  }

  stopifnot(n <= 10)
  x <- list(visits = matrix(0L, 11, 11), row = 6L, col = 6L)
  x$visits[6, 6] <- 1L
  while(TRUE){
    x <- f(x)
    d <- abs(x$row - 6) + abs(x$col - 6)
    if(d >= N) break
  }
  x$visits
}

N <- 10 A <- new_snail_house (N) </p>

Матрица A может быть визуализирована с помощью geom_tile.

library(ggplot2)

A2 <- reshape2::melt(A)
ggplot(A2, aes(Var1, Var2, fill = value)) +
  geom_tile() +
  scale_fill_gradient2(low = "red", mid = "white",
                      high = "blue", midpoint = 10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...