超詳細的遺傳算法(Genetic Algorithm)解析


https://blog.csdn.net/u010451580/article/details/51178225
https://www.jianshu.com/p/c82f09adee8f
https://my.oschina.net/u/1412321/blog/192454

00 目錄

  • 遺傳算法定義
  • 生物學術語
  • 問題導入
  • 大體實現
  • 具體細節
  • 代碼實現

01 什么是遺傳算法?

1.1 遺傳算法的科學定義

遺傳算法(Genetic Algorithm, GA)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。

其主要特點是直接對結構對象進行操作,不存在求導和函數連續性的限定;具有內在的隱並行性和更好的全局尋優能力;采用概率化的尋優方法,不需要確定的規則就能自動獲取和指導優化的搜索空間,自適應地調整搜索方向。

遺傳算法以一種群體中的所有個體為對象,並利用隨機化技術指導對一個被編碼的參數空間進行高效搜索。其中,選擇、交叉和變異構成了遺傳算法的遺傳操作;參數編碼、初始群體的設定、適應度函數的設計、遺傳操作設計、控制參數設定五個要素組成了遺傳算法的核心內容。

1.2 遺傳算法的執行過程(參照百度百科)

遺傳算法是從代表問題可能潛在的解集的一個種群(population)開始的,而一個種群則由經過基因(gene)編碼的一定數目的個體(individual)組成。每個個體實際上是染色體(chromosome)帶有特征的實體。

染色體作為遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現,如黑頭發的特征是由染色體中控制這一特征的某種基因組合決定的。因此,在一開始需要實現從表現型到基因型的映射即編碼工作。由於仿照基因編碼的工作很復雜,我們往往進行簡化,如二進制編碼。

