Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲情侣自拍,欧美高清大胆免费视频,久久综合九色综合97免费下载

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Python 實(shí)現(xiàn)生命游戲

          Python 實(shí)現(xiàn)生命游戲

          者:Pleiades

          來源:http://www.cnblogs.com/pleiades/p/8353713.html

          生命游戲是英國數(shù)學(xué)家約翰·何頓·康威在1970年發(fā)明的細(xì)胞自動(dòng)機(jī)。它包括一個(gè)二維矩形世界,這個(gè)世界中的每個(gè)方格居住著一個(gè)活著的或死了的細(xì)胞。一個(gè)細(xì)胞在下一個(gè)時(shí)刻生死取決于相鄰八個(gè)方格中活著的或死了的細(xì)胞的數(shù)量。如果相鄰方格活著的細(xì)胞數(shù)量過多,這個(gè)細(xì)胞會(huì)因?yàn)橘Y源匱乏而在下一個(gè)時(shí)刻死去;相反,如果周圍活細(xì)胞過少,這個(gè)細(xì)胞會(huì)因太孤單而死去。

          規(guī)則看起來很簡(jiǎn)單,但卻能演繹出無窮無盡的內(nèi)容。

          滑翔者:每4個(gè)回合"它"會(huì)向右下角走一格。雖然細(xì)胞早就是不同的細(xì)胞了,但它能保持原本的形態(tài)。

          輕量級(jí)飛船:它的周期是4,每2個(gè)回合會(huì)向右邊走一格。

          脈沖星:它的周期為3,看起來像一顆周期爆發(fā)的星星。

          更復(fù)雜的圖案。

          來體會(huì)一下這些作品的腦洞以及震撼:

          史詩般的生命游戲http://www.iqiyi.com/w_19rsq435c9.html

          用生命游戲?qū)崿F(xiàn)生命游戲:http://www.bilibili.com/video/av616329/index.html

          生命游戲的規(guī)則其實(shí)很簡(jiǎn)單。我們可以把計(jì)算機(jī)中的宇宙想象成是一堆方格子構(gòu)成的封閉空間,尺寸為N的空間就有NN個(gè)格子。而每一個(gè)格子都可以看成是一個(gè)生命體,每個(gè)生命都有生和死兩種狀態(tài),如果該格子生就顯示藍(lán)色,死則顯示白色。每一個(gè)格子旁邊都有鄰居格子存在,如果我們把33的9個(gè)格子構(gòu)成的正方形看成一個(gè)基本單位的話,那么這個(gè)正方形中心的格子的鄰居就是它旁邊的8個(gè)格子。

          每個(gè)格子的生死遵循下面的原則:

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

          2. 如果一個(gè)細(xì)胞周圍有2個(gè)細(xì)胞為生,則該細(xì)胞的生死狀態(tài)保持不變;

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

          設(shè)定圖像中每個(gè)像素的初始狀態(tài)后依據(jù)上述的游戲規(guī)則演繹生命的變化,由于初始狀態(tài)和迭代次數(shù)不同,將會(huì)得到令人嘆服的優(yōu)美圖案。

          我們用#代表活的細(xì)胞,空格表示死的細(xì)胞,那么我們可以用控制臺(tái)打印字符、清屏來模擬生命游戲。我的代碼在github上:

          https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.py

          游戲世界尺寸為60x20,隨機(jī)生成初始狀態(tài),循環(huán)邊界,按任意鍵進(jìn)入下一幀,q退出。

          單純的看這段程序,好像并沒有什么問題,代碼邏輯正確、清晰。

          效果圖:

          我們來嘗試一些python的高級(jí)特性,比如列表生成式。

          例如,在生成初始值時(shí),我們一般這樣寫:

          1. 1 screen=

          2. 2 width=60

          3. 3 height=20

          4. 4 def Init:

          5. 5 for i in range(height):

          6. 6 line=

          7. 7 for j in range(width):

          8. 8 if random.random > 0.8:

          9. 9 line.append('#')

          10. 10 else:

          11. 11 line.append(' ')

          12. 12 screen.append(line)

          如果用列表生成式,我們可以這樣寫:

          1. 1 def Init:

          2. 2 global screen

          3. 3 screen=[['#' if random.random() > 0.8 else ' ' for i in range(width)] for j in range(height)]

          注意這里必須用global聲明,否則screen將默認(rèn)作為函數(shù)內(nèi)的局部變量。這里用了兩層列表生成式來生成一個(gè)二維數(shù)組。

          列表生成式很好很強(qiáng)大,如果用好能大大提高效率。但會(huì)犧牲一定的可讀性,如果單個(gè)表達(dá)式寫的過于復(fù)雜,那就變成write-only了。尤其是在團(tuán)隊(duì)開發(fā)情況下,可讀性日益重要。

          重寫后的代碼:

          https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.1.py

          如果僅僅是作為練習(xí),這樣就已經(jīng)足夠好了,簡(jiǎn)潔易讀。

          可是我們還不能滿足,我們來給生命插上面向?qū)ο蟮某岚颍谀K化的天空中翱翔。對(duì),就是讓他跟別的模塊搞對(duì)象!

          先來定義一個(gè)類GameOfLifeWorld,之前那些丑陋的全局變量,讓他們統(tǒng)統(tǒng)變成成員變量,再也不能在外興風(fēng)作浪。

          1. class GameOfLifeWorld:

          2. width=100

          3. height=100

          4. cells=

          5. …略

          然后把UI層剝離,只保留游戲的核心邏輯。

          代碼:

          https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLifeWorld.py

          有了上一步的鋪墊,我們終于可以讓Tkinter粉墨登場(chǎng)了。Tkinter是著名的UI庫,Python自帶的Tkinter是一個(gè)精簡(jiǎn)版,不過也夠我們用的了。

          我們這里用到的主要是Canvas,Button控件。Canvas畫布用來繪制游戲區(qū),Button用來交互。

          效果:

          以上就是這樣,項(xiàng)目我還會(huì)繼續(xù)改進(jìn),希望大家喜歡。

          題圖:pexels,CC0 授權(quán)。

          ython 實(shí)現(xiàn)生命游戲

          這次我們使用 Python 來實(shí)現(xiàn)生命游戲,這是一種簡(jiǎn)單的元胞自動(dòng)機(jī)。基于一定規(guī)則,程序可以自動(dòng)從當(dāng)前狀態(tài)推演到下一狀態(tài)。制作的成品如下:

          先來說說生命游戲的規(guī)則:

          在生命游戲中,每個(gè)單元格有兩種狀態(tài),生與死。在我們的實(shí)現(xiàn)中,黃色的單元格代表活著的細(xì)胞,紅色單元格表示死亡的細(xì)胞。而每一個(gè)細(xì)胞的下一狀態(tài),是由該細(xì)胞及周圍的八個(gè)細(xì)胞的當(dāng)前狀態(tài)決定的。

          具體而言:

          當(dāng)前細(xì)胞為活細(xì)胞

          1. 周圍有兩個(gè)或者三個(gè)活細(xì)胞,下一世代,該細(xì)胞仍然活著。
          2. 周圍少于兩個(gè)活細(xì)胞,該細(xì)胞死于孤立。
          3. 周圍多于三個(gè)活細(xì)胞,該細(xì)胞死于擁擠。

          當(dāng)前細(xì)胞為死細(xì)胞

          • 周圍恰好三個(gè)活細(xì)胞,下一世代,活細(xì)胞將繁殖到該單元格。

          所需模塊

          無需安裝的標(biāo)準(zhǔn)庫:

          • argparse(命令行參數(shù))
          • enum(枚舉)

          第三方庫:

          • numpy
          • matplotlib

          導(dǎo)入模塊:

          import argparse
          from enum import IntEnum
          import matplotlib.pyplot as plt
          import matplotlib.animation as animation # 制作動(dòng)圖
          import numpy as np
          

          編程要點(diǎn)

          首先,我們要知道細(xì)胞的生存空間是 N * N 的方陣,每個(gè)細(xì)胞都有兩種狀態(tài):on, off。on 為 255,off 為 0。我們使用 numpy 產(chǎn)生 N * N 的方陣。np.random.choice 是在 State.on 和 State.off ,等概率隨機(jī)抽取一個(gè)元素構(gòu)造 N * N 的方陣。

          class State(IntEnum):
           on=255
           off=0
          ?
          def random_data(length=4, seed=420) -> np.array:
           np.random.seed(seed)
           return np.random.choice([State.off, State.on], size=(length, length), p=[0.5, 0.5])
          

          其次我們要明白如何計(jì)算細(xì)胞周圍活細(xì)胞的個(gè)數(shù),尤其是邊界一圈的細(xì)胞。我們可以采用余數(shù)的方式,假設(shè)棋盤大小為 9 * 9,那么對(duì)于左右邊界而言,左邊界的左邊一個(gè)元素的計(jì)算方式: - 1 % 9=8,自動(dòng)折到右邊界上。將細(xì)胞周圍八個(gè)單元格的數(shù)值加起來,除以 255,就可以得到細(xì)胞周圍活細(xì)胞的個(gè)數(shù)。

          def _count(data, row, col):
           shape=data.shape[0]
           up=(row - 1) % shape
           down=(row + 1) % shape
           right=(col + 1) % shape
           left=(col - 1) % shape
           return (data[up, right] + data[up, left] +
           data[down, right] + data[down, left] +
           data[row, right] + data[row, left] +
           data[up, col] + data[down, col]) // 255
          

          接下來是對(duì)規(guī)則的翻譯,即根據(jù)當(dāng)前世代的狀態(tài),推演出下一世代,細(xì)胞的狀態(tài)。initial 為當(dāng)前世代的矩陣,data為下一世代的矩陣,我們根據(jù) initial 的數(shù)值,計(jì)算出 data 的數(shù)值。total 為周圍活細(xì)胞的個(gè)數(shù),如果當(dāng)前為活細(xì)胞,total 大于三或者小于二,下一世代就會(huì)死去。如果當(dāng)前為死細(xì)胞,total 等于三,下一世代活細(xì)胞就會(huì)繁殖到該單元格上。

          def count(initial, data, row, col):
           total=_count(initial, row, col)
           if initial[row, col]:
           if (total < 2) or (total > 3):
           data[row, col]=State.off
           else:
           if total==3:
           data[row, col]=State.on
          

          接下來是制作動(dòng)圖的過程,前面幾行是繪圖的基本操作。之后,我們使用到了 matplotlib.animation 的方法。其中,F(xiàn)uncAnimation 接受的參數(shù)含義:fig 為圖像句柄,generate 函數(shù)是我們更新每一幀圖像所需數(shù)據(jù)的函數(shù),下面會(huì)有介紹,fargs 為 genrate 函數(shù)的除去第一個(gè)參數(shù)的其他參數(shù),第一個(gè)參數(shù)由 FuncAnimation 指定 framenum(幀數(shù)) 傳給 generate 函數(shù)。frames 是幀數(shù),interval 是更新圖像間隔,save_count 為從幀到緩存的值的數(shù)量。

          如果指定保存路徑(html),則保存為 html 動(dòng)畫。

          def update(data, save_name):
           update_interval=50
           fig, ax=plt.subplots()
           ax.set_xticks([])
           ax.set_yticks([])
           img=ax.imshow(data, cmap='autumn', interpolation='nearest')
           ani=animation.FuncAnimation(fig, generate, fargs=(img, plt, data),
           frames=20,
           interval=update_interval,
           save_count=50)
           if save_name:
           ani.save(save_name, fps=30, extra_args=['-vcodec', 'libx264'])
           plt.show()
          

          下面我們來看 generate 函數(shù),NUM 為當(dāng)?shù)螖?shù),frame_num 接收來自 FuncAnimation 的幀數(shù)。通過嵌套的 for 循環(huán),我們逐個(gè)地更新方陣中各元素的狀態(tài)。

          NUM=0
          ?
          def generate(frame_num, img, plt, initial):
           global NUM
           NUM +=1
           plt.title(f'{NUM} generation')
           data=initial.copy()
           rows, cols=data.shape
           for row in range(rows):
           for col in range(cols):
           count(initial, data, row, col)
           img.set_data(data)
           initial[:]=data[:]
           return img
          

          最后,我們可以通過命令行參數(shù),運(yùn)行我們的程序:

          -- size 參數(shù)為棋盤大小,--seed 為隨機(jī)種子,用于產(chǎn)生不同的隨機(jī)方陣。

          python conway.py --size 50 --seed 18
          

          高斯帕滑翔機(jī)槍(Gosper Glider Gun)

          可將 --gosper 更改為 --glider 滑翔機(jī)。--save 為動(dòng)圖保存的地址。

          python conway.py --size 80 --gosper --save gosper.html
          

          點(diǎn)擊鏈接,回復(fù) 2019527, 獲取源代碼。

          https://mp.weixin.qq.com/s/6ys7zyIV11NX2EVaVtlQIQ

          類是社會(huì)動(dòng)物,而人類的社會(huì)活動(dòng)則既簡(jiǎn)單又復(fù)雜。長(zhǎng)期以來,數(shù)學(xué)家、計(jì)算機(jī)科學(xué)家和社會(huì)學(xué)家們一直試圖用簡(jiǎn)單明了的方式方法去刻畫錯(cuò)綜復(fù)雜的社會(huì)現(xiàn)象,其中“生命游戲”提供了一個(gè)“寓科學(xué)于娛樂”的活動(dòng)框架。

          【一】導(dǎo)引

          讓我們先來玩一個(gè)簡(jiǎn)單的棋子游戲。

          在一個(gè)充分大的圍棋棋盤上,為簡(jiǎn)單起見每個(gè)空格表示已經(jīng)放有一個(gè)白子(而白子就不標(biāo)畫出來了)。如果空格內(nèi)出現(xiàn)一個(gè)黑子,就表示黑子取代了原有的白子。現(xiàn)在,讓黑子表示“生”而白子表示“死”。另外,在棋盤上的任何9個(gè)格子組成的正方形區(qū)域里(見圖1),對(duì)處于中心位置的黑子或白子來說,它上下左右和兩對(duì)角線外的8個(gè)黑子(如果它們存在的話)都稱為是它的鄰居。

          我們的棋子游戲有4條規(guī)則,在整個(gè)過程中每一步都同時(shí)應(yīng)用于棋盤上所有的黑子和白子上。規(guī)則如下:

          (1)如果一個(gè)黑子只有1個(gè)或者沒有黑子鄰居的話,它在下一步就會(huì)死去,如圖1(a) 所示。這操作表示該黑子在社會(huì)里太孤單了,它不能繼續(xù)生存下去。

          (2)如果一個(gè)黑子有2個(gè)或者3個(gè)黑子鄰居的話,它在下一步就繼續(xù)存在,如圖1(b) 的第一步所示。這操作表示該黑子有合適的社會(huì)環(huán)境,它可以繼續(xù)生存下去。

          (3)如果一個(gè)黑子有4個(gè)或者更多黑子鄰居的話,它在下一步也會(huì)死去,如圖1(c) 的中心黑子(為了不影響這一說明,其它黑子和白子同時(shí)發(fā)生的變化暫且不表示出來)。這操作表示該黑子所處的社會(huì)環(huán)境太擁擠了,它不能繼續(xù)生存下去。

          (4)如果一個(gè)白子有恰好3個(gè)黑子鄰居的話,它在下一步就會(huì)變成黑子,如圖1(d) 所示。這操作表示該白子具有良好的社會(huì)環(huán)境,它可以誕生或復(fù)活。

          明白了這幾條簡(jiǎn)單規(guī)則之后,你就可以開始玩這個(gè)棋子游戲了。當(dāng)然,只放少許幾個(gè)黑棋子的話,你可以在書桌上玩一陣子,但棋子數(shù)目稍多,你就得編程在電腦上玩了。

          你很自然會(huì)有一個(gè)感覺,就是開始時(shí)放入多少個(gè)黑子以及怎樣放置它們,這對(duì)于游戲如何一步一步地演變下去會(huì)有決定性的影響。比如圖1(d)中四個(gè)黑子處于穩(wěn)定狀態(tài),它們永遠(yuǎn)都不會(huì)死去,即是“長(zhǎng)生不老”,而其它初始放置方式(圖1(a)、(b)、(c))則會(huì)讓黑子在若干步之內(nèi)全部死光。

          你這個(gè)感覺是對(duì)的:游戲的初始條件(即放入多少個(gè)黑子以及怎樣放置它們)的確很重要,它們會(huì)生成各式各樣的黑子組合斑圖以及許多不同的最終結(jié)果。比如圖1(d) 就生成一個(gè)永遠(yuǎn)不變的斑圖,稱為“靜物”(still life);圖2(a) 則生成周期-2的“振蕩器”(oscillator);圖2(b) 卻生成一種會(huì)移動(dòng)的周期“宇航船”(spaceship)。后面這種情形特別有趣,它在一步一步變化的過程中,起始的5個(gè)黑子不會(huì)減少也不會(huì)增多,但會(huì)頻繁地改變位置,像一艘不斷變形的宇航船一直往右方和下方移動(dòng)。在第四步,它變回到了初始狀態(tài),不過整個(gè)斑圖的位置向右方和下方各移動(dòng)了一格。之后,它繼續(xù)往前移動(dòng),期間斑圖的變化不斷重復(fù)前面的過程。這是一艘移動(dòng)的周期-4振蕩宇航船,稱為“滑翔機(jī)”(glider),它永遠(yuǎn)不停地向右下方滑翔前進(jìn)。你看,這個(gè)滑翔機(jī)會(huì)永遠(yuǎn)無休止地生存并移動(dòng)下去,期間代表“生”和“死”的黑子和白子交替出沒,整個(gè)族群在發(fā)展和演變過程中就像有“生命”一樣,對(duì)吧?

          圖1 游戲4條規(guī)則

          圖2 “振蕩器”和“滑翔機(jī)”例子

          至此,你看到了,這個(gè)棋子游戲的規(guī)則是固定的,但初始條件(黑子的個(gè)數(shù)和位置)可以有許多不同的選擇。因此,容易想象,你能夠嘗試著去生成多種多樣的“最終趨于死亡”、“不同周期振蕩”和“永遠(yuǎn)變化生存”斑圖。由于這個(gè)游戲可以用來描繪一些社會(huì)生命現(xiàn)象,故此設(shè)計(jì)師把它叫做“生命游戲”(Game of Life)。

          上面介紹的這個(gè)趣味橫生的生命游戲簡(jiǎn)單而復(fù)雜,它的設(shè)計(jì)師是數(shù)學(xué)家約翰·康威(John Horton Conway,1937-2020)。關(guān)于康威的生平和貢獻(xiàn),筆者曾有過簡(jiǎn)單介紹[1]。康威在開發(fā)這個(gè)有趣的生命游戲時(shí)是英國劍橋大學(xué)數(shù)學(xué)講師。1970年10月,科普作家馬丁·加德納(Martin Gardner,1914-2010)在《科學(xué)美國人》雜志的“數(shù)學(xué)游戲”專欄對(duì)這個(gè)生命游戲作了詳細(xì)介紹。從此,學(xué)界和民間對(duì)游戲的興趣和熱情一發(fā)而不可收拾。據(jù)說,在那個(gè)生命游戲風(fēng)靡世界的年代,全球有四分之一的電腦都在玩這個(gè)游戲。

          2010年,物理學(xué)家史蒂芬·霍金(Stephen W. Hawking,1942-2018)在他的科普著作《大設(shè)計(jì)》(The Grand Design)中寫道:“我們可以想象,像‘生命游戲’這樣的玩兒,它只有一些基本規(guī)則,便可以產(chǎn)生高度復(fù)雜的功能,甚至智慧。當(dāng)然它可能需要包含數(shù)十億個(gè)正方形的網(wǎng)格。但這并不困難,我們大腦中就有數(shù)千億個(gè)細(xì)胞。”

          【二】簡(jiǎn)史

          現(xiàn)在,我們來說說“生命游戲” 的前世今生。

          康威并不是構(gòu)思出這類具有深刻數(shù)學(xué)原理和社會(huì)學(xué)意義的生命游戲的第一人。游戲的基本思想要追溯到兩位美國數(shù)學(xué)家:波蘭裔的斯塔尼斯拉夫·烏拉姆(Stanislaw Ulam,1909-1984)和匈牙利裔的約翰·馮·諾伊曼(John von Neumann,1903-1957),他們?cè)谏鲜兰o(jì)40-50年代為模擬生物細(xì)胞的自我復(fù)制提出了“元胞自動(dòng)機(jī)理論”(Cellular Automata)的雛形。當(dāng)年,由于沒有高速大型電腦,他們的構(gòu)想沒有得到驗(yàn)證因而未受學(xué)術(shù)界的重視。1970年,馬丁·加德納在《科學(xué)美國人》雜志介紹了康威的生命游戲之后,元胞自動(dòng)機(jī)理論才受到了越來越廣泛的關(guān)注。

          在眾多卓有成效的元胞自動(dòng)機(jī)理論研究者中,特別值得提及的是美國電腦科學(xué)家史蒂芬·沃爾夫勒姆(Stephen Wolfram,1959-)。

          沃爾夫勒姆是個(gè)很有故事的人物。他1959年出生于倫敦,12歲編寫了一部關(guān)于物理學(xué)的詞典草稿,13-14歲間寫了三本關(guān)于粒子物理的手稿,15歲發(fā)表了第一篇學(xué)術(shù)論文,17歲進(jìn)入了牛津大學(xué)。1978年,19歲的沃爾夫勒姆接到美國物理學(xué)家默里·蓋爾曼(Murray Gell-Mann,1929-2019)的電話邀請(qǐng),來到了加州理工學(xué)院就讀研究生。蓋爾曼因發(fā)現(xiàn)基本粒子夸克在1969年獲諾貝爾物理學(xué)獎(jiǎng),他是圣塔菲研究所首任所長(zhǎng)。1979年,在加州理工學(xué)院讀書期間,沃爾夫勒姆便開創(chuàng)了自己的第一個(gè)大型電腦語言SMP,用以輔助物理學(xué)研究。該語言是后來著名數(shù)學(xué)軟件Mathematica和電腦Wolfram語言的前身。1980年,21歲的沃爾夫勒姆獲得了理論物理學(xué)博士學(xué)位,其答辯委員會(huì)成員包括有諾貝爾物理獎(jiǎng)得主理查德·費(fèi)曼(Richard P. Feynman,1918-1988)。之后,沃爾夫勒姆留校任教,隨即獲得MacArthur獎(jiǎng)。接下來,23歲的他開始推動(dòng)并主導(dǎo)了關(guān)于“復(fù)雜系統(tǒng)”的科學(xué)研究,并在27歲時(shí)創(chuàng)立了自己的Stephen Wolfram公司,從事數(shù)學(xué)軟件和電腦軟件開發(fā)。如所周知,他獲得了巨大成功,不過那是后話了。

          1983年,由于知識(shí)產(chǎn)權(quán)糾紛,沃爾夫勒姆離開了加州理工學(xué)院,到了普林斯頓大學(xué)自然科學(xué)學(xué)院工作。沒過多久,他就發(fā)明了元胞自動(dòng)機(jī)的計(jì)算程序。沃爾夫勒姆后來回憶說:“我開始時(shí)并不覺得簡(jiǎn)單的元胞自動(dòng)機(jī)有什么有趣之處,不過還是利用電腦試著對(duì)它們做了些試驗(yàn)。令我十分驚訝的是,就算是構(gòu)造極為簡(jiǎn)單的元胞自動(dòng)機(jī),它們?nèi)匀挥兄鴺O其復(fù)雜的行為,這對(duì)傳統(tǒng)的科學(xué)教條是個(gè)莫大的沖擊。過了些日子,我才意識(shí)到它的巨大潛力。那是我寫這本《一種新科學(xué)》(A New Kind of Science)的最早動(dòng)機(jī)。”我們知道,該書實(shí)際上代表了一條與圣塔菲研究所不一樣的復(fù)雜性科學(xué)研究路線。

          當(dāng)年,沃爾夫勒姆使用電腦模擬對(duì)基本元胞自動(dòng)機(jī)的類別進(jìn)行了系統(tǒng)性的分析,對(duì)一維基本元胞自動(dòng)機(jī)的256種規(guī)則所產(chǎn)生的模型進(jìn)行了深入的研究,并用熵(entropy)的概念來描述元胞自動(dòng)機(jī)的演化行為。他根據(jù)復(fù)雜性理論將元胞自動(dòng)機(jī)大致分為平穩(wěn)型、周期型、混沌型和復(fù)雜型。從幾乎所有的隨機(jī)初始模式開始,平穩(wěn)型將演化為穩(wěn)定靜止?fàn)顟B(tài),周期型將演化為穩(wěn)定振蕩狀態(tài),混沌型將演化為偽隨機(jī)混沌狀態(tài),復(fù)雜型將變化為相互作用繁復(fù)狀態(tài)且其局部結(jié)構(gòu)會(huì)在長(zhǎng)時(shí)間內(nèi)甚至永遠(yuǎn)地存在。沃爾夫勒姆發(fā)現(xiàn),絕大多數(shù)的生命游戲演化是無法被決定的(undecidable):即使給定了初始模式,依然找不到或者根本就不存在一個(gè)算法可以用來判斷后續(xù)模式是否會(huì)出現(xiàn)和何時(shí)會(huì)出現(xiàn)。沃爾夫勒姆指出110號(hào)規(guī)則對(duì)應(yīng)的元胞自動(dòng)機(jī)具有圖靈完備性(Turing completeness)。在電腦科學(xué)中,圖靈完備性是指具有無限存儲(chǔ)能力的通用編程語言,它可以通過一系列數(shù)據(jù)操作規(guī)則來模擬圖靈數(shù)學(xué)邏輯機(jī)。沃爾夫勒姆發(fā)現(xiàn),凡是可以通過編寫程序去計(jì)算的復(fù)雜系統(tǒng)演化行為,都可以用元胞自動(dòng)機(jī)來實(shí)現(xiàn)。順便提及,沃爾夫勒姆從分類開始時(shí)就已經(jīng)看到了元胞自動(dòng)機(jī)理論和美國數(shù)學(xué)家史蒂芬·斯梅爾(Stephen Smale,1930–)的艱深混沌數(shù)學(xué)理論的內(nèi)在聯(lián)系,因?yàn)樯螒虻臒o法決定性和混沌的長(zhǎng)期不可預(yù)測(cè)性[2]是類似的。

          上面討論的只是平面上的生命游戲和元胞自動(dòng)機(jī)理論。對(duì)于任意一條游戲規(guī)則,每個(gè)格點(diǎn)的黑子和白子鄰居的組合共有29=512種,而每種組合都可以用二進(jìn)制的0–1序列來表示并且是各自獨(dú)立變化的,于是總共有2512種可能。即便排除了那些沒有靜止、旋轉(zhuǎn)和反射對(duì)稱可能的不重要情形,剩下來的依然是一個(gè)天文數(shù)字。至于三維和更高維數(shù)的生命游戲和元胞自動(dòng)機(jī)理論,那就復(fù)雜得無法描述了,只能用幾個(gè)簡(jiǎn)單文字來概括:超乎想象的豐富多彩!

          【三】應(yīng)用

          故事講到這里,你一定會(huì)好奇,這迷人的元胞自動(dòng)機(jī)理論及其計(jì)算程序會(huì)有什么實(shí)際應(yīng)用呢?

          作為回應(yīng),我們簡(jiǎn)單地介紹一下元胞自動(dòng)機(jī)技術(shù)在電腦科學(xué)、生物學(xué)、化學(xué)、物理學(xué)和音樂藝術(shù)方面的幾個(gè)具體應(yīng)用或潛在應(yīng)用[3]。

          圖3 芋螺貝殼和Wolfram 30號(hào)規(guī)則生成的班圖[4]

          (1)電腦科學(xué):

          元胞自動(dòng)機(jī)處理器是該概念的物理實(shí)現(xiàn),它通過計(jì)算方式來處理信息。元胞的狀態(tài)僅通過與相鄰鄰居元胞的相互作用來確定,而不需要也不存在與更遠(yuǎn)的元胞進(jìn)行直接通信。一種典型的元胞自動(dòng)機(jī)處理器具有脈動(dòng)陣列配置,其中元胞相互作用通過電荷、磁性、振動(dòng)或其他物理手段來實(shí)現(xiàn)。

          Wolfram 30號(hào)規(guī)則最初被建議作為一種可能的分組密碼用于密碼學(xué)。二維元胞自動(dòng)機(jī)可用于構(gòu)建偽隨機(jī)數(shù)發(fā)生器,而且元胞自動(dòng)機(jī)的演化是單向函數(shù),其逆很難破解,即容易計(jì)算未來狀態(tài),但回算先前的狀態(tài)卻異常困難。元胞自動(dòng)機(jī)后來也被提議用于公鑰密碼學(xué)并用來設(shè)計(jì)各種糾錯(cuò)碼。

          (2)生物學(xué):

          一些漂亮的海螺貝殼圖案可以用元胞自動(dòng)機(jī)生成,例如分布廣泛的芋螺纖維(conus textile)具有類似于 Wolfram 30號(hào)規(guī)則的班圖(圖3),因而元胞自動(dòng)機(jī)理論能夠用來解釋和研究貝殼的顏色細(xì)胞自然生長(zhǎng)內(nèi)在規(guī)律。

          動(dòng)物體內(nèi)的成纖維細(xì)胞(fibroblast)與元胞自動(dòng)機(jī)有很多相似之處,例如每個(gè)成纖維細(xì)胞只與其鄰居相互發(fā)生作用。

          植物調(diào)節(jié)氣體吸入和呼出的機(jī)制類似于元胞自動(dòng)機(jī)的演化過程,例如樹葉上的每個(gè)氣孔有呼和吸兩個(gè)動(dòng)作,對(duì)應(yīng)于一個(gè)元胞的兩種狀態(tài)。

          頭足類(cephalopod)動(dòng)物例如烏賊的皮膚班圖中,每個(gè)狀態(tài)對(duì)應(yīng)于色素細(xì)胞的展開和收縮,可以用二維元胞自動(dòng)機(jī)進(jìn)行模擬和解釋。

          生物神經(jīng)元的活動(dòng)甚至動(dòng)物識(shí)別和學(xué)習(xí)等復(fù)雜行為都可以用閾值自動(dòng)機(jī)來模擬。

          (3)化學(xué):

          化學(xué)中的Belousov–Zhabotinsky反應(yīng)是一種時(shí)空化學(xué)振蕩過程,它可以通過元胞自動(dòng)機(jī)來進(jìn)行模擬和分析。例如一層單薄而均勻的丙二酸、酸化溴酸鹽和高鈰鹽混合在一起時(shí),迷人的幾何圖案如同心圓和螺旋曲線便在介質(zhì)中傳播,所產(chǎn)生的波形與某種元胞自動(dòng)機(jī)生成的圖案非常相似。

          (4)物理學(xué):

          概率元胞自動(dòng)機(jī)可用于統(tǒng)計(jì)學(xué)和凝聚態(tài)物理學(xué)的研究中,去分析流體動(dòng)力學(xué)和相變等現(xiàn)象。伊辛(Ising)模型是一個(gè)典型的例子,其中每個(gè)單元格可以處于“向上”或“向下”狀態(tài),從而用于理想化地表示磁鐵。通過調(diào)整元胞自動(dòng)機(jī)模型參數(shù),可以改變處于相同狀態(tài)的元胞比例,解釋了為何對(duì)鐵磁體加熱可以消磁。物理學(xué)中還有一種格子氣體元胞自動(dòng)機(jī),可以用來模擬液體流動(dòng)并對(duì)之給予合理解釋。

          (5)音樂藝術(shù):

          元胞自動(dòng)機(jī)可用來生成一些新穎動(dòng)聽的音樂作品和設(shè)計(jì)電子游戲。某些類型的元胞自動(dòng)機(jī)還可用于生成各種迷宮。兩個(gè)著名的元胞自動(dòng)機(jī)迷宮Maze和Mazectric類似于前面介紹的“生命游戲”,復(fù)雜而有趣。此外,元胞自動(dòng)機(jī)還能生成豐富多彩的圖案用于藝術(shù)設(shè)計(jì)。

          今天,元胞自動(dòng)機(jī)理論及各種數(shù)學(xué)游戲的研究仍在繼續(xù)。我們期待在不久的將來會(huì)得到更豐富更有趣的成果。

          注:原文發(fā)表在《復(fù)雜學(xué)》2024年第2卷第2期45-52頁,經(jīng)作者授權(quán)轉(zhuǎn)載

          【參考文獻(xiàn)】

          [1] 陳關(guān)榮(2023),愛玩的天才數(shù)學(xué)家康威,《數(shù)學(xué)文化》第14卷第4 期,36-46頁,https://www.global-sci.com/intro/article_detail/mc/22165. html

          [2] 陳關(guān)榮(2022 年),這門復(fù)雜性科學(xué)有個(gè)別致的名稱―混沌,《復(fù)雜學(xué)》第1 卷第1 期,69-75頁

          [3] Wikipedia: Cellular automaton,https://en.wikipedia.org/wiki/Cellular_automaton

          [4] Stephen Wolfram (2019), Announcing the rule 30 prizes,https://writings.stephenwolfram.com/2019/10/announcing-the-rule-30-prizes/


          主站蜘蛛池模板: 日本一区频道在线视频| 无码乱人伦一区二区亚洲| 国产成人精品亚洲一区| 国产午夜福利精品一区二区三区| 中文字幕一区二区三区人妻少妇| 国产成人精品一区在线| 国产成人av一区二区三区在线 | 亚洲精品无码一区二区| 台湾无码一区二区| 久久精品国产一区| 中文字幕久久亚洲一区| 精品一区二区三区影院在线午夜| 无码中文人妻在线一区二区三区| 日韩一区二区在线视频| 国产精品一级香蕉一区| 国产福利一区二区三区在线观看 | 国产精品一区视频| 日韩人妻无码一区二区三区久久| 精品亚洲一区二区| 午夜福利一区二区三区在线观看| 激情综合一区二区三区| 亚洲日本一区二区三区在线| 亚洲色精品aⅴ一区区三区 | 福利一区国产原创多挂探花| 精彩视频一区二区三区 | 中文字幕AV无码一区二区三区| 五月婷婷一区二区| 国产精品福利一区二区久久| 亚洲熟妇AV一区二区三区宅男| 精品黑人一区二区三区| 中文字幕日韩精品一区二区三区| 亚洲欧美国产国产一区二区三区| 国产一区二区好的精华液| 国产一区二区三区在线观看免费 | 亚洲AV成人精品一区二区三区 | 少妇特黄A一区二区三区| 乱子伦一区二区三区| 无码人妻一区二区三区免费手机| 精品一区二区视频在线观看| 在线观看日本亚洲一区| 无码人妻精一区二区三区|