当前位置:天才代写 > tutorial > 其他教程 > 用R实现生命游戏(Game of Life)

用R实现生命游戏(Game of Life)

2017-12-04 08:00 星期一 所属: 其他教程 浏览:557

生命游戏是英国数学家John Horton Conway在1970年发现的细胞自念头(cellular automaton)。它最初于1970年10月在《科学美国人》杂志中呈现。生命游戏是在一个二维矩形世界中,这个世界中的每个方格居住着一个细胞。细胞的生命状态只有在世或灭亡两种。细胞在下一个时刻的存亡取决于相邻八个方格中在世细胞的数量。假如相邻方格在世的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,假如周围活细胞过少,这个细胞会因太孑立而死去。

个中一种较为富厚的设定有如下四条:

  • 若相邻的存活细胞数少于2,则细胞死于寥寂
  • 若相邻的存活细胞数多于3,则细胞死于拥挤
  • 若相邻的存活细胞数为2或3,则细胞继承存活
  • 若相邻的存活细胞数正好为3,灭亡的细胞获得复生

  • 按照这些资料,笔者在R中运行了相应的代码,首先运行1000次的演变进程,记录每个时间点上细胞的总数,按照这些变革的数字可以获得如下的图形。可以看到一开始细胞过多而呈现大量灭亡,在靠近灭尽的时候又由于资源的空闲而大量繁殖,但繁殖存在一个上限,之后存活数目呈上下振荡趋势。



    生命游戏是英国数学家John Horton Conway在1970年发现的细胞自念头(cellular automaton)。它最初于1970年10月在《科学美国人》杂志中呈现。生命游戏是在一个二维矩形世界中,这个世界中的每个方格居住着一个细胞。细胞的生命状态只有在世或灭亡两种。细胞在下一个时刻的存亡取决于相邻八个方格中在世细胞的数量。假如相邻方格在世的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,假如周围活细胞过少,这个细胞会因太孑立而死去。

    个中一种较为富厚的设定有如下四条:

  • 若相邻的存活细胞数少于2,则细胞死于寥寂
  • 若相邻的存活细胞数多于3,则细胞死于拥挤
  • 若相邻的存活细胞数为2或3,则细胞继承存活
  • 若相邻的存活细胞数正好为3,灭亡的细胞获得复生

  • 按照这些资料,笔者在R中运行了相应的代码,首先运行1000次的演变进程,记录每个时间点上细胞的总数,按照这些变革的数字可以获得如下的图形。可以看到一开始细胞过多而呈现大量灭亡,在靠近灭尽的时候又由于资源的空闲而大量繁殖,但繁殖存在一个上限,之后存活数目呈上下振荡趋势。



    注:本文参考了wiki,以及《Introduction to Scientific Programming and Simulation Using R》第五章的习题。

    R代码:

    rm(list=ls())
    #成立一个计较相近存活细胞数目标函数,并使边沿的细胞仍有八个邻人
    neighbours <- function(A,i,j,n) {
    left <- ifelse(j == 1,n,j-1)
    right <- ifelse(j == n, 1, j+1)
    up <- ifelse(i == 1, n, i-1)
    down <- ifelse(i == n, 1, i+1)
    nbrs <- sum(A[up,left] == 1,A[up,right] == 1,A[up,j] == 1,A[i,left] == 1, A[i,right] == 1,A[down,left] == 1,A[down,right] == 1,A[down,j] == 1)
    return(nbrs)
    }
    n <- 50 #方阵的行数
    A <- matrix(round(runif(n^2)),n,n) #初始化二维世界方阵
    finished <- FALSE
    while (!finished) { #反复举办演化,你需要用ESC退出
    plot(c(1,n),c(1,n),type=’n’,xlab=”,ylab=”) #画图
    for(i in 1:n) {
    for (j in 1:n) {
    if (A[i,j]==1) {
    points(i,j,pch=16,col=’red’)
    }
    }
    }
    B <- A #将上期的信息存入本期矩阵B,并凭据条件修改B
    for (i in 1:n) {
    for (j in 1:n) {
    nbrs <- neighbours(A,i,j,n)
    if (A[i,j]==1) {
    if ((nbrs ==2) | (nbrs==3)){
    B[i,j] <- 1
    } else {
    B[i,j] <- 0
    }
    } else {
    if (nbrs ==3) {
    B[i,j] <- 1
    } else {
    B[i,j] <- 0
    }
    }
    }
    }
    A <- B #将变革后的B矩阵存回到A中
    }
     

      关键字:

    天才代写-代写联系方式