<kbd id='woaibaidu'></kbd><address id='woaibaidu'><style id='woaibaidu'></style></address><button id='woaibaidu'></button>

          当前位置:主页 > 脚本专栏 > python >
            详解Python 实现元胞自动机中的生命游戏(Game of life)
            2018-01-29 22:12 发布 次浏览

          简介

          细胞自念头(又称元胞自念头),名字虽然很深奥,可是它的行动却是十分美好的。一切这些怎样完成的呢?我们可以把盘算机中的宇宙想象成是1堆方格子组成的封锁空间,尺寸为N的空间就有NN个格子。而每个格子都可以看成是1个生命体,每一个生命都有生和死两种形态,假如该格子生就显示蓝色,死则显示白色。每个格子旁边都有邻人格子存在,假如我们把33的9个格子组成的正方形看成1个根本单元的话,那末这个正方形中心的格子的邻人就是它旁边的8个格子。

          每一个格子的生死遵照上面的准绳:

          1. 假如1个细胞四周有3个细胞为生(1个细胞四周共有8个细胞),则该细胞为生(即该细胞若本来为死,则转为生,若本来为生,则坚持稳定) 。

          2. 假如1个细胞四周有2个细胞为生,则该细胞的生死形态坚持稳定;

          3. 在其它状况下,该细胞为死(即该细胞若本来为生,则转为死,若本来为死,则坚持稳定)

          设定图象中每一个像素的初始形态后根据上述的游戏规则归纳生命的变化,由于初始形态和迭代次数差别,将会失掉使人叹服的优美图案。

          代码

          """
          元胞自念头 Python 完成
          """
          import numpy as np
          import matplotlib.pyplot as plt
          
          
          class GameOfLife(object):
          
            def __init__(self, cells_shape):
              """
              Parameters
              ----------
              cells_shape : 1个元组,表现画布的巨细。
          
              Examples
              --------
              树立1个高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:⑴] = 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):
              """更新1次形态"""
              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⑴:i+2, j⑴:j+2].reshape((⑴, ))
                  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)
          

          效果图

          以上就是本文的全部内容,希望对各人的学习有所协助,也希望各人多多支持聚合网。