初代種群產生之后,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇(selection)個體,並借助於自然遺傳學的遺傳算子(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。

這個過程將導致種群像自然進化一樣的后生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。

1.3 遺傳算法過程圖解

 
image

02 相關生物學術語

為了大家更好了解遺傳算法,在此之前先簡單介紹一下相關生物學術語,大家了解一下即可。

  • 基因型(genotype):性狀染色體的內部表現;

  • 表現型(phenotype):染色體決定的性狀的外部表現,或者說,根據基因型形成的個體的外部表現;

  • 進化(evolution):種群逐漸適應生存環境,品質不斷得到改良。生物的進化是以種群的形式進行的。

  • 適應度(fitness):度量某個物種對於生存環境的適應程度。

  • 選擇(selection):以一定的概率從種群中選擇若干個個體。一般,選擇過程是一種基於適應度的優勝劣汰的過程。

  • 復制(reproduction):細胞分裂時,遺傳物質DNA通過復制而轉移到新產生的細胞中,新細胞就繼承了舊細胞的基因。

  • 交叉(crossover):兩個染色體的某一相同位置處DNA被切斷,前后兩串分別交叉組合形成兩個新的染色體。也稱基因重組或雜交;

  • 變異(mutation):復制時可能(很小的概率)產生某些復制差錯,變異產生新的染色體,表現出新的性狀。

  • 編碼(coding):DNA中遺傳信息在一個長鏈上按一定的模式排列。遺傳編碼可看作從表現型到基因型的映射。

  • 解碼(decoding):基因型到表現型的映射。

  • 個體(individual):指染色體帶有特征的實體;

  • 種群(population):個體的集合,該集合內個體數稱為種群

03 問題引出與解決

3.1 一元函數最大值問題

        遺傳算法的有趣應用很多,諸如尋路問題,8數碼問題,囚犯困境,動作控制,找圓心問題(在一個不規則的多邊形中,尋找一個包含在該多邊形內的最大圓圈的圓心),TSP問題,生產調度問題,人工生命模擬等。下面我以袋鼠為例子講講遺傳算法。(因為袋鼠會跳)

 

     遺傳算法中每一條染色體,對應着遺傳算法的一個解決方案,一般我們用適應性函數(fitness function)來衡量這個解決方案的優劣。所以從一個基因組到其解的適應度形成一個映射。可以把遺傳算法的過程看作是一個在多元函數里面求最優解的過程。可以這樣想象,這個多維曲面里面有數不清的“山峰”,而這些山峰所對應的就是局部最優解。而其中也會有一個“山峰”的海拔最高的,那么這個就是全局最優解。而遺傳算法的任務就是盡量爬到最高峰,而不是陷落在一些小山峰。(另外,值得注意的是遺傳算法不一定要找“最高的山峰”,如果問題的適應度評價越小越好的話,那么全局最優解就是函數的最小值,對應的,遺傳算法所要找的就是“最深的谷底”)
                                                          

問題的提出與解決方案:

   讓我們先來考慮考慮下面這個問題的解決辦法。

           已知一元函數::

      

現在要求在既定的區間內找出函數的最大值  

函數圖像如下:

 
image

現在我們要在既定的區間內找出函數的最大值。

學過高中數學的孩紙都知道,上面的函數存在着很多的極大值和極小值。而最大值則是指定區間的極大值中的最大的那一個。從圖像上具體表現為,極大值像是一座座山峰,極小值則是像一座座山谷。因此,我們也可以把遺傳算法的過程看作是一個在多元函數里面求最優解的過程。

這些山峰對應着局部最優解,其中有一個山峰是海拔最高的,這個山峰則對應的是全局最優解。那么,遺傳算法要做的就是盡量爬到最高峰,而不是困在較低的小山峰上。(如果問題求解是最小值,那么要做的就是盡量走到最低谷,道理是一樣的)。

 
image

3.2 "袋鼠蹦跳"

既然我們把函數曲線理解成一個一個山峰和山谷組成的山脈。那么我們可以設想所得到的每一個解就是一只袋鼠,我們希望它們不斷的向着更高處跳去,直到跳到最高的山峰。所以求最大值的過程就轉化成一個“袋鼠跳”的過程。

下面介紹介紹“袋鼠跳”的幾種方式。

  • 爬山算法(最快上山爬山法):從搜索空間中隨機產生鄰近的點,從中選擇對應解最優的個體,替換原來的個體,不斷重復上述過程。因為爬山法只對“鄰近”的點作比較,所以目光比較“短淺”,常常只能收斂到離開初始位置比較近的局部最優解上面。對於存在很多局部最優點的問題,通過一個簡單的迭代找出全局最優解的機會非常渺茫。(在爬山法中,袋鼠最有希望到達最靠近它出發點的山頂,但不能保證該山頂是珠穆朗瑪峰,或者是一個非常高的山峰。因為一路上它只顧上坡,沒有下坡。)

  • 模擬退火:這個方法來自金屬熱加工過程的啟發。在金屬熱加工過程中,當金屬的溫度超過它的熔點(Melting Point)時,原子就會激烈地隨機運動。與所有的其它的物理系統相類似,原子的這種運動趨向於尋找其能量的極小狀態。在這個能量的變遷過程中,開始時,溫度非常高, 使得原子具有很高的能量。隨着溫度不斷降低,金屬逐漸冷卻,金屬中的原子的能量就越來越小,最后達到所有可能的最低點。利用模擬退火的時候,讓算法從較大的跳躍開始,使到它有足夠的“能量”逃離可能“路過”的局部最優解而不至於限制在其中,當它停在全局最優解附近的時候,逐漸的減小跳躍量,以便使其“落腳 ”到全局最優解上。(在模擬退火中,袋鼠喝醉了,而且隨機地大跳躍了很長時間。運氣好的話,它從一個山峰跳過山谷,到了另外一個更高的山峰上。但最后,它漸漸清醒了並朝着它所在的峰頂跳去。)

  • 遺傳算法:模擬物競天擇的生物進化過程,通過維護一個潛在解的群體執行了多方向的搜索,並支持這些方向上的信息構成和交換。是以面為單位的搜索,比以點為單位的搜索,更能發現全局最優解。(在遺傳算法中,有很多袋鼠,它們降落到喜瑪拉雅山脈的任意地方。這些袋鼠並不知道它們的任務是尋找珠穆朗瑪峰。但每過幾年,就在一些海拔高度較低的地方射殺一些袋鼠,並希望存活下來的袋鼠是多產的,在它們所處的地方生兒育女。)(或者換個說法。從前,有一大群袋鼠,它們被莫名其妙的零散地遺棄於喜馬拉雅山脈。於是只好在那里艱苦的生活。海拔低的地方彌漫着一種無色無味的毒氣,海拔越高毒氣越稀薄。可是可憐的袋鼠們對此全然不覺,還是習慣於活蹦亂跳。於是,不斷有袋鼠死於海拔較低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有機會生兒育女。就這樣經過許多年,這些袋鼠們竟然都不自覺地聚攏到了一個個的山峰上,可是在所有的袋鼠中,只有聚攏到珠穆朗瑪峰的袋鼠被帶回了美麗的澳洲。)

04 大體實現過程

 遺傳算法的實現過程實際上就像自然界的進化過程那樣。首先尋找一種對問題潛在解進行“數字化”編碼的方案。(建立表現型和基因型的映射關系)然后用隨機數初始化一個種群(那么第一批袋鼠就被隨意地分散在山脈上),種群里面的個體就是這些數字化的編碼。接下來,通過適當的解碼過程之后(得到袋鼠的位置坐標),用適應性函數對每一個基因個體作一次適應度評估(袋鼠爬得越高,越是受我們的喜愛,所以適應度相應越高)。用選擇函數按照某種規定擇優選擇(我們要每隔一段時間,在山上射殺一些所在海拔較低的袋鼠,以保證袋鼠總體數目持平。)。讓個體基因變異(讓袋鼠隨機地跳一跳)。然后產生子代(希望存活下來的袋鼠是多產的,並在那里生兒育女)。遺傳算法並不保證你能獲得問題的最優解,但是使用遺傳算法的最大優點在於你不必去了解和操心如何去“找”最優解。(你不必去指導袋鼠向那邊跳,跳多遠。)而只要簡單的“否定”一些表現不好的個體就行了。(把那些總是愛走下坡路的袋鼠射殺,這就是遺傳算法的精粹!)

遺傳算法中每一條染色體,對應着遺傳算法的一個解決方案,一般我們用適應性函數(fitness function)來衡量這個解決方案的優劣。所以從一個基因組到其解的適應度形成一個映射。遺傳算法的實現過程實際上就像自然界的進化過程那樣。

下面我們用袋鼠跳中的步驟一一對應解釋,以方便大家理解:

  1. 首先尋找一種對問題潛在解進行“數字化”編碼的方案。(建立表現型和基因型的映射關系)

  2. 隨機初始化一個種群(那么第一批袋鼠就被隨意地分散在山脈上),種群里面的個體就是這些數字化的編碼。

  3. 接下來,通過適當的解碼過程之后(得到袋鼠的位置坐標)。

  4. 用適應性函數對每一個基因個體作一次適應度評估(袋鼠爬得越高當然就越好,所以適應度相應越高)。

  5. 用選擇函數按照某種規定擇優選擇(每隔一段時間,射殺一些所在海拔較低的袋鼠,以保證袋鼠總體數目持平。)。

  6. 讓個體基因變異(讓袋鼠隨機地跳一跳)。

  7. 然后產生子代(希望存活下來的袋鼠是多產的,並在那里生兒育女)。

遺傳算法並不保證你能獲得問題的最優解,但是使用遺傳算法的最大優點在於你不必去了解和操心如何去“找”最優解。(你不必去指導袋鼠向那邊跳,跳多遠。)而只要簡單的“否定”一些表現不好的個體就行了。(把那些總是愛走下坡路的袋鼠射殺,這就是遺傳算法的精粹!)

由此我們可以得出遺傳算法的一般步驟:

  1. 隨機產生種群。
  2. 根據策略判斷個體的適應度,是否符合優化准則,若符合,輸出最佳個體及其最優解,結束。否則,進行下一步。
  3. 依據適應度選擇父母,適應度高的個體被選中的概率高,適應度低的個體被淘汰。
  4. 用父母的染色體按照一定的方法進行交叉,生成子代。
  5. 對子代染色體進行變異。

由交叉和變異產生新一代種群,返回步驟2,直到最優解產生。

具體圖解可以回到1.3查看。

05 開始我們的進化(具體實現細節)

5.1 先從編碼說起

編碼是應用遺傳算法時要解決的首要問題,也是設計遺傳算法時的一個關鍵步驟。編碼方法影響到交叉算子、變異算子等遺傳算子的運算方法,大很大程度上決定了遺傳進化的效率。

迄今為止人們已經提出了許多種不同的編碼方法。總的來說,這些編碼方法可以分為三大類:二進制編碼法、浮點編碼法、符號編碼法。下面分別進行介紹:

5.1.1 二進制編碼法

就像人類的基因有AGCT 4種鹼基序列一樣。不過在這里我們只用了0和1兩種鹼基,然后將他們串成一條鏈形成染色體。一個位能表示出2種狀態的信息量,因此足夠長的二進制染色體便能表示所有的特征。這便是二進制編碼。如下:
1110001010111

它由二進制符號0和1所組成的二值符號集。它有以下一些優點:

  1. 編碼、解碼操作簡單易行
  2. 交叉、變異等遺傳操作便於實現
  3. 合最小字符集編碼原則
  4. 利用模式定理對算法進行理論分析。

二進制編碼的缺點是:對於一些連續函數的優化問題,由於其隨機性使得其局部搜索能力較差,如對於一些高精度的問題(如上題),當解迫近於最優解后,由於其變異后表現型變化很大,不連續,所以會遠離最優解,達不到穩定。

5.1.2 浮點編碼法

二進制編碼雖然簡單直觀,但明顯地。但是存在着連續函數離散化時的映射誤差。個體長度較短時,可能達不到精度要求,而個體編碼長度較長時,雖然能提高精度,但增加了解碼的難度,使遺傳算法的搜索空間急劇擴大。

所謂浮點法,是指個體的每個基因值用某一范圍內的一個浮點數來表示。在浮點數編碼方法中,必須保證基因值在給定的區間限制范圍內,遺傳算法中所使用的交叉、變異等遺傳算子也必須保證其運算結果所產生的新個體的基因值也在這個區間限制范圍內。如下所示:

1.2-3.2-5.3-7.2-1.4-9.7

浮點數編碼方法有下面幾個優點:

  1. 適用於在遺傳算法中表示范圍較大的數
  2. 適用於精度要求較高的遺傳算法
  3. 便於較大空間的遺傳搜索
  4. 改善了遺傳算法的計算復雜性,提高了運算交率
  5. 便於遺傳算法與經典優化方法的混合使用
  6. 便於設計針對問題的專門知識的知識型遺傳算子
  7. 便於處理復雜的決策變量約束條件

5.1.3 符號編碼法

符號編碼法是指個體染色體編碼串中的基因值取自一個無數值含義、而只有代碼含義的符號集如{A,B,C…}。
符號編碼的主要優點是:

  1. 符合有意義積術塊編碼原則
  2. 便於在遺傳算法中利用所求解問題的專門知識
  3. 便於遺傳算法與相關近似算法之間的混合使用。

5.2 為我們的袋鼠染色體編碼

在上面介紹了一系列編碼方式以后,那么,如何利用上面的編碼來為我們的袋鼠染色體編碼呢?首先我們要明確一點:編碼無非就是建立從基因型到表現型的映射關系。這里的表現型可以理解為個體特征(比如身高、體重、毛色等等)。比如人的基因型是46條染色體所描述的卻能解碼成一個眼,耳,口,鼻等特征各不相同的活生生的人。所以我們要想為“袋鼠”的染色體編碼,我們必須先來考慮“袋鼠”的“個體特征”是什么。也許有的人會說,袋鼠的特征很多,比如性別,身長,體重,也許它喜歡吃什么也能算作其中一個特征。但具體在解決這個問題的情況下,我們應該進一步思考:無論這只袋鼠是長短,肥瘦,黑白只要它在低海拔就會被射殺,同時也沒有規定身長的袋鼠能跳得遠一些,身短的袋鼠跳得近一些。當然它愛吃什么就更不相關了。那么,在此問題下,我們關心的個體特征就是:袋鼠的位置坐標(因為我們要把海拔低的袋鼠給殺掉)。無論袋鼠長什么樣,愛吃什么。我們關心的始終是袋鼠在哪里,並且只要知道了袋鼠的位置坐標(位置坐標就是相應的染色體編碼,可以通過解碼得出),我們就可以:

  1. 在喜馬拉雅山脈的地圖上找到相應的位置坐標,算出海拔高度。(相當於通過自變量求得適應函數的值)然后判讀該不該射殺該袋鼠。
  2. 可以知道染色體交叉和變異后袋鼠新的位置坐標。

如果我們一時無法准確的判斷哪些“個體特征”是必要的,哪些是非必要的,我們常常可以用到這樣一種思維方式:比如你認為袋鼠的愛吃什么東西非常必要,那么你就想一想,有兩只袋鼠,它們其它的個體特征完全同等的情況下,一只長得黑,另外一只長得不是那么黑。你會馬上發現,這不會對它們的命運有絲毫的影響,它們應該有同等的概率被射殺!只因它們處於同一個地方。(值得一提的是,如果你的基因編碼設計中包含了袋鼠黑不黑的信息,這其實不會影響到袋鼠的進化的過程,而那只攀到珠穆朗瑪峰的袋鼠黑與白什么的也完全是隨機的,但是它所在的位置卻是非常確定的。)

 以上是對遺傳算法編碼過程中經常經歷的思維過程,必須把具體問題抽象成數學模型,突出主要矛盾,舍棄次要矛盾。只有這樣才能簡潔而有效的解決問題。

        既然確定了袋鼠的位置作為個體特征,具體來說位置就是橫坐標。那么接下來,我們就要建立表現型到基因型的映射關系。就是說如何用編碼來表現出袋鼠所在的橫坐標。由於橫坐標是一個實數,所以說透了我們就是要對這個實數編碼。回顧我們上面所介紹的兩種編碼方式,最先想到的應該就是,對於二進制編碼方式來說,編碼會比較復雜,而對於浮點數編碼方式來說,則會比較簡潔。恩,正如你所想的,用浮點數編碼,僅僅需要一個浮點數而已。而下面則介紹如何建立二進制編碼到一個實數的映射。明顯地,一定長度的二進制編碼序列,只能表示一定精度的浮點數。譬如我們要求解精確到六位小數,由於區間長度為2 – (-1) = 3 ,為了保證精度要求,至少把區間[-1,2]分為3 × 106等份。又因為

所以編碼的二進制串至少需要22位。

       把一個二進制串(b0,b1,....bn)轉化位區間里面對應的實數值通過下面兩個步驟。

    (1)將一個二進制串代表的二進制數轉化為10進制數:

                 

    (2)對應區間內的實數:

                   含義:xt右邊表示其在區間的均等份,整體表示該值在區間中的份數,加上-1映射到區間[-1,2]中。

      (像極了模數轉換)

例如一個二進制串<1000101110110101000111>表示實數值0.637197。

         

       二進制串<0000000000000000000000>和<1111111111111111111111>則分別表示區間的兩個端點值-1和2。

     好了,目前為止我們把袋鼠的染色體給研究透了,讓我們繼續跟進袋鼠的進化旅程
   上面的編碼方式只是舉個例子讓大家更好理解而已,編碼的方式千奇百怪,層出不窮,每個問題可能采用的編碼方式都不一樣。在這一點上大家要注意。

5.3 評價個體的適應度--適應度函數(fitness function)

前面說了,適應度函數主要是通過個體特征從而判斷個體的適應度。在本例的袋鼠跳中,我們只關心袋鼠的海拔高度,以此來判斷是否該射殺該袋鼠。這樣一來,該函數就非常簡單了。只要輸入袋鼠的位置坐標,在通過相應查找運算,返回袋鼠當前位置的海拔高度就行。

適應度函數也稱評價函數,是根據目標函數確定的用於區分群體中個體好壞的標准。適應度函數總是非負的,而目標函數可能有正有負,故需要在目標函數與適應度函數之間進行變換。

評價個體適應度的一般過程為:

  1. 對個體編碼串進行解碼處理后,可得到個體的表現型。

  2. 由個體的表現型可計算出對應個體的目標函數值。

  3. 根據最優化問題的類型,由目標函數值按一定的轉換規則求出個體的適應度。

       自然界生物競爭過程往往包含兩個方面:生物相互間的搏斗與及生物與客觀環境的搏斗過程。但在我們這個實例里面,你可以想象到,袋鼠相互之間是非常友好的,它們並不需要互相搏斗以爭取生存的權利。它們的生死存亡更多是取決於你的判斷。因為你要衡量哪只袋鼠該殺,哪只袋鼠不該殺,所以你必須制定一個衡量的標准。而對於這個問題,這個衡量的標准比較容易制定:袋鼠所在的海拔高度。(因為你單純地希望袋鼠爬得越高越好。)所以我們直接用袋鼠的海拔高度作為它們的適應性評分。即適應度函數直接返回函數值就行了。

5.4 射殺一些袋鼠--選擇函數(selection)

遺傳算法中的選擇操作就是用來確定如何從父代群體中按某種方法選取那些個體,以便遺傳到下一代群體。選擇操作用來確定重組或交叉個體,以及被選個體將產生多少個子代個體。前面說了,我們希望海拔高的袋鼠存活下來,並盡可能繁衍更多的后代。但我們都知道,在自然界中,適應度高的袋鼠越能繁衍后代,但這也是從概率上說的而已。畢竟有些適應度低的袋鼠也可能逃過我們的眼睛。

那么,怎么建立這種概率關系呢?

下面介紹幾種常用的選擇算子:

  1. 輪盤賭選擇(Roulette Wheel Selection):是一種回放式隨機采樣方法。每個個體進入下一代的概率等於它的適應度值與整個種群中個體適應度值和的比例。選擇誤差較大。

  2. 隨機競爭選擇(Stochastic Tournament):每次按輪盤賭選擇一對個體,然后讓這兩個個體進行競爭,適應度高的被選中,如此反復,直到選滿為止。

  3. 最佳保留選擇:首先按輪盤賭選擇方法執行遺傳算法的選擇操作,然后將當前群體中適應度最高的個體結構完整地復制到下一代群體中。

  4. 無回放隨機選擇(也叫期望值選擇Excepted Value Selection):根據每個個體在下一代群體中的生存期望來進行隨機選擇運算。方法如下:

    (1) 計算群體中每個個體在下一代群體中的生存期望數目N。

    (2) 若某一個體被選中參與交叉運算,則它在下一代中的生存期望數目減去0.5,若某一個體未 被選中參與交叉運算,則它在下一代中的生存期望數目減去1.0。

    (3) 隨着選擇過程的進行,若某一個體的生存期望數目小於0時,則該個體就不再有機會被選中。

  5. 確定式選擇:按照一種確定的方式來進行選擇操作。具體操作過程如下:

    (1) 計算群體中各個個體在下一代群體中的期望生存數目N。

    (2) 用N的整數部分確定各個對應個體在下一代群體中的生存數目。

    (3) 用N的小數部分對個體進行降序排列,順序取前M個個體加入到下一代群體中。至此可完全確定出下一代群體中M個個體。

  6. 無回放余數隨機選擇:可確保適應度比平均適應度大的一些個體能夠被遺傳到下一代群體中,因而選擇誤差比較小。

  7. 均勻排序:對群體中的所有個體按期適應度大小進行排序,基於這個排序來分配各個個體被選中的概率。

  8. 最佳保存策略:當前群體中適應度最高的個體不參與交叉運算和變異運算,而是用它來代替掉本代群體中經過交叉、變異等操作后所產生的適應度最低的個體。

  9. 隨機聯賽選擇:每次選取幾個個體中適應度最高的一個個體遺傳到下一代群體中。

  10. 排擠選擇:新生成的子代將代替或排擠相似的舊父代個體,提高群體的多樣性。

下面以輪盤賭選擇為例給大家講解一下:

輪盤賭選擇
又稱比例選擇方法.其基本思想是:各個個體被選中的概率與其適應度大小成正比.

具體操作如下:
(1)計算出群體中每個個體的適應度f(i=1,2,…,M),M為群體大小;
(2)計算出每個個體被遺傳到下一代群體中的概率;

       

(3)計算出每個個體的累積概率;

       (q[i]稱為染色體x[i] (i=1, 2, …, n)的積累概率)

     

(4)在[0,1]區間內產生一個均勻分布的偽隨機數r;
(5)若r<q[1],則選擇個體1,否則,選擇個體k,使得:q[k-1]<r≤q[k] 成立;
(6)重復(4)、(5)共M次

5.5 遺傳--染色體交叉(crossover)

遺傳算法的交叉操作,是指對兩個相互配對的染色體按某種方式相互交換其部分基因,從而形成兩個新的個體。

(1)適用於二進制編碼個體或浮點數編碼個體的交叉算子:

  1. 單點交叉(One-point Crossover):指在個體編碼串中只隨機設置一個交叉點,然后再該點相互交換兩個配對個體的部分染色體。

  2. 兩點交叉與多點交叉:

    (1) 兩點交叉(Two-point Crossover):在個體編碼串中隨機設置了兩個交叉點,然后再進行部分基因交換。

    (2) 多點交叉(Multi-point Crossover)

  3. 均勻交叉(也稱一致交叉,Uniform Crossover):兩個配對個體的每個基因座上的基因都以相同的交叉概率進行交換,從而形成兩個新個體。

  4. 算術交叉(Arithmetic Crossover):由兩個個體的線性組合而產生出兩個新的個體。該操作對象一般是由浮點數編碼表示的個體。

咳咳,根據國際慣例。還是抓一個最簡單的二進制單點交叉為例來給大家講解講解。

二進制編碼的染色體交叉過程非常類似高中生物中所講的同源染色體的聯會過程――隨機把其中幾個位於同一位置的編碼進行交換,產生新的個體。

 
image

對應的二進制交叉:

 

(2)浮點數編碼

     如果一條基因中含有多個浮點數編碼,那么也可以用跟上面類似的方法進行基因交叉,不同的是進行交叉的基本單位不是二進制碼,而是浮點數。而如果對於單個浮點數的基因交叉,就有其它不同的重組方式了,比如中間重組:隨機產生就能得到介於父代基因編碼值和母代基因編碼值之間的值作為子代基因編碼的值。比如5.5和6交叉,產生5.7,5.6。

   考慮到“袋鼠跳”問題的具體情況――袋鼠的個體特征僅僅表現為它所處的位置。可以想象,同一個位置的袋鼠的基因是完全相同的,而兩條相同的基因進行交叉后,相當於什么都沒有做,所以我們不打算在這個例子里面使用交叉這一個遺傳操作步驟。(當然硬要這個操作步驟也不是不行的,你可以把兩只異地的袋鼠捉到一起,讓它們交配,然后產生子代,再把它們送到它們應該到的地方。)

5.6 變異--基因突變(Mutation)

遺傳算法中的變異運算,是指將個體染色體編碼串中的某些基因座上的基因值用該基因座上的其它等位基因來替換,從而形成新的個體。

(1)二進制編碼

     基因突變過程:基因突變是染色體的某一個位點上基因的改變。基因突變使一個基因變成它的等位基因,並且通常會引起一定的表現型變化。正如上面所說,二進制編碼的遺傳操作過程和生物學中的過程非常相類似,基因串上的“ 0”或“ 1”有一定幾率變成與之相反的“ 1”或“ 0”。

例如下面這串二進制編碼:

101101001011001

經過基因突變后,可能變成以下這串新的編碼:

001101011011001

以下變異算子適用於二進制編碼和浮點數編碼的個體:

  1. 基本位變異(Simple Mutation):對個體編碼串中以變異概率、隨機指定的某一位或某幾位僅因座上的值做變異運算。

  2. 均勻變異(Uniform Mutation):分別用符合某一范圍內均勻分布的隨機數,以某一較小的概率來替換個體編碼串中各個基因座上的原有基因值。(特別適用於在算法的初級運行階段)

  3. 邊界變異(Boundary Mutation):隨機的取基因座上的兩個對應邊界基因值之一去替代原有基因值。特別適用於最優點位於或接近於可行解的邊界時的一類問題。

  4. 非均勻變異:對原有的基因值做一隨機擾動,以擾動后的結果作為變異后的新基因值。對每個基因座都以相同的概率進行變異運算之后,相當於整個解向量在解空間中作了一次輕微的變動。

  5. 高斯近似變異:進行變異操作時用符號均值為P的平均值,方差為P**2的正態分布的一個隨機數來替換原有的基因值。

2)浮點型編碼

      浮點型編碼的基因突變過程一般是對原來的浮點數增加或者減少一個小隨機數。比如原來的浮點數串如下:

1.2,3.4,5.1, 6.0, 4.5

變異后,可能得到如下的浮點數串:

1.3,3.1,4.9, 6.3, 4.4

  當然,這個小隨機數也有大小之分,我們一般管它叫“步長”。(想想“袋鼠跳”問題,袋鼠跳的長短就是這個步長。)一般來說步長越大,開始時進化的速度會比較快,但是后來比較難收斂到精確的點上。而小步長卻能較精確的收斂到一個點上。所以很多時候為了加快遺傳算法的進化速度,而又能保證后期能夠比較精確地收斂到最優解上面,會采取動態改變步長的方法。其實這個過程與前面介紹的模擬退火過程比較相類似。

  到此為止,基因編碼,基因適應度評估,基因選擇,基因變異都一一實現了,剩下來的就是把這些遺傳過程的“零件”裝配起來了。(寫成代碼)

下面是上例的運行結果:

 

紅點代表真實的最大點,由求導法可求的為f(1.85)=3.85

 

 

 

06 一個簡單的實例

 

 

1. 產生初始種群

 

  s1= 13 (01101)

 

  s2= 24 (11000) 

 

  s3= 8   (01000)

 

  s4= 19 (10011)

 


2. 計算適應度

 

    假定適應度為f(s)=s^2 ,則

 

  f (s1) = f(13) = 13^2 = 169

 

  f (s2) = f(24) = 24^2 = 576

 

  f (s3) = f(8) = 8^2 = 64

 

  f (s4) = f(19) = 19^2 = 361

 

