遺傳算法入門(連載之一)

遺傳算法入門
(連載之一)
.
扎自<遊戲編程中的人工智能技術>第三章 
(美)Mat Buckland 著
吳祖增 沙 鷹 譯
清華大學出版社出版
生物只有經過許多世代的不斷演化(evolution),才能更好地完成生存與繁衍的任務。遺傳算法也遵循同樣的方式,需要隨着時間的推移不斷成長、演化,最後才能收斂,得到針對某類特定問題的一個或多個解。因此,瞭解一些有關有生命的機體如何演化的知識,對理解遺傳算法的演化機制是是有幫助的。本章的開始幾頁將扼要闡述自然演化的機制(通常稱爲“溼”演化算法),以及與之相關的術語。即使你當年在中學裏對生物並不擅長,也無須擔心。本章不會涉及到過深的細節,但對於理解自然演化的基本機制已經足夠。拋開以上不論,當你讀完本章或下一章後,我想,你也會和我一樣,深深歎服自然母親的令人着迷!

。。從本質上說,任何生物機體不過就是一大堆細胞的集合。每個細胞都包含若干組相同的DNA鏈,人們一般稱之爲染色體(chromosome)。染色體中包含的DNA分爲兩股,這兩股DNA鏈以螺旋狀絞合在一起,如下面圖3.1所示那樣
,這就是我們所熟悉的DNA雙螺旋結構模型。



圖 3.1.. DNA雙螺旋結構 
 

。。單個的染色體是由稱作基因(gene)的更小的結構模塊組成,而基因則又由稱作核苷酸(nucleotide)的物質組成。核苷酸一共只有四種類型,即:腺嘌呤(thymine)、鳥嘌呤(adenine)、胞嘧啶(cytocine)、胸腺嘧啶(guanine)。這些核苷酸相互連接起來,形成若干很長的基因鏈,而每個基因編碼了生物機體的某種特徵,如頭髮的顏色,耳朵的樣子,等。一個基因可能具有的不同設置(如頭髮的黑色、棕色或金黃色),稱爲等位基因(allele),它們沿染色體縱向所處的物理部位稱爲基因的座位(locus)。

。。一個細胞中的染色體組(collection)包含了複製該機體所需的全部信息。這就是克隆怎樣實行的祕密。你可以從被克隆施主(donor)身上,哪怕是一個血細胞中包含的信息,複製出整個生物機體,例如一頭羊。新的羊將會在每一個方面和施主羊完全相同。染色體的這一集合就稱爲生物機體的基因組(genome)。在一特殊基因組中等位基因的一種狀態稱爲該機體的遺傳類型(genotype)。這些就是用來生成實際的生物機體  -所謂表現型(phenotype) -本身的硬編碼指令。你和我都是表現型。我們的DNA攜帶了我們的遺傳類型。如將這些術語用到其他領域中,則,設計汽車用的成套藍圖就是一個遺傳類型;在生產線上隆隆作響的成品汽車就是一個表現型;只有設計被定型之前的,那些完全陣舊的設計,才勉強稱得上是一個基因組。

。。行了,行話說到此已經足夠了。現在讓我們討論,怎樣把所有這些應用到進化中去。如果你屬於偶爾有機會離開計算機屏幕的那種人(因爲我的朋友告訴我,我才知道外邊還有一個世界呢!),你可能已經注意到,對於
萬萬的動物和植物 - 小到只有在顯微鏡下才能看到的單細胞生物,大到從空間衛星上也能見到的巨大珊瑚礁 -地球是它們共同的家,不管它們的大小怎樣、形狀或顏色又怎樣。一個生物機體被認爲取得了成功,如果它得到了配偶並生下了一個子機體,而後者完全有希望來繼續進一步複製自己。

。。爲了做到這一點,生物機體必須善長許多工作。例如,能尋找食物和水、能面對掠食者來保衛自己、能使自己吸引潛在的配偶,等。所有這些特長在某種程度上都和生物機體的遺傳類型 -生命的藍圖有關。生物機體的某些基因將會產生有助於它走向成功的屬性,而另一些基因則可能要妨礙它取得成功。一個生物的成功的量度就是它的適應性。生物機體愈能適應,它的子孫後代也就愈多。下面轉來討論我們的關鍵部分...

