详解Python 实现元胞自动机中的生命游戏(Game of life)


Posted in Python onJanuary 27, 2018

简介

细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有NN个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把33的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。

每个格子的生死遵循下面的原则:

1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。

2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;

3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)

设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。

代码

"""
元胞自动机 Python 实现
"""
import numpy as np
import matplotlib.pyplot as plt


class GameOfLife(object):

  def __init__(self, cells_shape):
    """
    Parameters
    ----------
    cells_shape : 一个元组,表示画布的大小。

    Examples
    --------
    建立一个高20,宽30的画布
    game = GameOfLife((20, 30))
    
    """

    # 矩阵的四周不参与运算
    self.cells = np.zeros(cells_shape)

    real_width = cells_shape[0] - 2
    real_height = cells_shape[1] - 2
    
    self.cells[1:-1, 1:-1] = np.random.randint(2, size=(real_width, real_height))
    self.timer = 0
    self.mask = np.ones(9)
    self.mask[4] = 0
  
  def update_state(self):
    """更新一次状态"""
    buf = np.zeros(self.cells.shape)
    cells = self.cells
    for i in range(1, cells.shape[0] - 1):
      for j in range(1, cells.shape[0] - 1):
        # 计算该细胞周围的存活细胞数
        neighbor = cells[i-1:i+2, j-1:j+2].reshape((-1, ))
        neighbor_num = np.convolve(self.mask, neighbor, 'valid')[0]
        if neighbor_num == 3:
          buf[i, j] = 1
        elif neighbor_num == 2:
          buf[i, j] = cells[i, j]
        else:
          buf[i, j] = 0
    self.cells = buf
    self.timer += 1
  
  def plot_state(self):
    """画出当前的状态"""
    plt.title('Iter :{}'.format(self.timer))
    plt.imshow(self.cells)
    plt.show()

  def update_and_plot(self, n_iter):
    """更新状态并画图
    Parameters
    ----------
    n_iter : 更新的轮数
    """
    plt.ion()
    for _ in range(n_iter):
      plt.title('Iter :{}'.format(self.timer))
      plt.imshow(self.cells)
      self.update_state()
      plt.pause(0.2)
    plt.ioff()
          

if __name__ == '__main__':
  game = GameOfLife(cells_shape=(60, 60))
  game.update_and_plot(200)

效果图

详解Python 实现元胞自动机中的生命游戏(Game of life)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
由Python运算π的值深入Python中科学计算的实现
Apr 17 Python
讲解Python中的标识运算符
May 14 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Python random模块的使用示例
Oct 10 Python
scrapy头部修改的方法详解
Dec 06 Python
Python实现的栈(Stack)
Jan 26 #Python
使用python实现链表操作
Jan 26 #Python
Python中optparser库用法实例详解
Jan 26 #Python
python利用socketserver实现并发套接字功能
Jan 26 #Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 #Python
Python编程实现的简单神经网络算法示例
Jan 26 #Python
Django使用httpresponse返回用户头像实例代码
Jan 26 #Python
You might like
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
十天学会php之第三天
2006/10/09 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
jquery tab标签页的制作
2010/05/10 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
PyMongo安装使用笔记
2015/04/27 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
Python能做什么
2020/06/02 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
给国外客户的邀请函
2014/01/30 职场文书
社区先进事迹材料
2014/05/19 职场文书
化工专业自荐书
2014/06/16 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书