Python 元胞自動機模擬 生命遊戲

2022-06-29 10:24:16 字數 2791 閱讀 8903

簡介

元胞自動機(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 實現

"""import

numpy as np

import

matplotlib.pyplot as plt

class

gameoflife(object):

def__init__

(self, cells_shape):

"""parameters

----------

cells_shape : 乙個元組,表示畫布的大小。

examples

--------

建立乙個高20,寬30的畫布

game = gameoflife((20, 30))

"""#

矩陣的四周不參與運算

self.cells =np.zeros(cells_shape)

real_width = cells_shape[0] - 2real_height = cells_shape[1] - 2self.cells[1:-1, 1:-1] = np.random.randint(2, size=(real_width, real_height))

self.timer =0

self.mask = np.ones(9)

self.mask[4] =0

defupdate_state(self):

"""更新一次狀態

"""buf =np.zeros(self.cells.shape)

cells =self.cells

for i in range(1, cells.shape[0] - 1):

for j in range(1, cells.shape[0] - 1):

#計算該細胞周圍的存活細胞數

neighbor = cells[i-1:i+2, j-1:j+2].reshape((-1, ))

neighbor_num = np.convolve(self.mask, neighbor, '

valid

')[0]

if neighbor_num == 3:

buf[i, j] = 1

elif neighbor_num == 2:

buf[i, j] =cells[i, j]

else

: buf[i, j] =0

self.cells =buf

self.timer += 1

defplot_state(self):

"""畫出當前的狀態

"""plt.title(

'iter :{}

'.format(self.timer))

plt.imshow(self.cells)

plt.show()

defupdate_and_plot(self, n_iter):

"""更新狀態並畫圖

parameters

----------

n_iter : 更新的輪數

元胞自動機

即生命遊戲,今天下午迅雷的筆試程式設計題。簡單的版本,給定當前的狀態,給出下乙個時刻的狀態。status函式獲取某點當時周圍的活的細胞數量,寫的比較渣 include include include using namespace std define max 10010 int status ve...

元胞自動機

這 幾個關於元胞自動機的問題 元胞自動機 森林火災模型 規則 1 正在燃燒的樹變成空格位 2 如果綠樹格位的最近鄰居中有乙個樹在燃燒,則它變成正在燃燒的樹 3 在空格位,樹以概率p生長 4 在最近的鄰居中沒有正在燃燒的樹的情況下樹在每一時步以概率f 閃 電 變為正在燃燒的樹。參考文獻 祝玉學,趙學龍...

元胞自動機

元胞自動機 ca 是一種用來 區域性規則和區域性聯絡的方法。典型的元胞自動機是定義在網格上的,每乙個點上的網格代表乙個元胞與一種有限的狀態。變化規則適用於每乙個元胞並且同時進行。典型的變化規則,決定於元胞的狀態,以及其 4 或 8 鄰居的狀態。森林火災元胞自動機模型 一片森林由於自然或人為原因,有一...