Numpy模拟生命

模拟生命

模拟生命类似一个小游戏,可以假设有很多个小生命,或小细胞,可生可灭,具体k看这个细胞邻居的多少,规则如下,更多参见

The universe of the Game of Life is an infinite two-dimensional orthogonal grid of square cells, each of which is in one of two possible states, live or dead. Every cell interacts with its eight neighbours, which are the cells that are directly horizontally, vertically, or diagonally adjacent. At each step in time, the following transitions occur:

  • Any live cell with fewer than two live neighbours dies, as if by needs caused by underpopulation.
  • Any live cell with more than three live neighbours dies, as if by overcrowding.
  • Any live cell with two or three live neighbours lives, unchanged, to the next generation.
  • Any dead cell with exactly three live neighbours becomes a live cell.

The initial pattern constitutes the 'seed' of the system. The first generation is created by applying the above rules simultaneously to every cell in the seed – births and deaths happen simultaneously, and the discrete moment at which this happens is sometimes called a tick. (In other words, each generation is a pure function of the one before.) The rules continue to be applied repeatedly to create further generations.

目标就是根据这些规则,确定经过若干次演变后,生命的形态,哪些细胞生,哪些细胞灭。例如:

Z = np.array([[0,0,0,0,0,0],
              [0,0,0,1,0,0],
              [0,1,0,1,0,0],
              [0,0,1,1,0,0],
              [0,0,0,0,0,0],
              [0,0,0,0,0,0]])

演变后就是

array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])

算法的关键是确定每个细胞的邻居多少,以决定生死,且假定边界均死,用0表示。

def evolve(Z):
    N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +
         Z[1:-1,0:-2]                + Z[1:-1,2:] +
         Z[2:  ,0:-2] + Z[2:  ,1:-1] + Z[2:  ,2:])
    # Apply rules
    birth = (N==3) & (Z[1:-1,1:-1]==0) #若本来死,且邻居为3,则复活
    survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1) # 若本来活,且邻居为2 or 3,则幸存
    Z[...] = 0 # 重置为0
    Z[1:-1,1:-1][birth | survive] = 1 # 复活或幸存的置为1
    return Z
Z = np.random.randint(0,2,(256,512))
for i in range(100): evolve(Z)
# plot
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
plt.imshow(Z,interpolation='nearest', cmap=plt.cm.hot)
plt.xticks([]), plt.yticks([])
plt.show()

Life

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏思影科技

失匹配负波可以预测临床精神病高风险人群的预后改善

研究表明,失匹配负波(MMN)幅度或可作为生物标记,用于预测临床精神病高风险人群的预后状况。其中,高风险--症状未缓解的被试MMN幅度显著偏低。该文由韩国首尔国...

3385
来自专栏深度学习入门与实践

【深度学习系列】用PaddlePaddle进行车牌识别(一)

小伙伴们,终于到了实战部分了!今天给大家带来的项目是用PaddlePaddle进行车牌识别。车牌识别其实属于比较常见的图像识别的项目了,目前也属于比较成熟的应...

52110
来自专栏上善若水

054Android操作系统11种传感器介绍

Android操作系统11种传感器介绍 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用。

954
来自专栏生信宝典

癌症组织特异性基因怎么找?这是个不错的开始

组织特异性基因(Tissue-specific Genes)是指在不同类型的细胞中特异性表达的基因,其调节细胞特异的形态结构或生理功能。组织特异性基因的表达是理...

1002
来自专栏量子位

OpenAI强化学习游戏库大更新:游戏上千款,还能自己加

想把一个强化学习Agent训练成游戏高手?OpenAI今天推出的完整版Gym Retro必须了解一下。

1205
来自专栏Y大宽

Cytoscape插件5:DisGeNET(2)应用实例

广泛的定义为“对于一个给定的基因集来说,哪些基因和某疾病相关?” 哮喘病是一个严重的慢性疾病,有时会威胁生命,这种病肺部发生病变。哮喘的病因很复杂包括遗传和环...

1253
来自专栏PPV课数据科学社区

当禅师遇到一位理科生,后来禅师疯了!!知识无极限!!

老禅师忙着给各种年轻人指导人生,总是用一些模凌两可的语句,想着想着你自己似乎就想透了。但当满口心灵鸡汤的老禅师遇上理科生……于是有了下面的对话↓↓↓ 1、青...

3373
来自专栏新智元

【44.99美元】谷歌推出树莓派计算机视觉盒子,自己动手组装深度学习套件

来源:blog.google 编译:弗格森 【新智元导读】 谷歌为树莓派制作了一个具有设备上的神经网络加速功能的套件,在没有云连接的情况下提供强大的计算机视觉能...

38312
来自专栏Python中文社区

Python教你找到最心仪的对象

專 欄 ❈ Toby,Python中文社区专栏作者,目前供职于国内最大的医药大数据平台,任数据分析组长。关注自然语言处理,英文密码学,医药统计学。 博客: h...

1859
来自专栏数据结构与算法

洛谷P2762 太空飞行计划问题(最大权闭合图)

754

扫码关注云+社区