遺傳算法導論

遺傳算法導論

by Marek Obitko, student of Czech Technical University.

王鄭耀 翻譯
 原文爲英語版本,你可以在這裏找到.你也可以在這裏下載到PDF格式的英語版本的文件.
 

--------------------------------------------------------------------------------
這裏我想介紹一下遺傳算法的一些基礎知識。我儘量寫的比較通俗易懂,使得以前沒有任何相關知識的讀者也能讀懂。我們只假設讀者對於計算機程序設計有一定的瞭解。這裏我們有一些Java Applet 程序用來演示遺傳算法的工作情況。

遺傳算法所涉及的範圍是很寬的,所以我們不可能涉及到它的方方面面。但是你可以從這裏得到遺傳算法的一些思想:什麼是遺傳算法?遺傳算法可以用來做什麼?這裏面沒有什麼很難的數學理論。

現在,你可以選擇下一步去瀏覽下面的內容,你也可以從左邊的菜單中任意選擇你想要瀏覽的內容。如果你不想閱讀全部的內容而只關心其中的一部分,你也可以跳過去直接去首頁面。

這裏還有一個日語譯本。

 
  

 I 簡介 

前言 

遺傳算法是進化計算技術的一部分,而進化計算技術在人工智能領域得到飛速的發展。

你或許已經在想:遺傳算法是不是受到了達爾文進化論的啓發?簡單地說,用遺傳算法求解問題時,問題的解是在不斷進化中得到的。

  

歷史 

二十世紀六十年代,I.Rechenberg在他的《演化戰略》中第一次引入了進化算法的思想(起初稱之爲Evolutionsstragegie)。他的這一思想逐漸被其他一些研究者發展。遺傳算法(Genetic Algorithms) 是John Holland 發明的,後來他和他的學生及他的同事又不斷髮展了它。終於,在1975年John Holland 出版了專著《自然系統和人工系統中的自適應》(Adaption In Natural and Artificial Systems)。

1992年,John Koza 曾經使用遺傳算法編出新的程序去做一些具體的工作。他稱他的這種方法爲“進化規劃”(Genetic Programming,簡稱GP)。其中使用了LISP規劃方法,這是因爲這種語言中的程序被表示爲“分析樹”(Parse Tree),而這種遺傳算法就是以這些分析樹爲對象的。

  

II  生物學背景 

基因 

所有的生物都是由細胞組成的。在每一個細胞中都有想同序列的染色體。染色體是一串DNA的片斷,它爲整個有機體提供了一種複製模式。

染色體是由基因組成的,或者說染色體就是一塊塊的基因。每一個基因爲一個特定的蛋白質編碼。或者更簡單的說,每一個基因爲生物體的某一特定特徵編碼,比如說眼睛的顏色。所有可能的某一特定特徵的屬性(比如,藍色,桔黃色等)被稱之爲等位基因。每一個基因在染色體上都有其特定的位置,這個位置一般被稱作位點(Locus)。

全部序列的基因物質(或者全部的染色體)稱之爲基因組(或染色體組)(Genome)。基因組上特定序列的基因被稱作基因型(Genotype)。基因型和後天的表現型兩者是有機體的顯性、生理和心理特徵比如說眼睛的顏色、智力的基礎。

  

複製(Repeoduction) 

在複製中,首先發生的是交叉(Crossover)。來自於父代的基因按照一定的方式組成了新的基因。新的子代還可能發生變異(Mutation)。變異的意思是DNA上的某一些成分發生了一點點的變化。這些改變可能是由於在由父代到子代的基因複製中出現的誤差。

生物體的適應度由生物體自身是否能生存來度量的。

  

III 搜索空間 

搜索空間(Search Space) 

在很多情況下,我們解決一個問題就是從一大堆的數據中尋找一個解,而通常這個解都是混雜在數據中的。所有可行解(Feasible Solution可行解就是滿足了一定約束條件的解)組成的空間稱之爲搜索空間(也可以稱之爲狀態空間)。搜索空間中的每一個點都是一個可行解。每一個可行解都可以被它的函數值或者它的適應度所標記。記住:問題的解就是搜索空間中的一個點,於是我們就是要從搜索空間中找到這個點。

