1. 程式人生 > 實用技巧 >遺傳演算法學習筆記一之遺傳演算法工作原理

遺傳演算法學習筆記一之遺傳演算法工作原理

參考內容原址:https://www.analyticsvidhya.com/blog/2017/07/introduction-to-genetic-algorithm/

1,遺傳演算法理論的由來

我們先從查爾斯達爾文的一句名言開始:

能夠生存下來的往往不是最強大的物種,也不是最聰明的物種,而是最能適應環境的物種。

2,生物學的啟發

相信你還記得這句話:細胞是所有生物的基石。由此可知,在一個生物的任何一個細胞中,都有著相同的一套染色體。所謂染色體,就是指由DNA組成的聚合體。

傳統上看,這些染色體可以被由數字0和1組成的字串表達出來。

一條染色體有基因組成,這些基因其實就是組成DNA的基本結構,DNA上的每個基因都編碼了一個獨特的性狀,比如頭髮或者眼睛的顏色。

3,遺傳演算法的定義

遺傳演算法實際上就是,盡力在某種程度上模擬進化的過程。

為了形式化定義一個遺傳演算法,我們可以將它看做一個優化方法,它可以嘗試找出某些輸入,憑藉這些輸入我們便可以得到最佳的輸出值或者是結果。遺傳演算法的工作方式也源自於生物學,具體流程如下圖:

那麼現在我們來逐步理解下整個流程。

4,遺傳演算法具體步驟

為了讓講解更為簡便,我們先來理解一下著名的組合優化問題【揹包問題】。如果你還不太懂,這裡有一個我的解釋版本。

比如,你準備要去野遊1個月,但是你只能背一個限重30公斤的揹包。現在你有不同的必需物品,它們每一個都有自己的【生存點數】(具體在下表中已給出)。因此,你的目標是在有限的揹包重量下,最大化你的【生存點數】。

4.1 初始化

這裡我們用遺傳演算法來解決這個揹包問題。第一步是定義我們的總體。總體中包含了個體,每個個體都有一套自己的染色體。

我們知道,染色體可表達為二進位制數串,在這個問題中,1代表接下來位置的基因存在,0代表著丟失。

現在,我們將圖中的4條染色體看做我們的總體初始值。

4.2 適應度函式

接下來,讓我們來計算一下前兩條染色體的適應度分數,對於A1染色體【100110】而言,有:

類似地,對於A2染色體【001110】來說,有:

對於這個問題,我們認為,當染色體包含更多生存分數時,也就意味著它的適應性更強。

因此,由圖可知,染色體1適應性強於染色體2.

4.3 選擇

現在,我們可以開始從總體中選擇合適的染色體,來讓他們互相交配,產生自己的下一代了。這個是進行選擇操作的大致想法,但是這樣將會導致染色體在幾代後相互差異減小,失去了多樣性。因此,我們一般會進行【輪盤賭選擇法】。

想象有一個輪盤,現在我們將它分割為m個部分,這裡的m代表我們總體中染色體的個數。每條染色體在輪盤上佔有的區域面積將根據適應度分數來成比例表示出來。

基於上圖中的值,我們建立如下輪盤。

現在,這個輪盤開始旋轉,我們將被圖中固定的指標指到的那片區域選為第一個親本。然後,對於第二個親本,我們進行同樣的操作。有時候我們也會在途中標註兩個固定 指標,如下圖:

通過這種方法,我們就可以在一輪中就獲得兩個親本。我們將這種方法稱為【隨機普遍選擇法】

4.4 交叉

在上一個步驟中,我們已經選擇出了可以產生後代的親本染色體。那麼用生物學的話說,所謂【交叉】,其實就是指的繁殖。我們現在來對染色體1和染色體4進行【交叉】,如下圖:

這是交叉最基本的形式,我們稱其為【單點交叉】。這裡我們隨機選擇一個交叉點,然後,將交叉點前後的染色體部分進行染色體間的交叉對調,於是就產生了新的後代。

如果你設定兩個交叉點,那麼這種方法被稱為【多點交叉】,如下圖:

4.5 變異

在後代的生長過程中,它們體內的基因會發生一些變化,使得他們與父母不同。這個過程我們稱為【變異】,它可以被定義為染色體上發生的隨機變化,正是因為變異,種群中才會存在多樣性。

下圖為變異的一個簡單例項:

變異完成之後,我們就得到了新個體,進化也就完成了,整個過程如下圖:

在進行完一輪遺傳變異之後,我們用適應度函式對這些新的後代進行驗證,如果函式判定他們的適應度足夠,那麼就會用他們從總體中替代掉那些適應度不夠的染色體。這裡有個問題,我們最終應該以什麼標準來判斷後代達到了最佳適應度水平呢?

一般來說,有如下終止條件:

在進行x次迭代之後,總體沒有什麼太大改變。

我們事先為演算法定義好了進化的次數。

當我們的適應度函式已經達到了預先定義的值。