。。當兩個生物機體配對和複製時,它們的染色體相互混合,產生一個由雙方基因組成的全新的染色體組。這一過程就叫重組(recombination)或交疊(crossover,又譯雜交,交叉,交換)
。這樣就意味,後代繼承的可能大部分是上一代的優良基因,也可能繼承了它們不少的不良基因。如果是前一種情況,後代就可能變得比它的父母更能成功(例如,它對掠食者有更強的自衛機制);如爲後一種情況,後代甚至就有可能不能再複製自己。這裏要着重注意的是,愈能適應的子孫後代就愈有可能繼續複製並將其基因傳給下一個子孫後代。由此就會顯示一種趨向,每一代總是比其父母一代生存和匹配得更完美。

。。作爲它的一個很簡捷的例子,我們設想,雌性動物僅僅吸引大眼睛的雄性。這樣,在追求雌性配偶的雄性中,眼睛的尺寸愈大,其獲得成功的可能性也愈大。你可以說,動物的適應性正比於它的眼睛的直徑。因此,你就可以看到,從一個具有不同大小眼睛的雄性羣體出發,當動物進化時,在同位基因中,能產生大眼睛雄性動物的基因,相對於產生小眼睛雄性動物的基因,就更有可能被複制到下一代。由此可以推出,當進化幾代之後,大眼睛將會在雄性羣體佔據統治地位。過些時候,你就可以說,生物正在向一種特殊的遺傳基因收斂。

 

不過,有些讀者可能已經會想到,如果這是繁殖期生物機體內唯一發生的事情,那幺即使經歷成千上萬代後,適應能力最強的成員的眼睛也只能象初始羣體中最大的眼睛一樣大。而根據我們對自然界的觀察中發現,人類或動物的眼睛尺寸實際存在一代大於一代的趨勢。之所以會發生這種情況,是因爲當基因傳遞給子孫後代的過程中,會有很小的概率發生差錯,從而使基因得到微小的改變。這多少有點象中國古老的耳語傳話遊戲:在一隊人中,把一條消息一個接一個地傳遞下去;第一個人對着第二個人的耳朵輕聲地講述一個故事,第二個人再輕聲地把此故事傳向第三個人,等,直到最後那個人再把聽到的故事講出來。通常這都會諾出很多笑話:最後一個人講出來故事與第一個所講的已是面目全非。其實,這種類型的差錯在把信息從一個系統傳遞給另一系統時實際都會發生的。圖3.2顯示的一列圖畫就是一個令人驚訝的例子。這是一次測試的結果:第一個人畫出了一隻鳥類的圖(見左上角) 交給第二人,第二人看了以後自己重畫一個給他的下一個人,這樣重複下去,直到最後那個人畫出來的圖形就會被顯著‘異化'。如果你有機會和十幾個朋友聚集在一起,我推薦你做一下這個小試驗,因爲原始圖畫能有如此多變化似乎難以置信。

有趣的事實
.......
古代的硬幣容易產生這種類型的信息丟失差錯。早期厄爾利凱爾特人和條頓人所使用的硬幣大量地被假冒着;在早先的原始硬幣上能找到一位皇帝的頭像(那時已經在許多城市和鄉鎮用於支付)到後來則變成一匹馬或一碗果子的形狀了。你一眼就能看出當時使用的假冒貨幣,無需使用任何高科技的紫外線設備來探測!

 

圖 3.2 信息移轉的一個試驗。 ( Thames 和 Hudson 提供的幻想圖形 )


你可以說,圖形或故事的情節在從一個人到另一個人的傳遞過程中,已經發生了變異 (或突變,mutation) ,同樣的變異在生物繁衍過程中會在它們的基因中出現。發生變異的概率通常都很小,但經歷大量世代之後變異就會顯得很可觀。一些變異對生物將是不利的(這有最大的可能),另一些則對生物的適應性可能沒有任何影響,但也有一些則可能會給生物帶來一些明顯的利益,使它能超過與其同類的生物。在前面我們所講的例子中,你看到的能使動物引起眼睛直徑變大的基因突變就是一種有利的突變,它將使該動物與羣體其餘動物相比,就好像一個超級的時髦模特兒那樣顯得突出。這種使眼睛變得越來越大的趨勢需要基因參與才能實現。當進化過程經歷成千上萬代之後,就會使動物長出一對如同盛菜的盤子那樣大的眼睛!見圖3.3