3. 選擇

 

   染色體的選擇概率為:

 

 

  染色體的累計概率為:

 

 

根據上面的式子,可得到:

 

 

例如設從區間[0, 1]中產生4個隨機數: 

 

   r1 = 0.450126,    r2 = 0.110347 

 

   r3 = 0.572496,    r4 = 0.98503 

 

 

4. 交叉

 

  基本遺傳算法(SGA)中交叉算子采用單點交叉算子。

 

    單點交叉運算

 

 

5. 變異

 

 

6. 至下一代,適應度計算→選擇→交叉→變異,直至滿足終止條件

 

 

 

07 遺傳算法應用

這里使用具體的應用例子:函數優化

  • 問題的提出

     一元函數求最大值:

用微分法求取f(x)的最大值:

可求得最大值點:f(1.85)=3.85

0. 編碼

     表現型:x
     基因型:二進制編碼(串長取決於求解精度)
     串長與精度之間的關系:
     若要求求解精度到6位小數,區間長度為2-(-1)=3,即需將區間分為3/0.000001=3&times;106等份。
          所以編碼的二進制串長應為22位。

1. 產生初始種群

     產生的方式:隨機
     產生的結果:長度為22的二進制串
     產生的數量:種群的大小(規模),如30,50,…
          1111010011100001011000
          1100110011101010101110
          1010100011110010000100
          1011110010011100111001  
          0001100101001100000011    
          0000011010010000000000