這樣,求解問題就可以轉化爲在搜索空間中尋找極值點(最大值或者最小值點)。搜索空間在求解問題時可能是完全已知的,但一般來說我們只知道一些孤立的點,然後我們逐漸地生成其它點。問題是,這個搜索過程可能很複雜,我們甚至不知道該去哪裏搜索或者該從是麼地方開始搜索。事實上,有很多尋找合適解(注意:不一定是最優解)的方法,比如說爬山法(Hill Climbing)禁止接近法(Tabu Search),模擬退火算法(Simulated Annealing)以及遺傳算法等等.用遺傳算法求解出來的解一般被認爲是一個比較好的解,因爲我們沒有辦法證明它是最優解.

  

NP難題(NP-hard) 

舉一個比較難的NP問題,這個問題無法用傳統的方法解決。

我們知道很多問題有快速的算法(多項式算法).但是,也有很多問題是無法用算法解決的。事實上,已經證明很多問題不可能在多項式時間內解決出來。

但是,有很多很重要的問題他們的解雖然很難求解出來,但是他們的值卻是很容易求可以算出來的。這種事實導致了NP完全問題。NP表示非確定的多項式(Nondeterministic Polynomial),意思是這個問題的解可以用非確定性的算法“猜”出來。如果我們有一個可以猜想的機器,我們就可以在合理的時間內找到一個比較好的解。

NP-完全問題學習的簡單與否,取決於問題的難易程度。因爲有很多問題,它們的輸出極其複雜,比如說人們早就提出的一類被稱作NP-難題的問題。這類問題不像NP-完全問題那樣時間有限的。

因爲NP-問題由上述那些特徵,所以很容易想到一些簡單的算法――把全部的可行解算一遍。但是這種算法太慢了(通常時間複雜度爲O(2^n))在很多情況下是不可行的.

現在,沒有知道有沒有那種精確的算法存在。證明存在或者不存在那種精確的算法這個沉重的擔子就留給了新的研究者了,或許你就是J。現在很多人認爲那種精確的算法是不存在的,所以他們試圖尋找一種替代的算法――比如說這裏的遺傳算法。

這裏的NP-問題的例子,旅行商問題(Travelling Salesman Problem)或揹包問題(knapsack problem),都是滿意性問題。

NP問題的簡述你可以在這裏看到。

  

IV 遺傳算法 

基本思想 

遺傳算法受到達爾文進化論的影響很大。在遺傳算法中,問題的解是逐漸進化得到的!

遺傳算法的計算從一組可能解開始,這組解被稱作種羣(Population),在算法中被表示成基因。我們又把種羣中的解拿出來去構成新的一個種羣,這是因爲我們期望新的種羣要比舊的種羣要好!當然,新的種羣中的解要有這樣的性質,就必須按照它的適應度去選擇,適應度越高,它參與構造新的種羣的機會就越大。

這個過程一次又一次的重複,一直到我們所給的約束條件滿足爲止,比如說種羣中解得個數或者種羣的良好程度。

  

遺傳算法的基本結構 

1[開始] 按照問題的特點隨機產生一個擁有N個然的色體的種羣;

2[適應度計算] 用適應度函數f(x)計算種羣每一個基因的適應度;

3[產生新的種羣] 重複以下步驟,一直到新的母體羣建立起來爲止;

1.[選擇]按照種羣中的各個基因的適應度從中選擇兩個父代基因(適應度越大,機會越大);

2.[交叉]以一定的交叉概率交叉兩個父代的基因以產生子代。交叉完成之後,子代完完全全是父代的複製;

3.[變異(Mutation)]以一定的概率對子代基因的的每一個位點(Locus)進行變異;

4.[接受]把這個子代放到新的種羣中去;

4[替換] 對新產生的種羣進行更深入的算法運算;

5[測驗] 如果終止條件滿足,則停止;並且把當前母體羣中最好的解輸出;

6[循環]如果5不滿足,則轉到2;繼續進行

一些說明 

你可以發現這個遺傳算法的基本結構是很一般的。在具體的問題中,我們還要做很多工作以實現算法。

首先的問題是怎樣創建一個基因?怎樣對它們編碼?這些問題都是和對基因的操作(交叉、變異)密切聯繫的。編碼、交叉和變異我們將在下一章介紹。

