python实现元胞自动机

article/2025/10/12 20:17:56

        这是刚学习写代码时完成的,因此很多地方编写的可能不太美观,但运行起来没有问题,先发出来,之后有精力了在修改美化。

该元胞自动机的功能:

1.初始化按一定概率在各个位置生成元胞。

2.迭代,每次迭代元胞八个方向若没有一个以上存活的元胞数量,则该元胞死亡;若一个空格子周围有三个及三个以上元胞存活,则该空格子出长出新元胞。

3.不断迭代,直到所有元胞存活状态不再改变(或所有元胞全部死亡)。

放几张运行时截图

 

 

 代码如下:

import os
from random import random
import numpy as np
import copy#系统指定生命空间的大小,也即:6行;6列
width=6
hight=6###辅助函数1 初始化生命空间
def init(life_prob):#(life_prob=0.2):life=[]for i in range(hight):life.append([])for j in range(width):if random()<=life_prob:life[i].append('*')else:life[i].append(" ")return np.array(life)"""初始化游戏,以life_prob的概率生成活细胞输入:life_prob——生成活细胞的概率输出:width x height大小的细胞状态"""   ###辅助函数2 打印细胞状态
def print_screen(screen):""" screen 参数类型与init()函数返回值类型一致,表示当前细胞状态。由于屏幕打印时行距比字符宽度大很多,所以请在打印每个字符后面加空格,并在最后一个字符的后面打印'|'表示生命空间的边界(注意:表示生命空间边界的符号可以换成你们喜欢的符号,不局限于'|')"""for i in screen:for j in i:print(j,end="   ")print('|\n')###辅助函数3 计算相邻细胞中活细胞的数目
def get_near_by_cells_count(screen, i, j):"""get_near_by_cells_count()的形参有:screen, i,j;其中screen与init()函数的返回值类型一致,表示当前细胞的状态;i和j均为int类型,表示生命空间各细胞,也即:n*n空间内的格子,所在的行号和列号函数返回值为int类型,表示位置(i,j)的细胞其相邻活细胞的数量"""survival_numbers=[]'''四个角落'''if i==1 and j==1:if screen[0][1]=='*':survival_numbers.append(screen[0][1])if screen[1][1]=='*':survival_numbers.append(screen[1][1])if screen[1][0]=='*':survival_numbers.append(screen[1][0])nums=len(survival_numbers)elif i==1 and j==width:if screen[0][width-2]=='*':survival_numbers.append(screen[0][width-2])if screen[1][width-1]=='*':survival_numbers.append(screen[1][width-1])if screen[1][width-2]=='*':survival_numbers.append(screen[1][width-2])nums=len(survival_numbers)elif i==hight and j==1:if screen[i-1][1]=='*':survival_numbers.append(screen[i-1][1])if screen[i-2][0]=='*':survival_numbers.append(screen[i-2][0])if screen[i-2][1]=='*':survival_numbers.append(screen[i-2][1])nums=len(survival_numbers)elif i==hight and j==width:if screen[i-1][j-2]=='*':survival_numbers.append(screen[i-1][j-2])if screen[i-2][j-1]=='*':survival_numbers.append(screen[i-2][j-2])if screen[i-2][j-2]=='*':survival_numbers.append(screen[i-2][j-1])nums=len(survival_numbers)# 边框elif (i==1 or i==hight) and 1<j<width:if i==1:a=screen[i][j-2:j+1]c=[screen[i-1][j-2],screen[i-1][j]]else:a=screen[i-2][j-2:j+1]c=[screen[i-1][j-2],screen[i-1][j]]c.extend(a)nums=c.count('*')elif 1<i<hight and (j==1 or j==width):if j==1:c=[screen[i][j-1],screen[i-2][j-1],screen[i-2][j],screen[i-1][j],screen[i][j]]else:c=[screen[i][j-1],screen[i-2][j-1],screen[i-2][j-2],screen[i-1][j-2],screen[i][j-2]]
# 中间     nums=c.count('*')elif 1<i<hight and 1<j<width:c=[screen[i][j],screen[i][j-1],screen[i][j-2],screen[i-1][j],screen[i-1][j-2],screen[i-2][j],screen[i-2][j-1],screen[i-2][j-2]]nums=c.count('*')return nums###辅助函数4 更新细胞的状态
def update(screen):"""该函数包含一个参数,screen,其类型与init()函数返回值类型一致,表示当前细胞状态。该函数根据传入生命空间screen内细胞的状态,利用更新原则对细胞状态进行更新,并返回更新后的细胞状态,返回值类型与screen类型一致"""new_screen=copy.copy(screen)for i in range(hight):for j in range(width):if get_near_by_cells_count(screen, i+1, j+1)==3:new_screen[i][j]='*'elif get_near_by_cells_count(screen, i+1, j+1)==2:passelse:new_screen[i][j]=' 'return new_screen###辅助函数5,判断细胞状态是否没有变化def is_state_same(screen, new_screen):"""参数screen和new_screen分别表示更新前和更新后的细胞状态根据判断更新前后细胞的状态,如果更新前细胞(i,j)的状态与更新后细胞(i,j)的状态一致,则返回True;否则返回False"""for i in range(hight):for j in range(width):if new_screen[i][j]==screen[i][j]:passelse:return Falsereturn True###辅助函数6,循环更新细胞直至细胞生命状态不变,实现人机互动
def _main(screen, new_screen,cycle_index):   while not is_state_same(screen, new_screen):#实现人机互动,如果按q键则结束游戏;如果按其他键则继续游戏print('按下任意键继续,q键结束')_input_nums=input()print('\n')if _input_nums=='q':return 'game over'#打印每次更新后的细胞状态for i in new_screen:for j in i:print(j,end='   ')print('|\n')print('细胞更新前后生命状态不同')print('更新了',cycle_index,'次')#更新细胞screen=update(screen)new_screen=update(screen)#判断细胞更新前后生命状态是否相同 若相同游戏结束if is_state_same(screen, new_screen)==True:print('按下任意键继续,q键结束')_input_nums=input()print('\n')if _input_nums=='q':return 'game over'for i in new_screen:for j in i:print(j,end='   ')print('|\n')print('细胞更新状态前后无变化')print('更新了',cycle_index+1,'次')return 'game over'cycle_index=cycle_index+1#####以下为主程序,主要实现游戏实现与人机互动
def start():"""(1)游戏开始后,用户输入活细胞的概率:life_prob的值,并调用辅助函数1 实现生命空间内细胞状态的随机生成(2)根据辅助函数1生成的细胞状态,调用辅助函数2,将当前细胞的状态进行打印(3)实现人机互动,如果按q键则结束游戏;如果按其他键则继续游戏(4)提示:如果要继续游戏,则需要对细胞生命状态进行更新,也即需要调用辅助函数3;并判断细胞生命状态更新前后差异,如果没有变化则终止游戏"""##以下代码实现了输入任意键游戏开始功能os.system("cls") # 用于清空窗口之前打印的内容print('==== 元胞自动机 ====')print('按下任意键开始游戏...')input()os.system("cls")##请在以下部分实现主程序的上述功能# (1)游戏开始后,用户输入活细胞的概率:life_prob的值,并调用辅助函数1 #实现生命空间内细胞状态的随机生成life_prob=float(input('请输入细胞存活概率:'))screen=init(life_prob)#(2)根据辅助函数1生成的细胞状态,调用辅助函数2,将当前细胞的状态进行打印print_screen(screen)new_screen=update(screen)cycle_index=1_main(screen, new_screen, cycle_index)###以下为主程序的测试代码
if __name__ == "__main__":# 以下为start()函数的测试代码start()


