一、遺傳算法的由來
受生物學的啟發,
在一個生物的任何一個細胞中,都有着相同的一套染色體。所謂染色體,就是指由 DNA 組成的聚合體。
傳統上看,這些染色體可以被由數字 0 和 1 組成的字符串表達出來(實際上是由4種鹼基)。
為了形式化定義一個遺傳算法,我們可以將它看作一個優化方法,它可以嘗試找出某些輸入,憑借這些輸入我們便可以得到最佳的輸出值或者是結果。遺傳算法的工作方式也源自於生物學,具體流程見下圖:
那么現在我們來逐步理解一下整個流程。
二、遺傳算法具體步驟
為了讓講解更為簡便,我們先來理解一下著名的組合優化問題「背包問題」。
比如,你准備要去野游 1 個月,但是你只能背一個限重 30 公斤的背包。現在你有不同的必需物品,它們每一個都有自己的「生存點數」(具體在下表中已給出)。因此,你的目標是在有限的背包重量下,最大化你的「生存點數」。
1. 初始化
第一步是定義我們的總體。總體中包含了個體,每個個體都有一套自己的染色體。
我們知道,染色體可表達為 2 進制數串,在這個問題中,1 代表接下來位置的基因存在,0 意味着丟失。(對應在背包問題中就是選擇該物品和不選擇該物品)
現在,我們將圖中的 4 條染色體看作我們的總體初始值。
2. 適用度函數
接下來,讓我們來計算一下前兩條染色體的適應度分數。很顯然,這里的適用度函數就是給定染色體求生存分數。對於 A1 染色體 [100110] 而言,有:
類似地,對於 A2 染色體 [001110] 來說,有:
對於這個問題,我們認為,當染色體包含更多生存分數時,也就意味着它的適應性更強。
因此,由圖可知,染色體 1 適應性強於染色體 2。
3. 選擇
現在,我們可以開始從總體中選擇適合的染色體,來讓它們互相『交配』,產生自己的下一代。這個是進行選擇操作的大致想法,但是這樣將會導致染色體在幾代之后相互差異減小,失去了多樣性。因此,我們一般會進行「輪盤賭選擇法」。
想象有一個輪盤,現在我們將它分割成 m 個部分,這里的 m 代表我們總體中染色體的個數。每條染色體在輪盤上占有的區域面積將根據適應度分數成比例表達出來。
例如,chromosome1的百分比=28/(28+23+12+34)= 28.9%。
基於上圖中的值,我們建立如下「輪盤」。
現在,這個輪盤開始旋轉,我們將被圖中固定的指針(fixed point)指到的那片區域選為第一個親本。然后,對於第二個親本,我們進行同樣的操作。有時候我們也會在途中標注兩個固定指針,如下圖:
通過這種方法,我們可以在一輪中就獲得兩個親本。我們將這種方法成為「隨機普遍選擇法」。
4. 交叉
在上一個步驟中,我們已經選擇出了可以產生后代的親本染色體。那么用生物學的話說,所謂「交叉」,其實就是指的繁殖。現在我們來對染色體 1 和 4(在上一個步驟中選出來的)進行「交叉」,見下圖:
這是交叉最基本的形式,我們稱其為「單點交叉」。這里我們隨機選擇一個交叉點,然后,將交叉點前后的染色體部分進行染色體間的交叉對調,於是就產生了新的后代。
如果你設置兩個交叉點,那么這種方法被成為「多點交叉」,見下圖:
5. 變異
在后代的生長過程中,它們體內的基因會發生一些變化,使得它們與父母不同。這個過程我們稱為「變異」,它可以被定義為染色體上發生的隨機變化,正是因為變異,種群中才會存在多樣性。
下圖為變異的一個簡單示例:
變異完成之后,我們就得到了新為個體,進化也就完成了,整個過程如下圖:
在進行完一輪「遺傳變異」之后,我們用適應度函數對這些新的后代進行驗證,如果函數判定它們適應度足夠,那么就會用它們從總體中替代掉那些適應度不夠的染色體。
這里有個問題,我們最終應該以什么標准來判斷后代達到了最佳適應度水平呢?
一般來說,有如下幾個終止條件:
- 在進行 X 次迭代之后,總體沒有什么太大改變。
- 我們事先為算法定義好了進化的次數。
- 當我們的適應度函數已經達到了預先定義的值。
好了,現在我假設你已基本理解了遺傳算法的要領。