下一個問題是怎樣從父代種羣中選擇用來交叉的父代。方法有很多,但是最基本的思想是:選擇好的父代(因爲我們認爲好的父代可以產生好的子代)。你或許在想:僅僅從產生的子代中選擇基因去構造新的種羣可能會丟失掉上一代種羣中的很多信息。這確實是事實,我們可以使用精英主義(Elitism)方法。也就是說,種羣中最好的那個基因我們將毫無改變的複製到新的種羣中。顯然,任何時刻產生的一個最優解的解都可以存活到算法結束。

  

還有很多問題我們都將在後面的章節中陸續討論。

你可能在想,爲什麼遺傳算法能夠得到我們需要的結果呢?這個問題部分地可以被Holland的模式定理(Schema Theorem)解決。可是,這個模式定理現在被很多人批評,因爲很多人認爲它是有問題的。

如果你有興趣的話,你可以在這裏找到更多的資料!

  

V 遺傳算法中的算子 

概述 

在前面的遺傳算法的基本結構中我們注意到交叉和變異是遺傳算法中最重要的部分。算法的結果受交叉和變異的影響最大。當然,在我們討論交叉和變異之前我們先要介紹一些基因的信息。

  

基因的編碼 

基因在一定能夠意義上包含了它所代表的問題的解在裏面。最常用的編碼方式是二進制串(Binary String)。於是基因可以表示爲:

  

1號基因
 1101100100110110
 
2號基因
 1101111000011110
 

  

每一個基因用一個二進制串表示,這個二進制串的每一位表示解的某些特徵。或者,整個二進制串表示一個數,比如說在基本的遺傳算法的Applet中就是如此。

當然,編碼的方法有很多。選用什麼方法編碼主要取決於所要解決的問題本身。比如說,有的問題直接用整數或者實數來編碼可能更好!

  

交叉 

當我們決定了用什麼方法來編碼後,我們既可以考慮下一步了――交叉。交叉的本質就是從種羣中選擇父代以生成新的母體羣。最簡單的方法就是隨機的選擇一個交叉點,在交叉點之前的部分來自父代1號基因,交叉點之後的部分來自來父代的2號基因。

  

用圖可以表示爲上述過程如下:(|表示交叉點)

  

1號基因 
 11011|00100110110 
 
2號基因 
 11011|11000011110 
 
子代1
 11011|11000011110
 
子代2
 11011|00100110110
 

  

當然,交叉的方式也很多。比如說一個直接的對這個方法的改良就是多選擇幾個交叉點。交叉可能很複雜,這有可能是基因編碼方法的原因!對特定的問題我們要選擇特定的交叉方法以使得遺傳算法的結果比較好!

  

變異 

一旦交叉完成,變異就要開始了。變異的目的是防止種羣中的解跑到局部極值去。變異是對子代的隨機的改變。對二進制串編碼方式來說,我們可以隨機地改變子代中的某個位點的數字(1變爲0,或者0變爲1)。於是,變異可以用表表示如下:

  

變異前的子代1
 1101111000011110
 
變異前的子代2
 1101100100110110
 
變異後的子代1
 1100111000011110
 
變異後的子代2
 1101100101110110
 

  

顯然,變異取決於編碼方式和交叉方法。比如說變異可以是交叉兩個基因。

  

VI 遺傳算法的一個例子 

求函數最小值

問題 

在搜索空間那一章中我們已經提到:我們遇到的很多問題都可以轉化爲求解一個函數的極值。下面這個例子就是恰好是這種問題。

給定一些函數,然後用遺傳算法求這些函數在給定空間中的最小值。對於其他一些問題,通過定義搜索空間和適應度函數,我們通常可以轉化爲這種問題。

 

VII 遺傳算法中的一些參數 

  

交叉和變異的概率 

遺傳算法中有兩個基本參數:交叉的概率和變異的概率。

交叉的概率是說交叉行爲發生的機率大小,如果機率爲0,那麼子代就完完全全和父代一樣。只要存在交叉,子代的基因是由幾個父代的基因的中的片段組合而成的,所以就不完全和父代一樣。如果交叉100%的發生,那麼所有的子代都是由交叉產生的。如果交叉的概率爲0%,那麼子代就是父代的完全複製。(注意:但是,這並不意味着子代就和父代完全一樣)

