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。

實現效果如下:

Python 實現最簡單的元胞自動機

Python 實現最簡單的元胞自動機

Python高效編程

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

CSDN 博客地址如下:


分享到:


相關文章: