陳凱
想要一片森林?那就請(qǐng)認(rèn)真想象一下吧
工作學(xué)習(xí)累了,來(lái)一局電腦游戲調(diào)節(jié)一下如何?這里有一款名字叫Adventure(冒險(xiǎn))的游戲,內(nèi)容是在迷宮中尋找寶藏。小心,迷宮中還有不少危險(xiǎn)的生物!聽(tīng)上去挺有意思。
運(yùn)行游戲,屏幕上顯示了一段文字:
YOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING. AROUND YOU IS A FOREST. A SMALL STREAM FLOWS OUT OF THE BUILDING AND DOWN A GULLY.(你站在路的盡頭,那里有一座小磚房。你周?chē)且黄?。一條小溪從建筑物中流出,涌入一條溝壑。)
不過(guò)你并不能在屏幕上看到任何圖像,一段文字描述就是所能見(jiàn)到的一切,好在游戲提示你可以做某些動(dòng)作,比如隨便走走、撿撿東西什么的,于是你輸入:go south。
然后屏幕顯示出一段文字:
YOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A ROCKY BED.(你進(jìn)到覆蓋森林的山谷里,身旁的溪水拍打著巖床。)
還是沒(méi)有任何圖像,實(shí)際上,因?yàn)橛螒蜍浖\(yùn)行在一臺(tái)古老的微機(jī)上,限于硬件配置,游戲設(shè)計(jì)者一開(kāi)始就沒(méi)有打算顯示圖像,玩家在游戲中遇到的所有一切,都只能用文字來(lái)描繪,無(wú)論尋寶打怪都全靠想象,盡管如此,在20世紀(jì)70年代游戲發(fā)布后,還是吸引了不少玩家。到20世紀(jì)80年代初,隨著微型計(jì)算機(jī)配置的提高,Adventure游戲的后續(xù)版本終于有了少量的圖畫(huà),比如色彩單一的樹(shù)林(如圖1),這些圖片會(huì)配合文字在適當(dāng)?shù)臅r(shí)候出現(xiàn)。
可以看出,游戲設(shè)計(jì)者努力在計(jì)算機(jī)中的世界和現(xiàn)實(shí)世界兩者間建立起一種對(duì)應(yīng),圖畫(huà)也好,滿(mǎn)是字母符號(hào)的地圖也好,這些都是設(shè)計(jì)者心中形象的顯現(xiàn),但玩家看到的僅僅是表面現(xiàn)象。觀察游戲程序的代碼(如圖2),能夠揭示何以玩家能從一個(gè)地方“去”到另一個(gè)地方:初始狀態(tài)時(shí),總共有五個(gè)可以前往的去處,每個(gè)去處都對(duì)應(yīng)著某個(gè)動(dòng)作,當(dāng)玩家角色跳轉(zhuǎn)到另一個(gè)場(chǎng)景后,又會(huì)有新的數(shù)據(jù),規(guī)定著再下一步可以前往的去處。用這樣的方法,許許多多的場(chǎng)景就連接成了一個(gè)網(wǎng)絡(luò)狀的迷宮。哪怕游戲確實(shí)有趣,那片森林也只不過(guò)是靜態(tài)的圖片,缺少生長(zhǎng)的氣息。
虛幻森林中的真實(shí)
人們?cè)谟^看完某部電影后可能會(huì)發(fā)出這樣的評(píng)價(jià):“啊,這個(gè)情節(jié)實(shí)在是太假了?!弊屑?xì)想想,評(píng)價(jià)本身有意思的地方是,其實(shí)電影劇情本身就是虛構(gòu)的,換句話說(shuō),那本來(lái)就是假的,既然觀眾評(píng)價(jià)電影拍得假,那問(wèn)題是:什么是真的?類(lèi)似的,計(jì)算機(jī)游戲也是虛幻的創(chuàng)造物,但只要有樂(lè)此不彼的玩家沉溺其中,就必須承認(rèn),虛幻之中存在著某種真切的感覺(jué),比如,獲得游戲獎(jiǎng)賞時(shí)頭腦多巴胺的分泌是真實(shí)的。有意思的是,通常頭腦不會(huì)很在意那些所謂的獎(jiǎng)賞究竟是真實(shí)還是虛幻的。
想象一下,假設(shè)世界上從來(lái)沒(méi)有誕生各種圖形界面操作系統(tǒng),微型計(jì)算機(jī)的主要功能就是用來(lái)玩游戲,隨著游戲場(chǎng)景越來(lái)越精致,角色行為越來(lái)越復(fù)雜,人們?cè)缤頃?huì)意識(shí)到,還可以拿這個(gè)游戲當(dāng)作輔助工作的工具,比如把喜愛(ài)的書(shū)(可能以竹簡(jiǎn)的形式呈現(xiàn))存放進(jìn)某個(gè)小木屋,將重要的計(jì)劃寫(xiě)進(jìn)備忘錄(或許是刻寫(xiě)在潮濕的泥板上,然后讓太陽(yáng)曬干),在洞穴大廳里召開(kāi)聯(lián)網(wǎng)的會(huì)議等。當(dāng)然,從工作效率的角度看,一片森林有些過(guò)于“真實(shí)”了,發(fā)送信息要先前往鴿棚??jī)?chǔ)存一篇文檔前先要跨越溪流?想象一下如何在圖3所示的場(chǎng)景中開(kāi)辟一個(gè)工作環(huán)境。
絕大部分圖形界面操作系統(tǒng)從一開(kāi)始虛幻的就是某個(gè)工作臺(tái)的場(chǎng)景,例如,早期的Mac系統(tǒng)里(如圖4),可以找到紙筆、書(shū)籍、文件夾、垃圾桶等各種和日常工作相對(duì)應(yīng)的元素。
實(shí)際工作中的物品被對(duì)應(yīng)為簡(jiǎn)約的圖標(biāo),但卻給人一種真實(shí)感,從某種意義上說(shuō),這個(gè)圖形界面操作系統(tǒng)是現(xiàn)代人類(lèi)的虛幻森林。不過(guò),假如某一天人們能復(fù)活某個(gè)封存在冰層中千年的原始人類(lèi),一開(kāi)始,他大概更習(xí)慣使用虛幻森林來(lái)干活和生活。
值得一提的是,如圖5所示,大部分操作系統(tǒng)的文件管理方式的確與“樹(shù)”有關(guān),無(wú)論是用命令行的“CD”進(jìn)入目錄,還是鼠標(biāo)雙擊文件夾,都是從樹(shù)狀數(shù)據(jù)結(jié)構(gòu)的某一結(jié)點(diǎn),跳轉(zhuǎn)到另一個(gè)結(jié)點(diǎn)。
這個(gè)小小工作臺(tái)里有很多幫助人們進(jìn)行計(jì)算的工具——計(jì)算器、電子表格、數(shù)據(jù)庫(kù),本質(zhì)上說(shuō),包括文本編輯器、游戲等每一個(gè)軟件都是一種計(jì)算裝置。某個(gè)能熟練使用計(jì)算機(jī)的人大概會(huì)由衷贊嘆當(dāng)代科技的強(qiáng)大,然而他大概很少會(huì)想到,自己每天打交道的計(jì)算機(jī)操作系統(tǒng)和軟件,只不過(guò)是功能受到限制的一個(gè)虛幻工作臺(tái),這個(gè)虛幻工作臺(tái)可能是一個(gè)虛幻小木屋的一部分,而這個(gè)虛幻小木屋則是一片巨大虛幻森林的一部分。不少人以為這個(gè)小書(shū)桌或者小木屋是整個(gè)世界,卻忘記了小木屋外還有整片森林。就像孩童拿到一個(gè)指南針,卻只是反復(fù)晃動(dòng)指南針表盤(pán),愉快地看著指針一次又一次回到固定的方向。
“虛幻森林”里的“虛幻森林”
即便是一個(gè)小小的工作臺(tái),也能為使用者提供強(qiáng)大的助力,幫助其對(duì)龐大真實(shí)世界進(jìn)行合理的想象和推斷。接下來(lái)的例子并不會(huì)用到多么高端的工具,只用記事本或電子表格,就能體驗(yàn)到計(jì)算的奇妙。
生物學(xué)家Aristid Lindermayer注意到,樹(shù)木的生長(zhǎng)其實(shí)是一種迭代過(guò)程,這種迭代可以抽象成一種符號(hào)重寫(xiě)過(guò)程,比如,同時(shí)把符號(hào)中的A變成AB,把B變成BA,只要制定不同的替換規(guī)則,便能得到不同形狀的“樹(shù)”,這就是L-System。
隨著變化不停重復(fù)下去,字符串會(huì)越來(lái)越復(fù)雜,“ABBABAAB”之后是“ABBABAABBAABABBA”,然后越來(lái)越長(zhǎng)。
如果規(guī)則本身稍微復(fù)雜一些,用紙筆實(shí)施演算就極其煩瑣,比如以下規(guī)則,注意,對(duì)于某個(gè)符號(hào)串,兩個(gè)規(guī)則要同時(shí)起作用,這就是所謂的并行重寫(xiě):
替換規(guī)則一:B-->BB
替換規(guī)則二:A->B[A]A
假設(shè)初始時(shí)僅有一個(gè)A,則前幾步符號(hào)替換情況如下:
第四步:BBBBBBBB[BBBB
[BB[B[A]A]B[A]A]BB[B[A]A]B[A]A]BBBB[BB[B[A]A]B[A]A]BB[B[A]A]B[A]A
第三步:BBBB[BB[B[A]A]B[A]A]BB[B[A]A]B[A]A
第二步:BB[B[A]A]B[A]A
第一步:B[A]A
初始時(shí):A
這個(gè)替換過(guò)程甚至都不需要用到專(zhuān)門(mén)的程序,用記事本就能實(shí)現(xiàn)。要想用記事本的查找替換功能實(shí)現(xiàn)符號(hào)串的演化,關(guān)鍵是怎么實(shí)現(xiàn)不同替換規(guī)則同時(shí)生效。
如果感覺(jué)記事本的查找替換不怎么自動(dòng)化,那么也可以利用電子表格,實(shí)現(xiàn)方法有很多,比如,在第一列單元格中填入“@A”,在第二列中填入下面這個(gè)公式:
“=MID(E1,2,LEN(E1))&(IF(LEFT(E1,1)="B","BB",IF(LEFT(E1,1)="A","B[A]A",LEFT(E1,1))))”
不停拖曳重復(fù)使用公式,就能看到符號(hào)串在快速增長(zhǎng)中,每當(dāng)“@”符號(hào)移動(dòng)到符號(hào)串首位時(shí),就是讀取L-System演化結(jié)果的時(shí)候,如圖6所示。
接下來(lái),可以賦予每個(gè)符號(hào)一定的含義,A是畫(huà)樹(shù)枝和樹(shù)葉,B是畫(huà)樹(shù)干,左方括號(hào)是左轉(zhuǎn)45度并做標(biāo)記,右方括號(hào)是回到標(biāo)記并右轉(zhuǎn)45度,如此重復(fù),就可以看到一棵樹(shù)生長(zhǎng)的過(guò)程,符號(hào)串越長(zhǎng),這棵樹(shù)長(zhǎng)得也就越是茂盛,如圖7所示。
如果在符號(hào)串中再加入表示旋轉(zhuǎn)方向的符號(hào),那么L-System就可以生成不同形狀的樹(shù),“Overlapping trees in L-system forest”這個(gè)Python程序演示了如何用不同的樹(shù)創(chuàng)造出一片森林,可以到stackoverflow.com下載程序源代碼。代碼并不難,所以可以按自己的想法使得程序更有研究?jī)r(jià)值,比如修改L-System規(guī)則,生成更多不同種類(lèi)的樹(shù)(如圖8);或是將遺傳算法協(xié)同L-System規(guī)則進(jìn)行演化,使得生成的樹(shù)更接近自然界的真實(shí)形態(tài)。
科學(xué)家發(fā)現(xiàn),將L-System演化規(guī)律與生物DNA中的堿基互補(bǔ)配對(duì)原則結(jié)合到一起,能夠?qū)崿F(xiàn)通用圖靈計(jì)算,這就意味著,電子計(jì)算機(jī)能實(shí)現(xiàn)的功能,用生物計(jì)算機(jī)同樣都能夠?qū)崿F(xiàn)。讀到這里不妨回頭看一下,一開(kāi)始,是用計(jì)算來(lái)生成樹(shù),研究到后來(lái),其實(shí)是用生成的樹(shù)來(lái)進(jìn)行計(jì)算。
本篇文章涉及到許多知識(shí)點(diǎn),每一處都值得深入探索,所以可以視作一篇學(xué)習(xí)提綱。但讀者也可以將這篇文章看成寓言故事:在宇宙中,某個(gè)自稱(chēng)人類(lèi)的種群試著用計(jì)算來(lái)模擬一片森林,雖然一開(kāi)始,他們距離預(yù)想的目標(biāo)很遠(yuǎn),直到一天他們改變了自己的計(jì)算方式,然后發(fā)現(xiàn),森林本身就是一種計(jì)算。