http://chatgpt.dhexx.cn/article/xOY6Ai9m.shtml

相关文章

元胞自动机基本概念

目录 前言 一、元胞自动机的概述 二、元胞自动机的构成 1.元胞 2.元胞空间 3.元胞邻居 4.元胞规则 总结 前言 元胞自动机的寒假学习笔记&#xff0c;这里只是一些基本的概念&#xff0c;后面一篇文章会详细、具体地去介绍基于MATLAB元胞自动机的代码实现。&#xff08…

元胞自动机简单理解

元胞自动机 元胞自动机&#xff08; Cellular Automata&#xff09; 是 20 世纪 50 年代初由计算机之父冯诺依曼为了模拟生命系统所具有的自复制功能而提出来的网格动力学模型。 概念 元胞自动机采用离散的空间布局和离散的时间间隔&#xff0c;将元胞分成有限种状态&#x…

matlab元胞自动机入门详解

元胞自动机的初步理解 对元胞自动机的初步认识 元胞自动机&#xff08;CA&#xff09;是一种用来仿真局部规则和局部联系的方法。典型的元 胞自动机是定义在网格上的&#xff0c;每一个点上的网格代表一个元胞与一种有限的状 态。变化规则适用于每一个元胞并且同时进行。元胞的…

元胞自动机-附代码注释

