繁体   English   中英

我如何在 R 中处理和解决这个蜗牛冒险编程问题

[英]How do I approach and solve this snail adventure programming problem in R

我对编程很陌生,我正在尝试用 R 解决这个问题。

一只蜗牛住在坐标 [6,6] 处的 11 x 11 矩阵的中心,他想从他的房子走 N 个空间。 他只能在他当前所在的方格附近移动(向左、向右、向上和向下),如果他在矩阵的边界处,则他会停在当前所在的位置。 使用runif()函数返回一个矩阵,其中包含蜗牛在冒险期间在每个方格中被发现的次数。

作为输入,该函数看起来像这样: new_snail_house(N)

关于从哪里开始的任何帮助都会很有用,我大致知道如何移动蜗牛的规则:

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

我不知道如何使用它以及如何使用runif()函数来获取目击次数。 提前致谢!

以下函数执行问题所要求的操作。 肯定有更简单的方法。

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)

矩阵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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM