所有生物都是由細胞組成的,每個細胞都含有相同的染色體。染色體是由壹串DNA組成的,我們可以簡單地把壹個生物個體表示為壹條染色體。每條染色體都含有基因,而基因是由多個DNA組成的。每個基因控制著某種性格的表達,比如眼睛的顏色,單眼皮和雙眼皮等等。在物種繁殖過程中,首先發生交叉,來自親本的染色體經過分裂重組形成後代的染色體。之後後代有壹定概率發生基因突變,即染色體上某個位置的基因有壹定概率發生變化。之後,對每壹代重復交叉和變異兩個步驟。對於每壹個後代,我們可以用某種方式來衡量它的適合度。適應度越好,在下壹次交叉中被選中的概率就越大,其基因也就越容易遺傳給下壹代。這樣後代的適應度會越來越好,直到收斂到壹個穩定的值。
在優化問題中,總有許多可行解,我們希望找到壹個最優解,它比其他可行解具有更好的適應度(即目標函數值更大或更小)。每個可行解都是壹個“生物個體”,可以表示為狀態空間中的壹個點和適應度。每個解都是壹個編碼序列。例如,每個解都是壹個二進制序列。所以每條染色體都是二進制序列。遺傳算法從壹組可行解開始,稱為種群,從種群中隨機選擇染色體進行雜交,產生下壹代。這種做法基於下壹代的適應性會比上壹代更好。遺傳算法的過程如下:
終止條件可以是達到最大叠代次數,或者連續幾代中最優染色體的適應度差小於閾值。上面的算法描述可能不夠直觀,下面舉個例子。假設解可以用二進制代碼表示,那麽每個染色體就是壹個二進制序列。假設序列長度為16,每個染色體是壹個16位的二進制序列:
首先,我們隨機生成壹個群體。假設群體大小為20,有20個長度為16的二元序列。計算每條染色體的適應度,然後選擇兩條染色體進行雜交,如下圖所示。下圖是第六排染色體斷裂重組,斷裂的位置可以隨機選擇。當然,可以有壹個以上的骨折位置。可以根據具體問題選擇具體的交叉方式來提高算法的性能。
然後隨機選取後代染色體上的壹個基因進行基因突變,隨機選取突變的位置。而且基因突變不是每個後代都會發生,但有壹定的概率。對於二進制編碼,基因突變的方式是反位:
上面的例子是關於二進制編碼的,比如求解壹元函數在壹定區間內的最大值和最小值。比如求函數f(x)=x+sin(3x)+cos(3x)在區間內的最小值。假設我們需要最小點x保留4位小數,那麽求解區間就離散成60000個數字。因為2 {15}
但排序問題不能用二進制編碼,應該采用排列編碼。例如,有以下兩條染色體:
交叉:隨機選擇壹個交叉點,兩條染色體將從這個交叉點斷開。染色體A的前部構成後代1的前部,然後掃描染色體B。如果有子代1不包含的基因,則按順序添加到子代1中。類似地,染色體B的前部構成子代2的前部,子代2的後部通過掃描染色體A獲得..註意,穿越的方式有很多種,這裏只是其中壹種。
(1 5 3 2 6 | 4 7 9 8)+(8 5 6 7 2 | 3 1 4 9)= >( 1 5 3 2 6 8 7 4 9) + ( 8 5 6 7 2 1 3 4 9)
突變:對於壹條染色體,隨機選擇兩個基因交換位置。例如,第三個基因和倒數第二個基因互換:
(1 5 3 2 6 8 7 4 9) = >(1 5 4 2 6 8 7 3 9)
此外,還有值編碼和樹編碼等。具體例子可以參考這個鏈接:/tutorials/genetic-algorithms/encoding . PHP。
在實際的遺傳算法中,往往會保留上壹代中的少數精英,即將上壹代種群中適應度最好的染色體加入到後代的繁殖中,而將適應度最差的染色體去掉。通過這種策略,如果在壹次叠代中產生了壹個最優解,這個最優解可以壹直保持到叠代結束。
用GA:/jiaxiau/ga _ test求函數最小值的Democode。
參考資料:
[1]遺傳算法簡介,/tutorials/Genetic-algorithms/index . PHP
[2]Holland J . h.《自然和人工系統中的適應》