元胞自动机&#xff08;Cellular Automata CA&#xff09;是一种时空离散的局部动力学模型&#xff0c;是研究复杂系统的一种典型方法&#xff0c;适用于空间复杂系统的时空动态模拟研究。 元胞自动机不是由严格定义的物理方程或函数确定&#xff0c;而是用一系列模型构造的规则…

元胞自动机简介

摘要&#xff1a; 元胞自动机能利用简单的局部规则和离散方法描述复杂的全局的连续系统&#xff0c;已成为探索复杂系统的一种有效工具。文章 阐述了元胞自动机的发展历程、结构、特征及基本理论与方珐&#xff1b;介绍了元胞自动机在寡头垄断行为、交通管理及工程运输、城市…

数模笔记14-元胞自动机

元胞自动机模型 元胞自动机理论 元胞自动机&#xff08;Cellular Automata&#xff0c;CA&#xff09;是一种时空离散的局部动力学模型&#xff0c;是研究复杂系统的一种典型方法&#xff0c;特别适合用于空间复杂系统的时空动态模拟研究。 元胞自动机不是由严格定义的物理方程…

【数学建模】元胞自动机

前些天发现一个通俗易懂&#xff0c;风趣幽默的人工智能学习网站&#xff1a; 传送门 A 简介 1 历史 最初的元胞自动机是由冯 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 何顿 康威设计了一个电脑游戏 “生…

关于元胞自动机