圖 3.3 一個 Adonis 的進化


進化機制除了能改進已具備的特徵之外,也能產生各種各樣全新特徵。讓我們再以眼睛的進化作爲一個例子來說明吧。

可以設想,曾有一個時期動物就根本沒有眼睛。那時,動物在它們的環境中航行完全是靠嗅覺和觸覺來躲避掠食它們的動物。他們也 相當擅長於這樣做,因爲他們靠這樣已經歷了成千上萬個世代。在那個時候,鼻子大和手腳長的男性是受女孩子們歡迎的。然而,突然有一天,當兩個動物配對時,一個基因突變發生在爲皮膚細胞提供的藍圖上。這一突變使其後代在他們的頭上發育出了一個具有相當光敏效應的細胞,使其後代能足夠識別周圍環境是亮的還是暗的。這樣就給他帶來了一個微小的優點,因爲,如果一種食肉動物,比如一隻鷹,來到了某個範圍以內,則它將阻擋了光線,這時,該動物就會感覺得到,就可迅速跑到隱蔽的地方去躲藏起來。另外,這種皮膚細胞還能指示現在是晚上或白天,或告訴他現在是在地面之上或地面之下,這些信息在捕食和吸取營養時都能爲它提供方便。你能看到這一新型皮膚細胞將使這一動物與羣體中其餘的動物相比,具備了稍多的優點,並因此也就有更多的生存和繁殖的機會。過了一段時間,由於進化機制的作用,許多動物的染色體中都會出現具有光敏皮膚細胞的基因。

現在,如果你再作一些外推,想象這一光敏細胞基因得到了進一步的有利突變,則你能看到,經過許多許多世代後,光敏細胞經過分化形成爲一個區域;這個區域不斷變大,產生出一些更爲確定的特徵,例如形成一個晶體,或產生能區別顏色的視覺細胞;還可以想象,一個突變使某個動物由一個光敏區域改變爲兩個光敏區域,由此就使那個動物有了立體視覺。立體視覺對一個生物體來說是一個巨大的進步,因爲這能精確告訴他目標離開他有多遠。當然,你也可以把會對眼睛產生不利影響的突變裝入同樣那些基因。但這裏重要的一點是,這樣生長出來的後代將不會和已具備改進型眼睛的堂表親戚們那樣取得成功,它們最終將會滅絕。只有成功的基因纔會得到繼承。你觀察自然界中存在的任何特徵就能發現,它們的進化都是利用無數微小的突變發展而來的,且它們都是對擁有者有利。難以置信吧?

這些重組和變異機制說明了進化怎麼完成。我希望現在你已經理解,有機體是怎麼逐步形成各種不同類型的特徵,以幫助它們在其生存環境中取得更大的成功。

 

3.3 計算機內的進化 ( Evolution Inside Your Computer )

遺傳算法的工作過程本質上就是模擬生物的進化過程。首先,要規定一種編碼方法,使得你的問題的任何一個潛在可行解都能表示成爲一個“數字”染色體。然後,創建一個由隨機的染色體組成的初始羣體(每個染色體代表了一個不同的候選解),並在一段時期中,以培育適應性最強的個體的辦法,讓它們進化,在此期間,染色體的某些位置上要加入少量的變異。經過許多世代後,運氣好一點,遺傳算法將會收斂到一個解。遺傳算法不保證一定能得到解,如果有解也不保證找到的是最優解,但只要採用的方法正確,你通常都能爲遺傳算法編出一個能夠很好運行的程序。遺傳算法的最大優點就是, 你不需要知道怎麼去解決一個問題; 你需要知道的僅僅是,用怎麼的方式對可行解進行編碼,使得它能能被遺傳算法機制所利用。

通常,代表可行解的染色體採用一系列的二進制位作爲編碼。在運行開始時,你創建一個染色體的羣體,每個染色體都是一組隨機的2進制位。2進制位(即染色體)的長度在整個羣體中都是一樣的。作爲一個例子,長度爲 20的染色體的形狀如下:

01010010100101001111

