国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Python 實現元胞自動機中的生命游戲(Game of life)

2020-02-22 23:01:29
字體:
來源:轉載
供稿:網友

簡介

細胞自動機(又稱元胞自動機),名字雖然很深奧,但是它的行為卻是非常美妙的。所有這些怎樣實現的呢?我們可以把計算機中的宇宙想象成是一堆方格子構成的封閉空間,尺寸為N的空間就有NN個格子。而每一個格子都可以看成是一個生命體,每個生命都有生和死兩種狀態,如果該格子生就顯示藍色,死則顯示白色。每一個格子旁邊都有鄰居格子存在,如果我們把33的9個格子構成的正方形看成一個基本單位的話,那么這個正方形中心的格子的鄰居就是它旁邊的8個格子。

每個格子的生死遵循下面的原則:

1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變) 。

2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;

3. 在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)

設定圖像中每個像素的初始狀態后依據上述的游戲規則演繹生命的變化,由于初始狀態和迭代次數不同,將會得到令人嘆服的優美圖案。

代碼

"""元胞自動機 Python 實現"""import numpy as npimport matplotlib.pyplot as pltclass 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] - 2    real_height = cells_shape[1] - 2        self.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    def update_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    def plot_state(self):    """畫出當前的狀態"""    plt.title('Iter :{}'.format(self.timer))    plt.imshow(self.cells)    plt.show()  def update_and_plot(self, n_iter):    """更新狀態并畫圖    Parameters    ----------    n_iter : 更新的輪數    """    plt.ion()    for _ in range(n_iter):      plt.title('Iter :{}'.format(self.timer))      plt.imshow(self.cells)      self.update_state()      plt.pause(0.2)    plt.ioff()          if __name__ == '__main__':  game = GameOfLife(cells_shape=(60, 60))  game.update_and_plot(200)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 榆林市| 子洲县| 义乌市| 宜城市| 高台县| 庆城县| 蕲春县| 康保县| 吕梁市| 宁夏| 彰武县| 施秉县| 伊吾县| 曲沃县| 若尔盖县| 巴里| 蒙山县| 南乐县| 通化市| 高平市| 当涂县| 台中县| 德惠市| 右玉县| 当阳市| 贡嘎县| 法库县| 浦东新区| 若尔盖县| 浏阳市| 霍山县| 新丰县| 娄底市| 台山市| 桐乡市| 奇台县| 克东县| 同心县| 同心县| 英吉沙县| 双鸭山市|