详解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的Django框架中的项目进行单元测试的方法
Apr 11 Python
利用python获取Ping结果示例代码
Jul 06 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
python traceback捕获并打印异常的方法
Aug 31 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
Pytorch之Variable的用法
Dec 31 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
给ubuntu18安装python3.7的详细教程
Jun 08 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
php中的时间处理
2006/10/09 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
DEFER怎么用?
2006/07/01 Javascript
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
Vuex简单入门
2017/04/19 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
python Timer 类使用介绍
2020/12/28 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
员工工作表扬信范文
2014/01/13 职场文书
临床医学专业求职信
2014/08/08 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
人民币使用说明书
2019/04/17 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python