交叉過程的目的就是希望新的基因是由舊的基因中好的部分組合而成的,從而新的基因比原先的基因要好。當然把舊的種羣中的一部分基因完全保留到下一代中去也是很有意義的。

變異的概率說的是基因的某些部分發生變異的概率。如果沒有變異的話,子代就和交叉過的父代沒有任何區別。只要存在變異,子代的基因就會發生改變。如果變異的概率爲100%,那麼所有的子代都會改變。如果交叉的概率爲0%,那麼子代就不會改變。變異的目的是爲了防止遺傳算法的解跑到局部極值點,所以,變異應該發生。但是變異不能發生的太頻繁,否則的話就變成了隨機搜索了。

  

其他一些參數 

遺傳算法中還有一些其它參數,比如說種羣的大小就是一個很重要的參數。

種羣的大小是說每一代種羣中所含基因的多少。如果其中的基因太少,則遺傳算法中進行交叉操作的機會就越少,所以導致我們的算法只是考察了搜索空間的一部分。另一方面,如果基因太多,則遺傳算法的速度就會變慢。進一步的研究表明,在一定的條件下(這些條件主要由問題本身和編碼方法決定)增大種羣的大小是沒有意義的,因爲它不會加快遺傳算法的計算速度。

  

VIII 函數的極值點 

問題 

這裏又是一個求函數極值的問題,但是在這個例子中我們的函數是一個二元函數。

例子(此處是JAVA程序,略) 

  

IX 選擇算子 

  

簡介 

正如我們在遺傳算法基本結構中已經知道的那樣,用來交叉的基因是從從父代種羣中選擇出來.那麼怎樣選擇這些基因呢?根據達爾文的進化論,適應環境的(好的)基因將生存下來並且交叉產生新的一代。選擇好的基因的方法有很多,比如輪盤賭選擇方法(Roulette Wheel Selection)、(Boltman Selection)、錦標賽選擇方法(Tournament Selection)、分級選擇方法(Rank Selection)、穩定狀態選擇方法(Steady State Selection)等等。

在本章中我們將選擇部分做深入一點的說明。

  

輪盤賭選擇方法(Roulette Wheel Selection) 

父代的選擇是根據他們的適應度做出的。基因越是適應環境,那麼它被選擇到的機會就越大。想像一個輪盤賭的機器上放置了種羣中所有的基因。每一個基因所佔的地方的大小和它的適應度成正比。如下圖所示:

  



  

然後開始扔彈子,扔到那個地方就把對應的基因拿出來。顯然,適應度越大的基因被選到的機會就越大。

  

這個過程可以被下面的這個算法來模擬:

1.[求和] 計算所有種羣的適應度的和S; 

2.[選擇] 在區間(0,S)上隨機的產生一個數r; 

3.[循環] 從某個基因開始,逐一取出基因來,把它的適應度加到s上去(s開始爲0),如果s大於r,則停止循環並返回當前基因; 

當然,第一步在計算中只需要執行一次。

  

分級選擇方法(Rank Selection) 

前面這中選擇方法很簡單,但是當適應度變化比較大時就會有問題。比如說,當前種羣中最好的基因(適應度最大)的適應度佔S的90%的時候,那麼其它基因就很少有機會被選擇到。

分級選擇方法首先把種羣分幾個等級。然後,每一個基因收到各自等級中的適應度。我們定義最差的等級的適應度爲1;次差的爲2等等,最好的那個級適應度定義爲N(N就是種羣中基因的個數)。

  

通過下面這兩個圖,你可以看看在分級前後有什麼改變。

  



 

  



  

這樣,所有的基因都有機會被選擇到。但是這樣又會導致算法的收斂速度變慢,因爲最好的基因與其它基因的差別被縮小了。

  

穩定狀態選擇方法(Steady State Selection) 

其實,這並不是選擇父代的特殊方法。這種方法的主要思想是有很多的基因要保留到下一代中!

  

於是遺傳算法將按照如下的方式進行:

在每一代中選擇一少部分基因(與適應度相符合)來構造子代。接着,父代中一部分基因(與適應度不符合的)被新產生的子代所代替,父代中其它的人基因被保留到新的一代中。

  

