python元胞转list_Python 实现最简单的元胞自动机

简介

元胞自动机(cellular automata) 是离散而抽象的计算系统。元胞自动机在时间和空间上是离散的,最小单位是简单元胞(单元格)。每个元胞会产生有限数量的状态集,后续元胞由其邻域元胞的状态确定。这里所说的领域元胞,是指当前元胞的前一个元胞(记作元胞A)以及元胞A左右两个元胞。也就是说,邻域元胞总共包含三个元胞。给定初始层的状态,基于一定规则,我们可以不断更新下一层元胞的状态。通俗的讲,元胞自动机就是基于一定规则的“繁衍机器”。

最简单的例子

我们在控制台演示元胞自动机程序。

这里,我们选取的元胞状态只有两种,分别为 0 和 1。每一层由 64 个元胞组成,若元胞状态为 1,那么控制台将打印星号(*);如果元胞状态为 0,那么控制台将打印连字符(-)。也就是说,每一行由 64 个混合星号与连字符的图案组成。

那么,我们如何确定每一行的状态呢?

首先,我们要对第一行进行初始化操作。我们设置第 31 个元胞的状态为 1、其余 63 个元胞的状态为 0.

状态更新规则:若当前元胞的前一个元胞的状态为 1,或者前一个元胞的左右两边的元胞的状态有且只有一个值为 1, 那么该元胞的状态就为 1。反之,元胞的状态设为 0。对于第一列和最后一列,我们只需分别考虑右元胞和左元胞即可。对于中间部分的元胞来说,若其领域元胞的状态为[0,1,0]、[0,0,1]、[1,0,0]、[1,1,0]等状态时,当前元胞的状态就为 1。

实现效果如下:

import time

def 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 = deepth

def process(self):

print_seq(self.ca)

for i in range(self.deepth):

self._rule()

print_seq(self.ca_new)

self.ca = self.ca_new

self.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()

更多精彩关注微信公众号:Python高效编程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值