機器學習筆記-遺傳算法


進化算法之遺傳算法

進化算法Evoluation Algorithms(EAs)有以下三個特征:

  1. Population-Based:進化算法的優化過程可以描述為:從當前一些比較差的解集當中生成相對比較好的一點的解集。而當前的解集叫做Population。
  2. Fitness-Oriented: 如果現在已經有了許多解,那該怎么比較兩個解的好壞呢?因此就需要一個衡量一個解好壞的標准:適應性函數。適應性函數能對每一個解賦予它們一個對應的適應度。
  3. Variation-Driven:如果在當前的pululation中沒有合適的解或者不是最優解,我們就希望做點什么從而得到最優解。因此,這是,每一個解都要經過一些變化,去產生新的解。

下面介紹一個具體的算法:遺傳算法 Genetic Algorithm(GA)

遺傳算法(Genetic Algorithm, GA)

遺傳算法是基於隨機的經典進化算法。這里隨機的意思是,為了使用遺傳算法找到一個解,我們將把一些隨機變換應用到當前的解里,從而產生變化,生成新的解。注意:遺傳算法(EA)也會被叫做簡單遺傳算法(Simple Genetic Algorithm,SGA),原因就是它相比於其他遺傳算法來說是最簡單的。

遺傳算法啟發與達爾文的進化論。這是一個緩慢漸進的過程,通過做出微小又緩慢的改變發揮作用。因此,遺傳算法也是通過對現有解做微小又緩慢的改變,直到得到最好的解。

遺傳算法的原理

遺傳算法作用在整個“種群”(Population)當中。這個“種群”包含一些個體,每一個個體實際上就是一種解決方法(一個解)。而每一個個體有一個染色體。通常這個染色體是一些特征的集合,它獨一無二地描述了相對應的個體。同時,染色體里面有許多基因。在計算機里,我們可以用許多方法去表示基因。如下圖,用0和1去表示基因

當然,每一個個體都要用一個適應度,這個適應度是由適應函數給出的。它可以用於評估兩個個體之間的好壞。適應度越高,表示該個體越適合在該“環境”下,那么就應該被保留下來;適應度越低,表示個體不適合該“環境”,或者說解不夠好,那么就應該淘汰這個個體。

我們把適應度比較高的個體放在一個交配池(mating pool)里。在交配池里的個體就叫做父輩。從交配池中任意選出來的兩個個體將會產生一個孩子。通過交配兩個高質量的父輩,我們期望會得到一個比父輩更高質量的孩子出來。當然,如果產生出來的孩子適應度比父輩還低,那么這個孩子就會被淘汰掉。通過這樣不斷的迭代,直到產生了具有最優適應度的孩子或達到了預先的要求為止。

當前種群中產生出來的孩子具有父輩的一些特點。且這些孩子就不在改變了。而接着再產生下一代的時候,可能會生成跟上一代相同的孩子,且父輩們的缺點都保留着。因此,我們就希望孩子也要加入到種群當中,甚至是淘汰掉父輩們。

其流程圖大概如下:

到這里為止,為了完全理解GA算法,我們必須弄清楚以下兩個問題:

  1. 如何從連個父輩中生成孩子?
  2. 如何輕微地修改孩子使得其成為一個不同的個體?

下面介紹染色體的表示方法和進化過程。

染色體的表示方法和進化

現存在有許多有效表示染色體的方法。染色體的表示方法針對具體問題而變化。一個好的表示方法能縮小整個搜索空間,減少搜索時間,從而提高算法的效率。

現有的表示染色體的方法:

  1. Binary(二進制):就是每一個染色體都變表示成0和1的字符串。
  2. Permutation(排列組合):這種表示方法在面對一些有序問題的時候很有效,如旅行商人問題。
  3. Value(數值):就把染色體編碼成一個具體的實數。

例如,我們用二進制去表示數字7:

\[0 1 1 1 \]

\(0111\)就是我們說的染色體,而里面的每一個字符就是一個基因。

學過高中生物的同學應該知道,染色體的表現形式有兩種:

  1. 基因型:即染色體中所有基因的集合。
  2. 表現型:即物理上表現出來的形狀。

在上面這個例子中,\(0111\)就是基因型,數字7就是表現型。

在明白了染色體的表現方法后,這下來我們看如何去計算每一個染色體它的適應度值(fitness value)?

假設適應函數(fitness function)為:

\[f(x)=2x+2 \]

其中\(x\)就是染色體。

那么,數字7這條染色體它的適應函數值就為:

\[f(7)=2*7 + 2 = 16 \]

計算染色體適應函數的過程就稱為進化(evolution)

初始化

在表示完每一個個體之后,接下來就是選着一定數量的個體作為種群.

選擇

然后就是基於給定的適應函數,選擇出適應值比較高(高出指定的值)的個體,即從種群中選擇一些個體,放在交配池里。

變異

然后從交配池中有序地選着兩個個體出來作為父輩(如1-2,3-4等等)。另一種選着方法是每次都隨機選兩個。

針對選出來的兩個父輩,進行變異操作。包括兩種操作:

  1. 交叉變換
  2. 突變

下圖是交叉變換和突變的示意圖:

交叉變換

遺傳算法的交叉變換也類似於生物學上染色體的交叉變換。通過拆分每一哥父輩的一部分染色體,然后在重新組合形成新的染色體。孩子從每一個父輩得到的基因數量是隨機的。(因為本文介紹的算法就是基於隨機的進化算法,也是最簡單的進化算法。)。有時候,父輩染色體會被拆成兩部分,拆分的位置隨機,然后選擇交換父輩們上半段的染色體或下半段染色體。最后的結果就是生成新的染色體。而這種只斷開染色體一次的操作就稱為單點交換(此外,還有多點交換)。

突變

針對每一個孩子,任意改動它的一些基因。當然,具體要怎么改依賴於染色體的表現形式。如果染色體是用二進制表示的,那么突變操作無非就是把某些為上的值從0改成1或者是從1改成0。但是如果染色體是用數值型的方法表示的,那么就只能在值域內隨機選擇了。

引用

https://www.linkedin.com/pulse/introduction-optimization-genetic-algorithm-ahmed-gad/


免責聲明!

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



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