2. 計算適應度

     不同的問題有不同的適應度計算方法
     本例:直接用目標函數作為適應度函數
     ①將某個體轉化為[-1,2]區間的實數:
        s=<1000101110110101000111> → x=0.637197
     ②計算x的函數值(適應度):
        f(x)=xsin(10πx)+2.0=2.586345

     (0000000000000000000000)→-1
     (1111111111111111111111)→2

     上面的①其實就是二進制與十進制之間的轉換:
     第一步,將一個二進制串(b21b20…b0)轉化為10進制數:
        

      第二步,x’對應的區間[-1,2]內的實數:

     

3. 遺傳操作

    選擇:輪盤賭選擇法;
    交叉:單點交叉;
    變異:小概率變異

  • 模擬結果

     設置的參數:
     種群大小50;交叉概率0.75;變異概率0.05;最大代數200。
     得到的最佳個體:
     smax=<1111001100111011111100>;
     xmax=1.8506;
     f(xmax)=3.8503;

  • 運行結果

 

總結:

 

編碼原則
完備性(completeness):問題空間的所有解都能表示為所設計的基因型;
健全性(soundness):任何一個基因型都對應於一個可能解;
非冗余性(non-redundancy):問題空間和表達空間一一對應。

適應度函數的重要性
     適應度函數的選取直接影響遺傳算法的收斂速度以及能否找到最優解。一般而言,適應度函數是由目標函數變換而成的。

