進化算法之遺傳算法
進化算法Evoluation Algorithms(EAs)有以下三個特征:
- Population-Based:進化算法的優化過程可以描述為:從當前一些比較差的解集當中生成相對比較好的一點的解集。而當前的解集叫做Population。
- Fitness-Oriented: 如果現在已經有了許多解,那該怎么比較兩個解的好壞呢?因此就需要一個衡量一個解好壞的標准:適應性函數。適應性函數能對每一個解賦予它們一個對應的適應度。
- Variation-Driven:如果在當前的pululation中沒有合適的解或者不是最優解,我們就希望做點什么從而得到最優解。因此,這是,每一個解都要經過一些變化,去產生新的解。
下面介紹一個具體的算法:遺傳算法 Genetic Algorithm(GA)
遺傳算法(Genetic Algorithm, GA)
遺傳算法是基於隨機的經典進化算法。這里隨機的意思是,為了使用遺傳算法找到一個解,我們將把一些隨機變換應用到當前的解里,從而產生變化,生成新的解。注意:遺傳算法(EA)也會被叫做簡單遺傳算法(Simple Genetic Algorithm,SGA),原因就是它相比於其他遺傳算法來說是最簡單的。
遺傳算法啟發與達爾文的進化論。這是一個緩慢漸進的過程,通過做出微小又緩慢的改變發揮作用。因此,遺傳算法也是通過對現有解做微小又緩慢的改變,直到得到最好的解。
遺傳算法的原理
遺傳算法作用在整個“種群”(Population)當中。這個“種群”包含一些個體,每一個個體實際上就是一種解決方法(一個解)。而每一個個體有一個染色體。通常這個染色體是一些特征的集合,它獨一無二地描述了相對應的個體。同時,染色體里面有許多基因。在計算機里,我們可以用許多方法去表示基因。如下圖,用0和1去表示基因。
當然,每一個個體都要用一個適應度,這個適應度是由適應函數給出的。它可以用於評估兩個個體之間的好壞。適應度越高,表示該個體越適合在該“環境”下,那么就應該被保留下來;適應度越低,表示個體不適合該“環境”,或者說解不夠好,那么就應該淘汰這個個體。
我們把適應度比較高的個體放在一個交配池(mating pool)里。在交配池里的個體就叫做父輩。從交配池中任意選出來的兩個個體將會產生一個孩子。通過交配兩個高質量的父輩,我們期望會得到一個比父輩更高質量的孩子出來。當然,如果產生出來的孩子適應度比父輩還低,那么這個孩子就會被淘汰掉。通過這樣不斷的迭代,直到產生了具有最優適應度的孩子或達到了預先的要求為止。
當前種群中產生出來的孩子具有父輩的一些特點。且這些孩子就不在改變了。而接着再產生下一代的時候,可能會生成跟上一代相同的孩子,且父輩們的缺點都保留着。因此,我們就希望孩子也要加入到種群當中,甚至是淘汰掉父輩們。
其流程圖大概如下:
到這里為止,為了完全理解GA算法,我們必須弄清楚以下兩個問題:
- 如何從連個父輩中生成孩子?
- 如何輕微地修改孩子使得其成為一個不同的個體?
下面介紹染色體的表示方法和進化過程。
染色體的表示方法和進化
現存在有許多有效表示染色體的方法。染色體的表示方法針對具體問題而變化。一個好的表示方法能縮小整個搜索空間,減少搜索時間,從而提高算法的效率。
現有的表示染色體的方法:
- Binary(二進制):就是每一個染色體都變表示成0和1的字符串。
- Permutation(排列組合):這種表示方法在面對一些有序問題的時候很有效,如旅行商人問題。
- Value(數值):就把染色體編碼成一個具體的實數。
例如,我們用二進制去表示數字7:
\(0111\)就是我們說的染色體,而里面的每一個字符就是一個基因。
學過高中生物的同學應該知道,染色體的表現形式有兩種:
- 基因型:即染色體中所有基因的集合。
- 表現型:即物理上表現出來的形狀。
在上面這個例子中,\(0111\)就是基因型,數字7就是表現型。
在明白了染色體的表現方法后,這下來我們看如何去計算每一個染色體它的適應度值(fitness value)?
假設適應函數(fitness function)為:
其中\(x\)就是染色體。
那么,數字7這條染色體它的適應函數值就為:
計算染色體適應函數的過程就稱為進化(evolution)
初始化
在表示完每一個個體之后,接下來就是選着一定數量的個體作為種群.
選擇
然后就是基於給定的適應函數,選擇出適應值比較高(高出指定的值)的個體,即從種群中選擇一些個體,放在交配池里。
變異
然后從交配池中有序地選着兩個個體出來作為父輩(如1-2,3-4等等)。另一種選着方法是每次都隨機選兩個。
針對選出來的兩個父輩,進行變異操作。包括兩種操作:
- 交叉變換
- 突變
下圖是交叉變換和突變的示意圖:
交叉變換
遺傳算法的交叉變換也類似於生物學上染色體的交叉變換。通過拆分每一哥父輩的一部分染色體,然后在重新組合形成新的染色體。孩子從每一個父輩得到的基因數量是隨機的。(因為本文介紹的算法就是基於隨機的進化算法,也是最簡單的進化算法。)。有時候,父輩染色體會被拆成兩部分,拆分的位置隨機,然后選擇交換父輩們上半段的染色體或下半段染色體。最后的結果就是生成新的染色體。而這種只斷開染色體一次的操作就稱為單點交換(此外,還有多點交換)。
突變
針對每一個孩子,任意改動它的一些基因。當然,具體要怎么改依賴於染色體的表現形式。如果染色體是用二進制表示的,那么突變操作無非就是把某些為上的值從0改成1或者是從1改成0。但是如果染色體是用數值型的方法表示的,那么就只能在值域內隨機選擇了。
引用
https://www.linkedin.com/pulse/introduction-optimization-genetic-algorithm-ahmed-gad/