遗传算法通识
遺傳算法(Genetic Algorithms ,GA)來源于自然界自然選擇和遺傳進化的思想,主要用于解決最優化問題(optimization problems)。遺傳算法最早在20世紀70年代由John Holland提出。但實際上,我更認為其發明者是達爾文。遺傳算法本質上是達爾文“優勝劣汰,適者生存”的進化論思想在計算機中的映射。
一、基本概念
與進化論相似,遺傳算法有幾個核心概念。知道進化論或學過生物的很容易理解。
個體(Individual):一個猴子,一個猩猩,一個人。
種群(Population):一群猴子,一群猩猩,一群人。
基因(Gene):個體攜帶的基因。
染色體(Chromosome):由基因拼接組成;作為個體的藍本,在算法中一般代表個體自身。
遺傳算法基于如下進化理論的類比:
(1)個體在種群中因為資源或配偶進行競爭;
(2)優秀的個體在競爭中更有優勢;
(3)優秀個體相互結合能夠產生更優秀的后代。
二、怎樣判斷優秀個體?
那么,怎么知道哪個是優秀的個體,哪個是不優秀的個體呢?在遺傳算法中用“適應度值(fitness)”來度量,至于適應度值高是優秀還是低是優秀,看具體的問題了。
在算法實施過程中需要一個“適應度值計算函數”,來計算種群中每個個體的適應度值(fitness)。
三、怎樣實施進化過程?
遺傳算法的過程不復雜。
1)根據問題需要,隨機生成個體,個體的數量可自行控制。
2)將個體組成一個種群。這前2個過程一般合并在一起。
3)計算個體適應度值。
4)根據適應度值選擇優秀的個體。
5)將優秀的個體進行結合,產生一個或多個后代。
6)某個個體產生基因變異,變成了一個新個體。
7)將所有新個體加入到種群中,根據適應度值淘汰較差個體,使種群中個體數量保持不變。
8)滿足退出條件就退出,不滿足就轉向步驟3)。
四、三個核心步驟
(1)選擇(selection)
關鍵思想:優秀的個體有更多的機會把基因傳給下一代。
選擇的基準就是個體的適應度。而選擇的策略根據問題和程序員自身意圖,可以采用多種策略。一般使用較廣、且易于實現的是輪盤賭策略(roulette wheel selection)。
假設種群中有6個個體,適應度值分別是[2,3,10,5,12,19],其輪盤是如下形式:
我們轉動輪盤,顯然適應度越大的有更大的概率被選中。其簡單的解釋性代碼可以表示如下:
可以看出,用輪盤賭也有一定的限制。如果適應度值有正有負,就不好處理。所以輪盤賭只是選擇策略的一種。最簡單的是隨機選擇策略,在種群中隨機選擇個體進行進化。
(2)結合(或稱交叉,crossover)
交叉過程根據問題和程序員的意圖可自行設計。下面給出單點交叉法的過程示意圖。
兩個個體parent1和parent2,各分成2部分基因片段。分別將parent1的前部分基因片段和parent2的后部分基因片段,parent1的后部分基因片段和parent2的前部分基因片段相結合,生成了2個后代child1和child2。每個后代都擁有parent1和parent2的一部分基因。
在每一代進化中,交叉過程不是一定發生的,一般基于設定的概率發生。而這個概率設定的較高,一般在0.6以上。如果交叉不發生,parent1和parent2直接復制進入新種群。如果交叉發生,則對child1,child2,parent1,parent2進行適應度比較后,保留較好的進入新種群,也可以都進入新種群,具體怎么做沒有標準,可以根據具體問題自行選擇。
(3)變異(mutation)
為了確保種群的多樣性,允許種群中有個體的基因變異。在實際問題中是跳出局部最優解。下圖表示種群中某個個體的一段基因編碼發生變異,生成了一個新個體。在每一代進化中,變異概率設置的較低,一般在0.1以下。注意:交叉概率和變異概率一個較大,一個較小,但不是交叉概率和變異概率之和一定等于1,沒有這種說法,這兩個概率沒有相關性。
變異可以基于交叉后產生的個體,也可以基于種群中的所有個體,這個可以根據具體問題自行決策。
總結
- 上一篇: 线性回归损失函数为什么要用平方形式
- 下一篇: 遗传算法实例-求解函数极值