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

    最近在學習有關遺傳算法和神經網絡方面的知識,網上查看了很多這方面的祕笈,只怪小生天生愚鈍、才疏學淺,不能很好的領悟祕笈中的真諦,往往被弄得暈頭轉向、不知所措快哭了委屈。直到有一天無意中看到了博主zzwu寫的有關這方面的文章,初讀之,如溫舊習;漸深入,覺甚好;遂一氣呵成,猶如撥雲見日、茅塞頓開。餘甚怕在茫茫Internet中再無機會拜讀之,遂收藏於此,以便衆人觀之,絕無其他不良用途。在此對博主再次深表感謝。博文轉自:http://blog.csdn.net/zzwu/article/details/561620




(連載之四).
.
扎自<遊戲編程中的人工智能技術>第三章

 清華大學出版社

(本章由zzwu譯)

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位之後所有位。這樣兩個染色體就變成了(我已在開始互換的位置加了一個空格):

 

10001001101000011

01010001010010010


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

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

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

 

3.3.4 怎麼搞的啦!( Phew! )

    如果你對上面講東西感到有些茫然,那也不必擔心!從現在開始直到本章結束,所有閱讀材料大多數都被設計用來重讀兩遍。這裏有很多需要你理解的新概念,且它們都是相互混雜在一起。我相信對於你這是最好的學習方法。當你通讀第一遍時,你有望對一些基本概念得到一些孤立的感性認識,而在閱讀第二遍時(如果我做的工作是正確的話),你就能看到各種不同的概念怎樣相互聯繫起來。而當你最後結合源程序來開始編程玩弄時,每一件事物都只是考慮怎樣周密地進行安排的問題,到那時你的工作僅僅是一種如何來提煉你的知識和技能的事了(那是比較容易的一部分)。

注意

     在本書所附的光盤的 Chaper3/Pathfinder 文件夾中,你能找到Pathfinder 工程的全部源碼。

     如果你想在進一步閱讀課文之前窺視一下工程的全貌,在 文件Chaper3 Executable中有一個預先製作好的執行程序,Pathfinder.exe

 

-連載4完-


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