適應度函數設計不當有可能出現欺騙問題:
(1)進化初期,個別超常個體控制選擇過程;
(2)進化末期,個體差異太小導致陷入局部極值。

欺騙問題舉例:

還是袋鼠問題,如果低海拔的地方出現毒霧,會殺死袋鼠,只有爬上珠穆朗瑪峰頂端的袋鼠才能生存下來。

因為喜馬拉雅山脈有很多山峰,我們以高度作為適應度,case(1):如果不在珠峰的猴子若比在珠峰半山腰的猴子要高,因為種群大小不變,在珠峰的猴子可能就會被淘汰;case(2):100只猴子都不在珠峰;

1. 選擇的作用:優勝劣汰,適者生存;

2. 交叉的作用:保證種群的穩定性,朝着最優解的方向進化;

3. 變異的作用:保證種群的多樣性,避免交叉可能產生的局部收斂。

 

下圖很好地表現了遺傳算法的精髓。

遺傳算法的特點

  • 自組織、自適應和自學習性
    在編碼方案、適應度函數及遺傳算子確定后,算法將利用進化過程中獲得的信息自行組織搜索。

  • 本質並行性
    內在並行性與內含並行性

  • 不需求導
    只需目標函數和適應度函數

  • 概率轉換規則
    強調概率轉換規則,而不是確定的轉換規則

 

補充

因為遺傳算法的每個操作對不同的應用選擇的策略各有優劣,所以具體情況,具體分析,在此附上:

1. 選擇

適應度計算:
    按比例的適應度函數(proportional fitness assignment)

    基於排序的適應度計算(Rank-based fitness assignment)

選擇算法:
    輪盤賭選擇(roulette wheel selection)

    隨機遍歷抽樣(stochastic universal selection)

    局部選擇(local selection)

    截斷選擇(truncation selection)

    錦標賽選擇(tournament selection)

2. 交叉

因為編碼分二進制和浮點數編碼,所以交叉和變異都有兩類;

實值重組(real valued recombination):

離散重組(discrete recombination)

中間重組(intermediate recombination)

線性重組(linear recombination)

擴展線性重組(extended linear recombination)

二進制交叉(binary valued crossover):

單點交叉(single-point crossover)

多點交叉(multiple-point crossover)

均勻交叉(uniform crossover)

洗牌交叉(shuffle crossover)

縮小代理交叉(crossover with reduced surrogate)

3. 變異

實值變異
二進制變異

另外,遺傳算法背后的理論支撐——模式定理,可以在對遺傳算法有深入研究和優化的時候再詳看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM