Python实现元胞自动机(生命游戏)

Python实现元胞自动机(生命游戏)

Python 3.7.1

康威生命游戏(英语:Conway’s Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。

它最初于1970年10月在《科学美国人》杂志上马丁·葛登能的“数学游戏”专栏出现。

概述

生命游戏是一个零玩家游戏。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。实际中,玩家可以设定周围活细胞的数目怎样时才适宜该细胞的生存。如果这个数目设定过高,世界中的大部分细胞会因为找不到太多的活的邻居而死去,直到整个世界都没有生命;如果这个数目设定过低,世界中又会被生命充满而没有什么变化。

例:
(图片来自维基百科条目:生命游戏)
在这里插入图片描述

Python代码实现

  1. 引入所需库
import numpy as np
import random
import copy
import matplotlib.pyplot as plt
  1. 设定元胞生长棋盘的大小
length = 100
width = 200
  1. 根据棋盘的长宽创建矩阵
cell = np.zeros((length,width),int)
cell_temp = copy.deepcopy(cell)
  1. 初始化矩阵为一个随机的0-1矩阵,1代表细胞生存,0代表细胞死亡
for i in range(0,length):
    for j in range(0,width):
        cell_temp[i][j] = random.randint(0,1)
  1. 进行下一次生存状态的判断

    1. 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
    2. 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。
    3. 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
    4. 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)
#当所有细胞状态不变时结束
#可能存在棋盘一直周期性变化,此时如果需要结束可手动结束
while not(cell_temp==cell).all():
    #通过读取cell矩阵,不断判断每一个单元格是存活还是死亡,将判断结果保存在cell_temp中,最终再复制给cell矩阵
    cell = copy.deepcopy(cell_temp)
    #显示每一轮的图像
    plt.imshow(cell)
    plt.pause(0.2)
    #两重循环遍历整个矩阵,判断每个细胞下一个状态是生存还是死亡
    for i in range(0,length):
        for j in range(0,width):
            '''
            count保存一个细胞周围8个方格内有几个存活的细胞,注意这两将上下边界和左右边界连接起来进行判断,
            如对于8*8的棋盘,[0,0]与[0,7]和[7,0]在逻辑上相邻
            '''
            count = cell[(i-1)%length][j] + cell[(i+1)%length][j] + cell[i][(j-1)%width] + cell[i][(j+1)%width] + cell[(i+1)%length][(j+1)%width] + cell[(i-1)%length][(j+1)%width] + cell[(i+1)%length][(j-1)%width] + cell[(i-1)%length][(j-1)%width]
            #如果一个单元格是死亡,且周围是三个单元格则存活,否则保持死亡
            if(cell[i][j] == 0 and count != 3):
                continue
            if(cell[i][j] == 0 and count == 3):
                cell_temp[i][j] = 1
                continue
            #如果一个存活的单元格周围有2或3个单元格存活则该单元格继续存活,否则死亡
            if(count == 2 or count ==3):
                continue
            cell_temp[i][j] = 0

运行结果示例

棋盘 40*80
在这里插入图片描述

  • 43
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
元胞自动机(Cellular Automaton,CA)是一种离散的、自动的计算模型,由一个规则网格(grid)组成,每个网格单元被称为细胞(cell),且每个细胞都有一定的状态。在元胞自动机中,时间是离散的,系统的演化是通过在每个时间步骤中,根据一定的规则更新每个细胞的状态来实现的。Python提供了丰富的库和工具,可以用来实现元胞自动机的模拟和可视化。 以下是一个简单的Python代码示例,用于实现基本的元胞自动机模拟: ```python import numpy as np import matplotlib.pyplot as plt # 设置元胞自动机的规模和初始状态 grid_size = 100 # 网格大小 num_steps = 100 # 模拟步数 initial_state = np.random.randint(2, size=(grid_size, grid_size)) # 随机生成初始状态 # 定义元胞自动机的演化规则函数 def evolve(grid): new_grid = np.zeros_like(grid) for i in range(grid_size): for j in range(grid_size): # 根据邻居细胞的状态更新当前细胞的状态,这里使用了经典的Game of Life规则 live_neighbors = np.sum(grid[max(0, i - 1):min(i + 2, grid_size), max(0, j - 1):min(j + 2, grid_size)]) - grid[i, j] if grid[i, j] == 1: if live_neighbors in [2, 3]: new_grid[i, j] = 1 else: if live_neighbors == 3: new_grid[i, j] = 1 return new_grid # 模拟元胞自动机的演化过程 state = initial_state for step in range(num_steps): plt.imshow(state, cmap='binary') plt.title(f'Step {step + 1}') plt.show() state = evolve(state) ``` 上述代码使用了NumPy库来处理网格的状态和更新操作,并使用了Matplotlib库来可视化模拟的过程。其中,演化规则函数`evolve()`实现了经典的Game of Life规则,根据细胞周围邻居的状态来更新当前细胞的状态。在模拟过程中,每个时间步骤都会将当前状态绘制出来,最终形成一个动画效果。 通过修改演化规则函数和初始状态,你可以实现各种不同的元胞自动机模拟。希望这能帮助到你!如果有任何进一步的问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值