详解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返回真假值(True or False)小技巧
Apr 10 Python
Django小白教程之Django用户注册与登录
Apr 22 Python
利用python发送和接收邮件
Sep 27 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
基于python实现百度翻译功能
May 09 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 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
php5数字型字符串加解密代码
2008/04/24 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
python的多重继承的理解
2017/08/06 Python
Python tkinter事件高级用法实例
2018/01/31 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
群众路线党课主持词
2014/04/01 职场文书
保险公司演讲稿
2014/09/02 职场文书
2014年个人委托书范本
2014/10/13 职场文书
年底个人总结范文
2015/03/10 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python