精英主義 

精英主義思想我們已經在前面介紹過了。這種思想是說當利用交叉和變異產生新的一代時,我們有很大的可能把在某個中間步驟中得到的最優解丟失。

精英主義正如它的語義所蘊含的那樣,在每一次產生新的一代時,我們首先把當前最優解原封不動的複製到新的一代中。然後按照我們前面所說的那樣做就行。

精英主義方法可以大幅提高運算速度,因爲它可以防止丟失掉找到的最好的解!

  

X 編碼(Encoding) 

  

簡介 

當你開始用遺傳算法求解問題時,基因的編碼是一個很重要的問題。編碼方法是依賴於問題本身的。 

在這一章中我們將介紹幾種在實際中已經取得成功的方法。 

  

二進制編碼 

二進制編碼是最常見的一個編碼方法,這主要是因爲用遺傳算法編的第一個程序就是用二進制編碼的。 

在使用二進制編碼時,每一個基因就是一個由0或者1組成的字符串。 

  

  

基因A 
 101100101100101011100101 
 
基因B 
 111111100000110000011111 
 

  

二進制編碼的基因 

  

使用二進制編碼時,即使等位基因的數量不大,我們也可以得到很多種可能的基因。另一方面,這種方法對於很多問題來都很不自然,所以有時候在交叉和變異結束後還要做一些調整。 

  

――――――――――――――――― 

一個問題:揹包問題(Knapsack Problem) 

問題:這裏有一些給定價值和大小的東西。揹包的容積是給定的。請你在不超過揹包容積的情況下往揹包中裝東西,以使得揹包中東西的價值達到最大。 

編碼方法:二進制的每一位代表對應的東西是否在揹包中。 

――――――――――――――――― 

  

互換編碼(Permutation Encoding) 

互換編碼可以用來解決排序問題,比如說旅行商問題(Travelling Salesman Problem)和任務排序問題(Task Ordering Problems)。

  

基因A 
 1 5 3 2 6 4 7 9 8 
 
基因B 
 8 5 6 7 2 3 1 4 9 
 

  

互換編碼的例子 

  

互換編碼只是對排序問題有用。即使是排序問題中的某些問題採用互換編碼,在交叉和變異後還必須作出一些調整以使得基因保持一致(比如,有可能產生實數)。 

――――――――――――――――― 

一個問題:旅行商問題(Travelling Salesman Problem)――TSP 

問題: 給定一些城市和這些城市間的距離。旅行商要到所有這些城市中去,但是它不能花太多時間。尋找一個到所有這些城市的順序以使得旅行路程最短。

編碼方法:基因表示的是訪問各個城市的順序。 

――――――――――――――――― 

  

值編碼(Value Encoding) 

在很多問題中我們還可以採用直接的值編碼,也就是說用一些比較複雜的數來編碼,比如說實數。因爲二進制編碼在這類問題中不好用。 

在值編碼中,每個基因就是一串取值。這些取值可以是與問題有關任何值:整數,實數,字符或者其他一些更復雜的東西。 

  

基因A 
 1.2324   5.3243   0.4556   2.3293   2.4545 
 
基因B 
 ABDJEIFJDHDIERJFDLDF 
 
基因C 
 (back), (back), (right), (forward), (left) 
 

值編碼的例子 

  

值編碼對於一些特殊的問題是很有效的。但是,對於這種編碼方法它的交叉和變異算子就要按照問題和編碼方法具體的去設計。 

――――――――――――――――― 

一個問題:爲神經網絡尋找權重(Finding Weights For Neural Networks) 

問題:這裏有一些給定了結構的神經網絡算法。求要輸入的神經元的權重以使得網絡有我們想要的輸出。 

編碼方法:用一個實數表示對應的輸入的權重。 

――――――――――――――――― 

  

樹形編碼(Tree Encoding) 

樹形編碼主要用於遺傳規劃中的演化編程或者表示。 

在樹形編碼中,每個基因都是由數字或符號組成的樹形結構。這些符號可以是函數,也可以是規劃中使用的一些命令。 

  

基因A 
 基因B 
 
 

  
   

 
 
( +  x  ( /  5  y ) )
 ( do_until  step  wall )
 

