柯紮的方法和西姆斯的有很多相似之處。柯紮的“數據培養液”也含有大約一打用LISP語言表達的數學基元,諸如加、乘、餘弦。這些基元隨機串在一起形成一棵棵邏輯“樹”——一種形似計算機流程圖的層次結構。柯紮的係統像繁殖人口一樣創建了500到10000個不同的獨立邏輯樹。“數據培養液”通常在繁衍了大約50代之後收斂到某個合適的後代身上。

樹與樹之間交換分枝迫使它們產生變種。有時嫁接的是一根長樹枝,有時僅僅是一根細枝或枝頭的“葉子”。每根樹枝都可以被看作是由更小的分枝構成的完整無缺的邏輯子程序。通過分枝交換,一小段方程(一根樹枝),或一個有用的小程序,可以得到保存甚至傳播。

通過方程進化能解決形形色色的古怪問題。柯紮用它來解決的一個經典難題是如何讓一根掃把立在滑板上。滑板必須在馬達的推動下來回移動,使倒立的掃帚在板中央保持直立。馬達控製的計算量驚人,但在控製電路上與操縱機器人手臂的電路並無多大區別。柯紮發現,他可以進化出一個程序來實現這種控製。

被他用來測試方程進化的問題還有:走出迷宮的策略;二次方程的求解方法;優化連接眾多城市最短路徑的方法(又稱為旅行商問題);在tictac-toe[373]sup> 一類簡單遊戲中勝出的策略。在每個例子中,柯紮的係統每次都會去尋找解決問題的一般公式,而不是尋找每一個測試實例的具體答案。一個公式經受不同實例的測試越多,這個公式就會進化得越完善。

盡管方程進化能得出有效的解決方案,可這些方案卻往往要多難看有多難看。當柯紮拿起他那些高度進化的寶貝開始查看細節時,他和西姆斯以及雷一樣感到震驚:解決方案簡直是一團亂麻!進化要麼繞上一個大彎,要麼鑽個曲裏拐彎的邏輯漏洞抄近道。它塞滿冗餘,毫不雅致。出了錯時,寧願添加一節糾錯程序,或者讓主流程改道繞過出錯的區域,也不願銷去錯誤的部分。最後的公式頗有幾分神奇的魯賓·戈德堡 [374]sup> 連動裝置的樣子,依靠某些巧合才能運作。當然,它實際上就是架戈德堡神奇連動機。

拿柯紮曾經給他的進化機器玩過的一個問題為例。那是一個由兩條互相纏繞的螺旋線構成的圖形,大致類似於紙風車上的雙重螺旋線。柯紮要求進化方程機器進化出一個最佳方程式,來判定約200個數據點各在互繞雙螺旋的哪一條線上。

柯紮將10000個隨機產生的計算機公式加載到他的數據培養液裏。他放任它們進化,而他的機器則挑選出最有可能獲得正確公式的方程。柯紮睡覺的時候,程序樹交換分枝,偶爾產生一個運行更好的程序。在他度假期間,機器照常運行。待他度假歸來,係統已經進化出能完美劃分雙螺旋線的答案了。

這就是軟件編程的未來!定義一個問題,機器就能在程序員打高爾夫球的時候找到解決方案。但是,柯紮的機器找到的解決方案讓我們得以一睹進化的手藝。這是它得出的公式:

(SIN (IFLTE (IFLTE (+ Y Y) (+ X Y) (- X Y) (+ Y Y)) (* X X) (SIN (IFLTE (% Y Y) (% (SIN (SIN (% Y 0.30400002))) X) (% Y 0.30400002) (IFLTE (IFLTE (% (SIN (% (% Y (+ X Y)) 0.30400002)) (+ X Y)) (% X 0.10399997) (- X Y) (* (+ -0.12499994 -0.15999997) (- X Y))) 0.30400002 (SIN (SIN (IFLTE (% (SIN (% (% Y 0.30400002) 0.30400002)) (+ X Y)) (% (SIN Y) Y) (SIN (SIN (SIN (% (SIN X) (+ -0.12499994 -0.15999997))))) (% (+ (+ X Y) (+ Y Y)) 0.30400002)))) (+ (+ X Y) (+ Y Y))))) (SIN (IFLTE (IFLTE Y (+ X Y) (- X Y) (+ Y Y)) (* X X) (SIN (IFLTE (% Y Y) (% (SIN (SIN (% Y 0.30400002))) X) (% Y 0.30400002) (SIN (SIN (IFLTE (IFLTE (SIN (% (SIN X) (+ -0.12499994 -0.15999997))) (% X -0.10399997) (- X Y) (+ X Y)) (SIN (% (SIN X) (+ -0.12499994 -0.15999997))) (SIN (SIN (% (SIN X) (+ -0.12499994 -0.15999997)))) (+ (+ X Y) (+ Y Y))))))) (% Y 0.30400002))))).