发布时间:2025-12-09 16:46:43 浏览次数:4
元胞自动机( Cellular Automata) 是 20 世纪 50 年代初由计算机之父冯·诺依曼为了模拟生命系统所具有的自复制功能而提出来的网格动力学模型。
元胞自动机采用离散的空间布局和离散的时间间隔,将元胞分成有限种状态,元胞个体状态的演变仅与其当前状态以及其某个局部邻域的状态有关。
⑴ 平稳型:自任何初始状态开始,经过一定时间运行后,元胞空间趋于一个空间平稳的构形,这里空间平稳即指每一个元胞处于固定状态。不随时间变化而变化。
⑵ 周期型:经过一定时间运行后,元胞空间趋于一系列简单的固定结构(Stable Patterns)或周期结构(Perlodical Patterns)。由于这些结构可看作是一种滤波器(Filter),故可应用到图像处理的研究中。
⑶ 混沌型:自任何初始状态开始,经过一定时间运行后,元胞自动机表现出混沌的非周期行为,所生成的结构的统计特征不再变止,通常表现为分形分维特征。
⑷ 复杂型:出现复杂的局部结构,或者说是局部的混沌,其中有些会不断地传播。
| 三角形 | 拥有相对较少的邻居数目,易于处理复杂边界 | 在计算机的表达与显示不方便,需要转换为四方网格 |
| 正方形 | 直观简单,而且适合于在现有计算机环境下进行表达显示 | 不能较好地模拟各向同性的现象 |
| 正六边形 | 能够较好地模拟各向同性的现象,因此,模型更更加自然而真实 | 在表达显示上较为困难、复杂 |
元胞空间的边界条件
理论上,元胞空间是无限的,实际应用中无法达到这一理想条件。常用的边界条件有以下几种:周期型、定值型、绝热型、反射型
周期型边界条件(Periodic Boundary)
是指相对边界连接起来的元胞空间,对于一维空间,首尾相接形成一个圆环;
对于二维空间,上下相接、左右相接,形成一个拓扑圆环面,形似车胎
定值型边界条件(Constant Boundary)
所有边界外元胞均取某一固定常量
绝热型边界条件(Adiabatic Boundary)
在指边界外邻居元胞的状态始终和边界元胞的状态保持一致,即具有状态的零梯度。
反射型边界条件(Constant Boundary)
在边界外邻居的元胞状态是以边界元胞为轴的镜面反射
肿瘤细胞的增长机理和过程模拟
人类大脑的机理探索
艾滋病病毒HIV的感染过程
自组织、自繁殖等生命现象的研究
克隆技术
模拟植物的生长
贝壳上色素的沉积图案
生态学领域
生态系统动态变化过程的模拟
蚂蚁的行走路线,大雁、鱼类洄游动物的群体行为的模拟
生物群落的扩散模拟
物理学模拟
LGA 格子气自动机
LBM格子-玻尔兹曼法
流体领域,在多孔介质、多相流、微小尺寸具有独特的优越性
LBM同样被成功用于磁场、电场、热扩散、热传导的模拟
雪花等枝晶的形成
液态金属材料的凝固结晶过程
颗粒材料的垮塌现象
交通科学领域
两条主线:
1)Nagel-Schreckenberg模型
对城市道路交通流的研究
2)BML模型
对城市交通网络的研究
计算机科学与信息学领域
研究信息的保存、传递、扩散
图像处理和模式识别
NaSch模型是对184号模型的推广,1992年Nagle和Schreckenberg提出了著名的NaSch模型
选取的元胞状态只有两种,分别为 0 和 1。每一层由 64 个元胞组成,若元胞状态为 1,那么控制台将打印星号(*);如果元胞状态为 0,那么控制台将打印连字符(-)。也就是说,每一行由 64 个混合星号与连字符的图案组成。
状态更新规则:若当前元胞的前一个元胞的状态为 1,或者前一个元胞的左右两边的元胞的状态有且只有一个值为 1, 那么该元胞的状态就为 1。反之,元胞的状态设为 0。对于第一列和最后一列,我们只需分别考虑右元胞和左元胞即可。对于中间部分的元胞来说,若其领域元胞的状态为[0,1,0]、[0,0,1]、[1,0,0]、[1,1,0]等状态时,当前元胞的状态就为 1。
import timedef print_seq(seq, speed=0.5):for item in seq:if item:print('*', end='')else:print('-', end='')print('')time.sleep(speed)class Cell:def __init__(self, deepth=31):self.ca = [0 if i != 31 else 1 for i in range(64)]self.ca_new = []self.deepth = deepthdef process(self):print_seq(self.ca)for i in range(self.deepth):self._rule()print_seq(self.ca_new)self.ca = self.ca_newself.ca_new = []def _rule(self):for i in range(64):if 0 < i < 63:if self.ca[i - 1] == self.ca[i + 1]:self.ca_new.append(0)else:self.ca_new.append(1)elif i == 0:if self.ca[1]:self.ca_new.append(1)else:self.ca_new.append(0)else:if self.ca[62]:self.ca_new.append(1)else:self.ca_new.append(0)def main():cell = Cell()cell.process()if __name__ == '__main__':main()参考文章: