陳凱



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