重要的事情就在於,每個染色體都用這樣的方式編碼成爲由 0和1組成的字符串,而它們通過 譯碼 就能用來表示你手頭問題的一個解。這可能是一個很差的解,也可能是一個十分完美的解,但每一個單個的染色體都代表了一個可行解(下面就將討論有關編碼的更多的細節)。初始羣體通常都是很糟的,有點象英國板球隊或美國足球隊(抱歉了!)。但不管怎樣,正如我前面說過的那樣,一個初始的羣體已經創建完成(對這一例子,不妨設共有100個成員),這樣,你就可以開始做下面列出的一系列工作(你不用擔心用粗體顯示的那些詞句,我後面馬上就會來解釋一切):

 

不斷進行下列循環,直到尋找出一個解 :

1.檢查每個染色體,看它解決問題的性能怎樣,並相應地爲它分配一個適應性分數。

2. 從當前羣體中選出2個成員。被選出的概率正比於染色體的適應性,適應性分數愈高,被選中的可能性也就愈大。常用的方法就是採用所謂的 輪盤賭選擇 輪選擇 (Roulette wheel selection )。

 3.按照預先設定的 雜交率 (Crossover Rate ),從每個選中染色體的一個隨機的點上進行雜交(crossover )。

 4.按照預定的 變異率 ( mutation rate ),通過對被選染色體的位的循環,把相應的位實行翻轉( flip )。

 5.重複步驟2,3,4,直到100個成員的新羣體被創建出來。

結束循環


以上算法中步驟1 到步驟5 的一次循環稱爲一個代(或世代,generation)。而把這整個的循環稱作一個時代(epoch) ,在我的正文和代碼中將始終都用這樣方式來稱呼。

 

3.3.1 什麼是輪盤賭選擇? ( What's the Roulette Wheel Selection ) 輪盤賭選擇是從染色體羣體中選擇一些成員的方法,被選中的機率和它們的適應性分數成比例,染色體的適應性分數愈高,被選中的概率也愈多。這不保證適應性分數最高的成員一定能選入下一代,僅僅說明它有最大的概率被選中。其工作過程是這樣的:

設想羣體全體成員的適當性分數由一張餅圖來代表 (見圖3.4),這一餅圖就和用於賭博的轉輪形狀一樣。我們要爲羣體中每一染色體指定餅圖中一個小塊。塊的大小與染色體的適應性分數成比例,適應性分數愈高,它在餅圖中對應的小塊所佔面積也愈大。爲了選取一個染色體,你要做的,就是旋轉這個輪子,並把一個小球拋入其中,讓它翻來翻去地跳動,直到輪盤停止時,看小球停止在哪一塊上,就選中與它對應的那個染色體。本章後面我就會告訴你怎樣來編寫這種程序的準確算法。

圖 3.4 染色體的輪盤賭式選擇

3.3.2 什麼是雜交率?( What's the Crossover Rate ) 雜交率就是用來確定 2個染色體進行局部的位(bit)的互換以產生2個新的子代的概率。 實驗表明這一數值通常取爲0.7左右是理想的,儘管某些問題領域可能需要更高一些或較低一些的值。

每一次,我們從羣體中選擇 2個染色體,同時生成其值在0到1之間一個隨機數,然後根據此數據的值來確定兩個染色體是否要進行雜交。如果數值低於雜交率(0.7)就進行雜交,然後你就沿着染色體的長度隨機選擇一個位置,並把此位置後面所有的位進行互換。

例如,設給定的 2個染色體爲:

10001001110010010

01010001001000011


沿着它們的長度你隨機選擇一個位置,比如說 10,然後互換第10位之後所有位。這樣兩個染色體就變成了(我已在開始互換的位置加了一個空格):

 

100010011 01000011

010100010 10010010


3.3.3 什麼是變異率?( What's the Mutation Rate? )

變異率(突變率) 就是在一個染色體中將位實行翻轉(flip,即0 變1,1變 0)的機率。這對於二進制編碼的基因來說通常都是很低的值,比如 0.001 。

因此,無論你從羣體中怎樣選擇染色體,你首先是檢查是否要雜交,然後再從頭到尾檢查子代染色體的各個位,並按所規定的機率對其中的某些位實行突變(翻轉)。

(連載一完)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章