详解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入门篇之正则表达式
Oct 20 Python
Python中的urllib模块使用详解
Jul 07 Python
怎样使用Python脚本日志功能
Aug 14 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
python验证码识别教程之滑动验证码
Jun 04 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
Python类成员继承重写的实现
Sep 16 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
php cli配置文件问题分析
2015/10/15 PHP
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python hashlib加密实现代码
2019/10/17 Python
Python命令行click参数用法解析
2019/12/19 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
移动通信专业自荐信范文
2013/11/12 职场文书
高中自我鉴定
2013/12/20 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
法律专业求职信
2014/05/24 职场文书
办公室岗位职责
2015/02/04 职场文书
鲁迅故居导游词
2015/02/05 职场文书
2015年服务员工作总结
2015/04/08 职场文书
给校长的建议书范文
2015/09/14 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
python批量创建变量并赋值操作
2021/06/03 Python
JS实现简单的九宫格抽奖
2022/06/28 Javascript