數形編碼的一個例子 

數形編碼對演化規劃這類問題很適合.規劃語言LISP經常在其中使用,因爲規劃中使用的很多程序可以用數形結構很容易的表示出來,從而交叉算子和變異算子相對也簡單. 

  

――――――――――――――――― 

一個問題:爲給定的自變量和函數值選擇一個函數(Finding A Function From Given Values) 

問題:給定了很多組輸入和輸出。請你爲這些輸入輸出選擇一個函數,使得這個函數把每個輸入儘可能近地映射爲輸出。 

編碼方法:基因就是樹形結構中的一些函數。 

――――――――――――――――― 

  

XI 交叉和變異 

  

簡介 

交叉和變異是遺傳算法中的兩個最基本的算子。遺傳算法的好壞由他們決定。這兩個算子的類型和實現是由問題本身和編碼方法決定的。 

交叉和變異的方式有很多。這一章我們我們介紹幾種例子,通過這些例子你可以去體會交叉算子和變異算子的構造方法。 

  

二進制編碼 

1.  交叉算子 

◆     單交叉點交叉算子(Single Point Crossover):選擇一個交叉點,子代在交叉點前面的基因從一個父代基因那裏得到,後面的部分從另外一個父代基因那裏得到; 

  



11001011+11011111 = 11001111 

  

◆     雙交叉點交叉算子(Two Point Crossover): 選擇兩個交叉點,子代基因在兩個交叉點間部分來自一個父代基因,其餘部分來自於另外一個父代基因. 

  



11001011 + 11011111 = 11011111 

  

◆     均勻交叉算子 (Uniform Crossover):子代基因的每一個位點是隨機地來自於兩個父代基因中的一個的; 

  



11001011 + 11011101 = 11011111

  

◆     算術交叉算子(Arithmetic Crossover):對父代基因做一個代數運算從而產生一個新的基因。下面就是使用和運算(AND)實現的: 

  



  

11001011 + 11011111 = 11001001 (AND)

  

2.  變異算子 

◆     位點轉換算子(Bit Inversion):選擇一些位點然後將這些地方的0,1互換; 



11001001  =>  10001001

  

互換編碼 

1.  交叉算子 

◆     單交叉點交叉算子(Single Point Crossover):選擇一個交叉點,子代的從初始位置出發的部分從一個基因複製,然後在另一個基因中掃描,如果某個位點在子代中沒有,就把它添加進去; 

注意:這個算法交叉點後面的部分可以有很多中具體的方法; 

(1 2 3 4 5 6 7 8 9) + (4 5 3 6 8 9 7 2 1) = (1 2 3 4 5 6 8 9 7)

  

2.  變異算子 

◆     變序算子(Order Changing):從子代基因中選擇兩個數,交換它們的位置; 

(1 2 3 4 5 6 8 9 7) => (1 8 3 4 5 6 2 9 7)

  

值編碼 

1.  交叉算子 

上面二進制編碼中所由交叉算子都適用。 

2.  變異算子 

◆     填值算子(Adding Crossover):對於實數編碼的算法,可以給選定的一些數添加一個小的實數(擾動): 

(1.29  5.68  2.86  4.11  5.55)  =>  (1.29  5.68  2.73  4.22  5.55)

  

樹形編碼 

1.  交叉算子 

◆     樹交叉算子(Tree Crossover):在兩個父代基因上選一個交叉點(位置),然後把他們在交叉點下面的部分交換就行; 

2. 變異算子 

◆     改變交叉算子(Changing Operator):選擇一些節點,然後把他們換掉; 

  

XII 旅行商問題(TSP)
(Travelling Salesman Problem) 

  

問題背景 

旅行商問題(TSP):給定一些城市和這些城市間的距離。旅行商要到所有這些城市中去,但是它不能花太多時間。尋找一個到所有這些城市的順序以使得旅行路程最短。換句話的說,就是要從有N個節點的完全圖上尋找最短Hamiltonian 遍歷。 

  

算法實現 

我們將使用含有16個基因的種羣,使用交換編碼方式――你可以在前一章中找到有關交換編碼方式的解釋,以及怎樣用這種編碼方法來對TSP問題編碼。這個TSP是在定義了歐氏距離的完全圖上求解的,所謂完全圖就是指圖中的每一個節點都和其它節點直接相連。 

