陳凱
《世說新語(yǔ)》中有這樣一個(gè)故事:王羲之的幾個(gè)門生在玩棋,王羲之只有幾歲的兒子王獻(xiàn)之在一旁觀看,說其中一方將要輸了。門生覺得那么小年齡的孩子,恐怕只是懂那么一點(diǎn)點(diǎn)就亂說話,于是有點(diǎn)嘲笑地評(píng)價(jià)說:“管中窺豹,時(shí)見一斑?!蓖醌I(xiàn)之有沒有說準(zhǔn)呢?大概是說準(zhǔn)了吧,不過,故事里只是提到了王獻(xiàn)之頗為不高興地回應(yīng):“遠(yuǎn)慚荀奉倩,近愧劉真長(zhǎng)?!薄肮苤懈Q豹”是一個(gè)常用的成語(yǔ),不過其具體的運(yùn)用別有一番奧妙:當(dāng)人們只說“管中窺豹”的時(shí)候,通常是指難以從局部現(xiàn)象了解全局,而當(dāng)人們說“管中窺豹,可見一斑”的時(shí)候,卻往往是想說,即便從局部現(xiàn)象中也能了解到全局的狀況。這種看似矛盾的用法體現(xiàn)了語(yǔ)言文化的復(fù)雜性。在一個(gè)復(fù)雜的計(jì)算系統(tǒng)中,也常能發(fā)現(xiàn)類似“管中窺豹”的現(xiàn)象,可以將“斑”視作局部的計(jì)算現(xiàn)象,而“豹”則是整體的計(jì)算現(xiàn)象,有時(shí)可由局部了解全局,有時(shí)卻不能。利用局部的計(jì)算現(xiàn)象達(dá)成全局的計(jì)算目標(biāo),是構(gòu)造計(jì)算模型的一種重要思維方式。
管窺之斑或可見豹
假設(shè)一個(gè)列表中存儲(chǔ)有若干數(shù)字,要求找出其中最大的數(shù)字并將其移至列表最后,可以采用怎樣的方法呢?方法很多,不妨將這個(gè)列表想象成一個(gè)長(zhǎng)條的存儲(chǔ)槽,而數(shù)字是槽上大小不一的盒子,有一只機(jī)械手臂可以同時(shí)觀察兩個(gè)盒子的狀況并針對(duì)這兩個(gè)盒子做出某種動(dòng)作,那么,當(dāng)某人觀察到這只機(jī)械手臂從槽左側(cè)開始向右移動(dòng),并同時(shí)實(shí)施將兩個(gè)盒子中更大的那個(gè)交換到另一個(gè)盒子右側(cè)這樣的行為時(shí),就能判定,當(dāng)機(jī)械手臂移至槽右側(cè)末端時(shí),那里最終一定會(huì)擺放下槽中最大的盒子。擴(kuò)展想象一下,如果機(jī)械手臂可以同時(shí)觀察三個(gè)盒子的情況,并能將其中最大的盒子交換到另兩個(gè)盒子的最右側(cè),那么可以推斷,這個(gè)裝置整體的作用和剛才的裝置類似,也能夠在存儲(chǔ)槽中找出最大的盒子并放置到整個(gè)槽右側(cè)末端。一個(gè)使用列表的演示程序代碼及運(yùn)行結(jié)果如圖1所示。在這個(gè)例子中,局部的功能和全局的功能是一致的,所以比較容易借助局部變化的現(xiàn)象推演出整體變化的情況,用管窺之豹來(lái)比喻的話,局部的最大數(shù)的交換是斑,整體的最大數(shù)的交換是豹。
在簡(jiǎn)單的邏輯運(yùn)算中,也能發(fā)現(xiàn)“管中窺豹,可見一斑”的例子,如三個(gè)人投票,規(guī)則是一票否決,這時(shí)候可以用與的邏輯運(yùn)算來(lái)獲知投票結(jié)果。如果擴(kuò)展到十個(gè)人或更多人投票,那么全局的與運(yùn)算的結(jié)果還是很容易判斷出來(lái)的:只要有一張否決票,那么整個(gè)表決都不會(huì)通過,在與的邏輯運(yùn)算中,局部與整體的計(jì)算現(xiàn)象是一致的。
管窺之斑或難見豹
接下來(lái)看一個(gè)稍微復(fù)雜一些的例子,某存儲(chǔ)槽中有很多黑色盒子和白色盒子隨機(jī)相間排列。但在存儲(chǔ)槽的左側(cè)最前端放著一個(gè)特殊的盒子,它向前正面是黑色的,向后反面是白色的。機(jī)械手臂總是實(shí)施將此兩色盒子和其右側(cè)盒子交換的動(dòng)作,如果其右側(cè)盒子是黑色的,則交換的同時(shí)還要將此兩色盒子正反顛倒,如果其右側(cè)盒子是白色的,則只是交換位置而不對(duì)兩色盒子實(shí)施正反顛倒的動(dòng)作。那么,當(dāng)這只機(jī)械手臂順槽移動(dòng)到最右側(cè)末端時(shí),這個(gè)兩色盒子到底是黑色還是白色,則提示著存儲(chǔ)槽中的黑色盒子數(shù)量是奇數(shù)還是偶數(shù)。一個(gè)演示程序代碼及運(yùn)行結(jié)果如圖2所示。代碼中用“b”和“w”代表黑色和白色的盒子,用“-1”和“1”代表兩色盒子的黑色正面和白色反面。在這個(gè)例子中,局部的行為是交換盒子并判斷及實(shí)施兩色盒正反顛倒的動(dòng)作,但在系統(tǒng)運(yùn)行的整體上,卻實(shí)現(xiàn)了奇偶判斷的任務(wù)。局部動(dòng)作雖然和整體任務(wù)有密切的關(guān)系,但在行為表現(xiàn)上是不一致的。
將以上任務(wù)再做修改,假設(shè)機(jī)械手臂總是處于存儲(chǔ)槽左側(cè)開端處,而存儲(chǔ)槽的傳送帶會(huì)將其余右側(cè)的若干盒子向左移動(dòng)靠攏,當(dāng)機(jī)械手臂觀察到兩色盒與黑盒左右排列的狀態(tài)時(shí),就扔掉黑盒,同時(shí)將兩色盒翻面,當(dāng)機(jī)械臂觀察到白色反面向前的兩色盒與白盒左右排列的狀態(tài)時(shí),就扔掉白盒,否則就不做任何事。這樣一個(gè)局部的規(guī)則,到底可以用來(lái)實(shí)現(xiàn)怎樣的整體功能呢?這個(gè)問題的推理要比剛才的例子費(fèi)勁得多,雖然管窺見斑,但豹的整體的樣子就更難想象了。大家不妨直接看如圖3所示的程序代碼的演示。跟蹤運(yùn)行過程可知,在程序初始列表中,“b”的數(shù)量代表將要被判斷奇偶的數(shù)字,“w”是標(biāo)志符,如程序運(yùn)行最后所有的“w”都消失了,則說明被判斷的所有數(shù)字都是奇數(shù),否則,就說明連續(xù)擺放的“b”盒子用來(lái)表示的數(shù)量中,至少有一個(gè)偶數(shù)。在這個(gè)例子中,局部發(fā)生變化的位置只有一處,想象一下,若列表中多處位置都在按規(guī)則發(fā)生局部的變化,那么整體的變化現(xiàn)象就更難以揣摩了。
在邏輯運(yùn)算中也有類似的例子,如果對(duì)多個(gè)數(shù)字做一種叫做與非的運(yùn)算(對(duì)兩個(gè)邏輯值的與運(yùn)算的結(jié)果取反),哪怕這個(gè)局部變化規(guī)則非常簡(jiǎn)單,也還是不能根據(jù)這個(gè)局部變化現(xiàn)象直觀地推演出全局的變化現(xiàn)象,下頁(yè)圖4所示的是對(duì)8個(gè)邏輯值進(jìn)行邏輯運(yùn)算的程序代碼。如果是進(jìn)行與的邏輯運(yùn)算,那么很容易推測(cè)出整體的結(jié)果,如果是與非的邏輯運(yùn)算,那就只有一步一步地計(jì)算才能得出全局的結(jié)果。所以說,有時(shí)通過管窺之斑是很難見到豹的。
斑豹之變
在一個(gè)計(jì)算模型中,斑和豹的地位是會(huì)發(fā)生變化的,以冒泡排序算法為例,對(duì)于長(zhǎng)度為x的數(shù)列,數(shù)列中兩兩數(shù)字比對(duì)交換是斑,數(shù)列中最大數(shù)放置到最右側(cè)的現(xiàn)象是豹。同時(shí),也可以將第n次在長(zhǎng)度x-n+1的數(shù)列中實(shí)現(xiàn)最大數(shù)放置到最右側(cè)的這一現(xiàn)象視作斑,而長(zhǎng)度為x的數(shù)列最終實(shí)現(xiàn)排序的這一現(xiàn)象視作豹。
哪怕局部的規(guī)則很簡(jiǎn)單,若一個(gè)系統(tǒng)中多個(gè)局部都并發(fā)地應(yīng)用規(guī)則,整體上就有可能產(chǎn)生出混沌的現(xiàn)象,單憑人腦的能力,是難以把握局部規(guī)則運(yùn)用于全局后的變化狀態(tài)的,但對(duì)于某些特定的數(shù)據(jù)集合,局部規(guī)則的并發(fā)應(yīng)用,也能呈現(xiàn)出全局層面在混沌變化的同時(shí)涌現(xiàn)出部分有規(guī)則變化的現(xiàn)象。用語(yǔ)言描述這種現(xiàn)象是十分困難的,借助元胞自動(dòng)機(jī)的例子更容易說明這種現(xiàn)象。WireWorld是一種正方形網(wǎng)格元胞自動(dòng)機(jī),它的運(yùn)行規(guī)則是:每個(gè)格子允許有四種顏色,在每個(gè)變化的時(shí)刻,黑色總是保持黑色,紅色總是變成藍(lán)色,藍(lán)色總是變成黃色,黃色保持黃色的狀態(tài),但只要黃色的格子周圍的八個(gè)格子里有一個(gè)或兩個(gè)紅色,黃色就變成紅色。雖然局部規(guī)律不難理解,但對(duì)于稍微復(fù)雜一些的Wireworld圖樣,絕大部分人如果只用頭腦推理和想象是很難判斷出運(yùn)行結(jié)果的。這種針對(duì)全局狀態(tài)預(yù)測(cè)的困難,也是復(fù)雜系統(tǒng)的一個(gè)特征。例如,下頁(yè)圖5所示的圖案A在若干步變化后陸續(xù)出現(xiàn)B、C、D等圖案變化的現(xiàn)象,不得不用計(jì)算機(jī)才能逐步模擬出全局的圖樣變化狀況。
但令人驚訝的是,雖然圖5所示的系統(tǒng)在運(yùn)作過程中是混沌的,可它的初始時(shí)刻(如圖A所示的時(shí)刻)的信號(hào)狀態(tài)和若干時(shí)刻后(如圖D所示的時(shí)刻)的信號(hào)狀態(tài),這兩者間是存在明確的規(guī)律的。這里勉強(qiáng)比喻一下,在局部范圍內(nèi)可以看出有規(guī)律的“斑”,但很多“斑”組合在一起,大多數(shù)情況下是一片混沌,只有某些特別的“斑”偶爾以某種特別的方式組合起來(lái)后,能顯現(xiàn)出某種“豹”的樣子。如圖5所示的圖樣,它的行為很像一個(gè)能進(jìn)行與邏輯運(yùn)算的裝置。一旦有了這樣的領(lǐng)悟,就能夠?qū)⑦@個(gè)特殊組合的“豹”當(dāng)作為了組合出更大規(guī)模的“豹”的“斑”來(lái)使用了。下頁(yè)圖6是利用Wireworld元胞自動(dòng)機(jī)實(shí)現(xiàn)奇偶校驗(yàn)的例子,如果說整體的奇偶校驗(yàn)任務(wù)是豹,那么這個(gè)系統(tǒng)中重要的組成部分就是如圖5所示的圖樣的變化狀態(tài),就成為整體的豹的斑(注意,這里的斑不是圖樣而是圖樣的變化)。本文在這里只是試圖說明這種現(xiàn)象的存在,但除非讀者親自運(yùn)行并觀察這個(gè)系統(tǒng)的運(yùn)作過程,只依靠閱讀這里的文字描述,是很難明白這些圖樣變化是如何實(shí)現(xiàn)奇偶校驗(yàn)的功能的。
系統(tǒng)科學(xué)對(duì)此現(xiàn)象是這樣描述的:局域耦合可以產(chǎn)生出信號(hào)傳遞的現(xiàn)象,使得整體系統(tǒng)在不具備中心控制能力的情況下,在宏觀的尺度涌現(xiàn)出動(dòng)力學(xué)行為。不過對(duì)于復(fù)雜系統(tǒng),系統(tǒng)科學(xué)的研究目標(biāo)主要是結(jié)構(gòu)和功能的關(guān)系以及系統(tǒng)演化的規(guī)律,而計(jì)算機(jī)科學(xué)在于如何利用這種演化規(guī)律,或者是如何為創(chuàng)設(shè)出一種具有實(shí)用價(jià)值的演化規(guī)律來(lái)設(shè)計(jì)特定的結(jié)構(gòu)。
“用斑繪豹”的教學(xué)設(shè)計(jì)
從上述較為艱深和抽象的討論回歸到日常教學(xué),這里介紹一個(gè)可以在教學(xué)中引發(fā)討論的有趣問題:假設(shè)有一個(gè)長(zhǎng)長(zhǎng)的存儲(chǔ)槽,槽內(nèi)排列大小不一的盒子,槽的左側(cè)末端是某A,槽的右側(cè)末端是某B。某只機(jī)械手臂在槽的側(cè)面左右來(lái)回隨機(jī)游走,機(jī)械手臂會(huì)觀察槽內(nèi)盒子,它每次檢查三個(gè)盒子,然后將最大的盒子取出,放置在另兩個(gè)盒子的右面,假如遇見的三個(gè)盒子都是一樣的,則不做任何事繼續(xù)隨機(jī)游走。例如,機(jī)械手臂看到的是“635”,就將“6”交換到另兩個(gè)數(shù)最右側(cè),成為“356”??梢詫⑦@個(gè)情況以某種編碼展現(xiàn)出來(lái):
A26352627282738244758473B
R
-->
A26352627282738244758473B
R
容易猜出,編碼中數(shù)字代表不同大小的盒子,數(shù)字越大盒子越大,R是機(jī)械手臂?,F(xiàn)在,某A要和某B通過在紙盒子上寫字的方式來(lái)傳輸信息,但某A和某B不能離開自己的位置,為了實(shí)現(xiàn)通信的需求,某A和某B使用了一種充氣變?yōu)?、放氣變?yōu)?的變化盒,在通信時(shí)可將變化盒放置在自己身邊的槽末端(為避免復(fù)雜性,變化盒傳達(dá)到對(duì)方閱后即毀),這里要問的是:為了實(shí)現(xiàn)相互通信,在A和B的身邊,需要準(zhǔn)備多少變化盒?
①A和B各需要1個(gè)變化盒給對(duì)方發(fā)消息;
②A和B各需要2個(gè)變化盒給對(duì)方發(fā)消息;
③A需要2個(gè)變化盒能發(fā)出消息給B,B需要1個(gè)變化盒能發(fā)出消息;
④A需要1個(gè)變化盒能發(fā)出消息給B,B需要2個(gè)變化盒能發(fā)出消息。
問題描述的盒子位置在變化過程中,很清晰地體現(xiàn)出局域耦合所產(chǎn)生的信號(hào)傳遞現(xiàn)象,而且,系統(tǒng)整體的功能依賴于規(guī)則引發(fā)的局部變化,但整體的功能又和局部行為不相一致,希望讀者在領(lǐng)悟到這一點(diǎn)后,能進(jìn)一步嘗試用局部的“斑”來(lái)建構(gòu)出整體的“豹”,解決更復(fù)雜一些的問題。