元胞自动机(cellular automata&#xff0c;CA) 是一种时间、空间、状态都离散&#xff0c;空间相互作用和时间因果关系为局部的网格动力学模型&#xff0c;具有模拟复杂系统时空演化过程的能力。 其实在去年暑假准备国赛的时候试图过自学&#xff0c;但受限于&#xff0c;网上…

元胞自动机(数学建模)

一.元胞自动机的概念 元胞自动机(cellular automata&#xff0c;CA) 是一种时间、空间、状态都离散&#xff0c;空间相互作用和时间因果关系为局部的网格动力学模型&#xff0c;具有模拟复杂系统时空演化过程的能力。 元胞自动机是用一系列模型构造的规则构成&#xff0c;只要满…

元胞自动机

一个一个的格子看做是一个个的元胞&#xff0c;他们按照自己的规则自动进行状态改变就是元胞自动机。 定义&#xff1a;是一种时间、空间、状态都离散&#xff0c;空间相互作用和时间因果关系为局部的网格动力学模型&#xff0c;具有模拟复杂系统时空演化过程的能力。 元胞自…

元胞自动机简介(美赛复习一)

为美赛准备&#xff0c;进行元胞自动机的简单回顾。 本文只是简单回顾&#xff0c;可能会进行相关论文复现。 文章目录 一、简介 1.元胞2.元胞空间3.元胞邻居4.边界条件5.规则二、简单例子 一、简介 元胞自动机&#xff1a;是一种时间、空间、状态都离散&#xff0c;空间相互…

【数学建模】元胞自动机(CA)详解 + Matlab代码实现

文章目录 一、什么是元胞自动机&#xff1f;二、图解元胞自动机&#xff1a;三、案例Matlab代码实现&#xff1a;1.奇偶规则2.生命游戏3.森林火灾 一、什么是元胞自动机&#xff1f; 元胞自动机(cellular automata&#xff0c;CA) 是一种时间、空间、状态都离散&#xff0c;空…

迁移学习在金融行业的应用探索

摘要&#xff1a;通过迁移学习技术&#xff0c;解决少量数据&#xff08;较少重叠样本和特征&#xff09;和个性化&#xff08;较少标记&#xff09;的问题&#xff0c;从数据丰富的领域迁移到数据匮乏的领域。通过迁移学习在保证模型准确率的同时&#xff0c;也提高了建造模型…

pytorch之迁移学习

文章目录 1.导入相关的包2.加载数据3.可视化部分图像数据4.训练模型5.可视化模型的预测结果6.场景1&#xff1a;微调ConvNet7.场景2&#xff1a;ConvNet作为固定特征提取器 实际中&#xff0c;基本没有人会从零开始&#xff08;随机初始化&#xff09;训练一个完整的卷积网络&a…

翻译: Transfer learning 迁移学习指南

这是您需要了解的有关经典迁移学习和深度迁移学习的所有信息。阅读本指南可改进您的模型训练并在更短的时间内获得更好的性能。 1. 背景 事情是这样的—— 至少可以说&#xff0c;在处理一项全新的任务时收集大量数据可能具有挑战性。 然而- 仅使用有限数量的训练数据获得…

迁移学习方法学习

目录 迁移学习的基础知识迁移学习的概念迁移学习的分类按目标域标签分按学习方法分按特征分类按离线与在线形式分 迁移学习的基本方法基于样本的迁移基于特征的迁移基于模型的迁移基于关系的迁移 深度迁移学习深度网络的可迁移性最简单的迁移学习——finetune finetune的使用技…

迁移学习实例

上一篇我们介绍了迁移学习的核心思想和流程&#xff0c;我们介绍一个实例来加深理解。 传送门&#xff1a;迁移学习概述 获取预训练模型 pytorch和tensorflow都封装了很多预训练模型。 pytorch通过工具包torchvision.models模块获取&#xff0c;主要包括AlexNet、VGG系列、 Res…

迁移学习与微调的区别

一、迁移学习&#xff1a; 1、从字面意义上理解是知识转移的学习方法&#xff0c;指一种学习方法&#xff1b;类比机器学习、深度学习等等概念&#xff1b; 2、把已训练好的模型参数迁移到新的模型来帮助新模型训练二、微调&#xff1a; 1、从字面意义上理解是小小的调整&…

迁移学习---举一反三

1.概念 迁移学习是指充分考虑数据、任务、或者模型的相似性&#xff0c;将在旧领域学习到的模型&#xff0c;应用到新的领域的一种学习过程。 通俗的讲就是把已经学习训练好的模型参数迁移到新的模型进行训练。考虑到大部分数据或任务是存在相关性的&#xff0c;所以通过迁移…

迁移学习基础

人类具有跨任务传输知识的固有能力。我们在学习一项任务的过程中获得的知识&#xff0c;可以用来解决相关的任务。任务相关程度越高&#xff0c;我们就越容易迁移或交叉利用知识。到目前为止所讨论的机器学习和深度学习算法&#xff0c;通常都是被设计用于单独运作的。这些算法…