注意,增加或者刪除城市時要重新創建新的基因,然後重新開始。 

你可以從下面這些交叉和變異算子中選擇一個交叉算子和變異算子使用。我給它們簡單的介紹。 

交叉算子 

●          一點算法:子代的基因一部分從父代一個基因上按父代的位置複製,其它部分按照父代第二個基因上原來的順序複製到子代上; 

●          兩點算法:子代的基因有兩個部分從父代一個基因上按父代的位置複製,其它部分按照父代第二個基因上原來的順序複製到子代上; 

●        不交叉:不交叉,完從父代複製過來; 

  

變異算子 

●          普通隨機算法:選擇一少部分城市,把它們的順序交換; 

●          改善隨機算法:選擇一少部分城市,如果交換順能改善解則交換它們的位置; 

●          改善對稱算法:對稱地選擇一些城市,如果交換順能改善解則交換它們的位置; 

●          優化隨機算法:先進行“普通隨機算法”,然後進行“改善隨機算法”; 

●          優化對稱算法:先進行“普通隨機算法”,然後進行“改善對稱算法”; 

●          不變異:不變異; 

  

例子 

下面這個例子就是一個TSP的演示,按“Change View”顯示種羣向最優解收斂的過程或者逆序顯示。你可以用鼠標在圖上添加或者刪除城市。添加或者刪除城市後在城市中間就會產生隨機的路線,因爲程序已經建立了新的種羣。當然,別忘記我們是在完全圖上解TSP問題的。 

  

選擇不同的交叉算子和變異算子讓程序去計算(並且不斷增加城市的數量),看看這個遺傳算法程序會有哪些變化。 

  

這個程序已知的BUG:在進行操作之前,先點擊一下Change View,否則在一些瀏覽器上你會發現程序運行時圖形沒有任何變化。我是用的是CardLayout,我不知道怎樣讓這個Applet正常工作。如果你知道,請你給我發Email告訴我。 





  

XIII 推薦 

遺傳算法中的參數: 

這一章中我們給那些想要使用遺傳算法來解決問題的人推薦一些材料。當然,這些推薦的材料都是很一般的。所以在你的具體問題之中,你可能不得不自己實驗某些參數,因爲到目前爲止,還沒有一個適用於遺傳算法所有應用領域的關於算法參數的理論。 

下面這些推薦的材料都是遺傳算法研究中實驗得出的結果,這些結果很多隻適用於二進制編碼。 

  

●          交叉率 

交叉率一般來說應該比較大,推薦使用80%-95%。(還有自己得出的結果說60%最好。) 

●          變異率 

變異率一般來說應該比較小,據報道使用0.5%-1%最好。 

●          種羣的規模 

讓人感到驚奇的是,比較大的種羣的規模並不能優化遺傳算法的結果。種羣的大小推薦使用20-30,(還有自己得出的結果說50-100最好。)一些研究表明,種羣規模的大小取決於編碼的方法,具體的說就是編碼串(Encoded String)的大小。也就是說,如果說採用32位爲基因編碼的時候種羣的規模大小最好爲32的話,那麼當採用16位爲基因編碼時種羣的規模相應應變爲原來的兩倍。 

●          選擇算法 

推薦使用基本的輪盤賭選擇方法,但是有時候分級選擇方法可能會更好。查看 選擇 那一章,你可以看看它們的優點和缺點。當然還有一些比較複雜的方法可供使用,這些算法可以在遺傳算法程序運行過程中自動改變參數的取值,基本上算法的行爲和模擬退火算法(Simulated Annealing)差不多。如果你沒有使用特別的方法來保存已經發現的最優值的話,你一定要使用精英主義方法。你也可以嘗試使用一下穩定狀態選擇方法(Steady State Selection)。 

●          編碼方法 

編碼方法取決於問題本身和問題中實例的個數。查看 編碼 這一章你可以得到一些建議或者這裏有一些其它資源。 

●          交叉和變異的類型 

這兩種算子取決於問題和編碼方法。查看 算子 你可以得到一些建議。你也可以查看下面這些站點。 

  

遺傳算法的應用 

遺傳算法已經在很多複雜問題(比如說NP-難題)、機器學習和簡單的進化規劃中得到了使用。遺傳算法在一些藝術領域也取得了很大成就,比如說進化圖片和進化音樂。 

遺傳算法的優勢在於他的並行性。遺傳算法在搜索空間中非常獨立地移動(按照基因型而不是表現型),所以它幾乎不可能像其它算法那樣“粘”在局部極值點。 

遺傳算法更容易實現。一旦你有了一個遺傳算法的程序,如果你想解決一個新的問題,你只需要針對新的問題重新進行基因編碼就行。如果編碼方法也相同,那你只需要改變一下適應度函數就可以了。當然,選擇編碼方法和適應度函數是一件非常難的問題。 

遺傳算法的缺點是它的計算時間太長。它們可能比其他任何算法需要的時間都長。當然,對於今天的高速計算機來說,這已經不是個大問題了。 

爲了讓讀者更好地瞭解遺傳算法所解決的問題,這裏有一個關於遺傳算法應用的小列表: 

●          非線性動態系統——預測,數據分析; 

●          神經網絡的結構和權重設計; 

●          自動控制導彈的軌道設計; 

●          進化LISP規劃(遺傳規劃); 

●          戰略計劃; 

●          蛋白質分子的形狀的尋找; 

●          旅行商問題和時間序列排序問題; 

●          構圖的函數問題; 

  

更多的資料你可以通過附件中的 鏈接 找到。 

  

  

關於這些頁面 

這些頁面是Czech Technical University大學的學生Marek Obitko1998年9月在Hochschule für Technik und Wirtschaft Dresden (FH) (University of Applied Sciences)期間開發而成的。 

最初幾個版本的JAVA Applets是1998年夏季學期時在Czech Technical University在assoc教授的指導下寫成的。在Dresden停留期間會又受到Hochschule für Technik und Wirtschaft Dresden的 Walter P?tzold 教授的指導。 

頁面和JAVA Applets是由Marek Obitko1998年創作的。如果你有什麼意見和建議,你可以通過Email和作者聯繫。

 

  

  

答疑 

  

1.  問題:Applets不工作,我看到就是錯誤。我該怎麼辦? 

回答:首先,你先看一看 推薦瀏覽器。 

     你的瀏覽器可能不是Java1.1版本,甚至於有一些瀏覽器雖然說是支持Java1.1版本,其實只支持Java1.0版本(其中沒有新的事件驅動模式)。我推薦你升級你的瀏覽器。 

     還有時候錯誤發生是因爲傳播過程中,在這種情況下你只需要重新下載一次或者簡單地過一段時間後再試一次就可以了。如果類似於Class Population Not Found 等的錯誤發生,你可以重新下載http://cs.felk.cvut.cz/~xobitko/ga/java/Population.class然後連同Applet一起把網頁下載下來就可以運行了。

  

2.  問題:我有一個有關一個關於遺傳算法的問題,你能幫我嗎? 

回答:當然可以的。你可以給我發Email。如果我有時間(這種情況不多)我就會幫助你的。最好,你把問題Post到新聞組comp.ai.genetic上,在那裏你的問題會有更多的機會被某些人回答的。 

  

3.  問題:這個網站可以作爲一個文件下載嗎? 

回答:可以。可以作爲一個壓縮的PDF文件下載。在這裏下載Acrobat Reader ,此軟件可以閱讀.那個PDF文件。當然你無法看到相關的Applet演示。

  

4.  問題:你有沒有一個類似的關於神經網絡的主頁? 

回答:我很想找時間去做一個。目前你可以瀏覽下面這個  頁面  ,上面有一個使用後傳播神經網絡方法制作的說明性的預報Applet。 

  

 5.  問題:有沒有這個網站的翻譯版本? 

回答:這裏本網站上網日語版本和漢語版本。 

      日語版本在http://gekms3.tmit.ac.jp/mana/file/ga/index.html 由Ishii Manabu翻譯

如果我有時間我會把他翻譯成捷克語。

歡迎大家把這個站點翻譯成其它語言,如果你想翻譯的話,請你聯繫我。 

  

6.  問題:有沒有這個網站的訪問統計? 

回答:有,網站的訪問統計在這裏。 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章