遺傳進化演算法
A. 遺傳演算法原理簡介
遺傳演算法(Genetic Algorithm, GA)是一種進化計算(Evolutionary Computing)演算法,屬於人工智慧技術的一部分。遺傳演算法最早是由John Holland和他的學生發明並改進的,源於對達芬奇物種進化理論的模仿。在物種進化過程中,為了適應環境,好的基因得到保留,不好的基因被淘汰,這樣經過很多代基因的變化,物種的基因就是當前自然環境下適應度最好的基因。該演算法被廣泛應用於優化和搜索中,用於尋求最優解(或最優解的近似),其最主要的步驟包括交叉(crossover)和突變(mutation)。
所有的生物體都由細胞組成,每個細胞中都包含了同樣的染色體(chromosome)。染色體由一串DNA組成,我們可以簡單地把一個生物個體表示為一條染色體。每條染色體上都包含著基因,而基因又是由多個DNA組成的。每個基因都控制著個體某個性狀的表達,例如眼睛的顏色、眼皮的單雙等。在物種繁衍的過程中,首先發生交叉,來自於父母的染色體經過分裂和重組,形成後代的染色體。之後,後代有一定概率發生基因突變,即染色體上某個位置處的基因以一定概率發生變化。之後,對每一代都重復進行交叉和突變兩個步驟。對於每一個後代,我們可以通過一定的方式測量其適應度。適應度越好的個體,在下一次交叉中被選中的概率越大,它的基因越容易傳給下一代。這樣,後代的適應度就會越來越好,直到收斂到一個穩定值。
在優化問題中,可行解總是有很多個,我們希望尋找一個最優解,它相對於其他可行解來說具有更好的適應度(即目標函數值更大或更小)。每個可行解就是一個「生物個體」,可以表示為狀態空間中的一個點和適應度。每個解都是一個經過編碼的序列,已二進制編碼為例,每個解都是一個二進制序列。這樣每個染色體就是一個二進制序列。遺傳演算法從從一組可行解開始,稱為population,從population中隨機選擇染色體進行交叉產生下一代。這一做法的基於下一代的適應度會好於上一代。遺傳演算法的過程如下:
終止條件可以是達到了最大迭代次數,或者是前後連續幾代的最優染色體的適應度差值小於一個閾值。以上演算法描述也許還不夠直觀,我們舉例說明。假設解可以用二進制編碼表示,則每個染色體都是一個二進制序列。假設序列長度為16,則每個染色體都是一個16位的二進制序列:
首先,我們隨機生成一個population,假設population size為20,則有20個長度為16的二進制序列。計算每個染色體的適應度,然後選取兩個染色體進行交叉,如下圖所示。下圖在第6為上將染色體斷開再重組,斷開的位置是可以隨機選擇的。當然,斷裂位置也可以不止一個。可以根據具體問題選擇具體的交叉方式來提升演算法性能。
之後,隨機選取後代染色體上某個基因發生基因突變,突變的位置是隨機選取的。並且,基因突變並不是在每個後代上都會發生,只是有一定的概率。對於二進制編碼,基因突變的方式是按位取反:
上述例子是關於二進制編碼的,像求解一元函數在某個區間內的最大最小值就可以使用二進制編碼。例如,求解函數f(x)=x+sin(3x)+cos(3x)在區間[0,6]內的最小值。假設我們需要最小值點x保留4位小數,那麼求解區間被離散成60000個數。因為2 {15}<60000<2 {16},所以,需要16位二進制數來表示這60000個可能的解。其中0x0000表示0,0x0001表示0.0001,以此類推。針對這個例子,文末給出了demo code.
然而,在排序問題中無法使用二進制編碼,應該採用排列編碼(permutation encoding)。例如有下面兩個染色體:
交叉:隨機選取一個交叉點,從該出將兩個染色體斷開。染色體A的前部分組成後代1的前部分,然後掃描染色體B,如果出現了後代1中不包含的基因,則將其順序加入後代1中。同理,染色體B的前部分組成了後代2的前部分,掃描染色體A獲得後代2的後部分。注意,交叉的方式多種多樣,此處只是舉出其中一種方式。
( 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)
突變:對於一個染色體,隨機選中兩個基因互換位置。例如第3個基因和倒數第2個基因互換:
(1 5 3 2 6 8 7 4 9) => (1 5 4 2 6 8 7 3 9)
此外還有值編碼(value encoding)和樹編碼(tree encoding)等,具體例子可以參考這個鏈接: http://obitko.com/tutorials/genetic-algorithms/encoding.php
在實際的遺傳演算法中,往往會保留上一代中的少數幾個精英(elite),即將上一代population中適應度最好的幾個染色體加入到後代的poulation中,同時去除後代population中適應度最差的幾個染色體。通過這個策略,如果在某次迭代中產生了最優解,則最優解能夠一直保留到迭代結束。
用GA求函數最小值的demo code: https://github.com/JiaxYau/GA_test
參考資料 :
[1] Introction to Genetic Algorithm, http://obitko.com/tutorials/genetic-algorithms/index.php
[2] Holland J H. Adaption in natural and artificial systems
B. 遺傳演算法理解
遺傳演算法是一種進化演算法,進化是什麼哪?就是種群逐漸適應生存環境,種群中個體不斷得到改良的過程。
遺傳演算法是一種對生物遺傳的模擬、在演算法中,初始化一個種群,種群中的每個染色體個體都是一種解決方案,我們通過適應性fitness來衡量這個解決方案的好壞。並對它們進行選擇、變異、交叉的操作,找到最優的解決方案。
總結一下遺傳演算法的基本的步驟:
1.初始化一個種群,並評估每條染色體所對應個體的適應度。
2.選擇、交叉、變異,產生新的種群
3.再評估每個個體的適應值,如果適應值達到要求或者達到最大循環次數,否則重復2,不斷產生新種群。
知道了GA的大致流程之後、來具體分析一下細節,怎麼實現吧
我們知道遺傳演算法起源於生物遺傳,因此在種群中每個個體就是一個染色體,那如何對染色體進行編碼,讓它表示我們的解決方案那(就是把現實要優化的參數用編碼表示成一個染色體)。這里就遇到了一個編碼、解碼的問題,我們將需要優化的目標編碼成染色體,然後再解碼為我們可以用來計算fitness的解;
一般在進行參數優化時,一般有兩種方式:實數編碼、二進制編碼
實數編碼:基因直接用實數進行表示,這樣的表示方法比較簡單,不用特意解碼了,但是在交叉和變異時,容易過早收斂,陷入局部最優。
二進制編碼:將基因用二進制的形式表示,將參數的值轉化為二進制形式,這樣交叉、變異時更好操作,多樣性好,但是佔用的存儲空間大,需要解碼。
染色體就稱為個體。對於一次實驗,個體就是需要優化參數的一種解、許多這樣的個體就構成了種群。
在面對群體中那麼多個體時,如何判斷個體的好壞呢,就是通過適應值函數了,將解帶入適應值函數,適應值越大、解越好。
在遺傳演算法中,我們怎麼使得裡面的個體變得越來越優秀呢?
核心思想就是:選擇優秀的、淘汰不好的,並且為了生成更好的解,我們要嘗試交叉、變異,帶來新的解。
選擇就是從當前的種群中選擇出比較好的個體、淘汰不好的個體
常見的選擇方法有:輪盤賭選擇、錦標賽選擇、最佳保留選擇等等
輪盤賭選擇就是根據每個個體fitness和種群所有fitness之和比較,確定每個個體被選中的概率,然後進行n次選擇,選擇n個個體構成新種群,是一種放回抽樣的方式。
錦標賽就是每次從種群中選擇m個個體,選擇最優的,放入新種群,重復選擇,直到新種群中個體數目達到n。
最佳保留選擇就是在輪盤賭的基礎上,將fitness個體先加進新種群,因為輪盤賭是一種概率模型,可能存在最優個體沒有進入新種群的情況。
在選擇之後,就要考慮產生新的、更優秀的解,為種群帶來新的血液。遺傳演算法的思路是交叉兩個優秀的解,往往get好的解。
交叉通過在經過選擇的種群中,隨機選擇一對父母,將它們的染色體進行交叉,生成新的個體,替代原來的解。
常用的交叉方法有:單點交叉、多點交叉等等。
交叉就像生物裡面,染色體交換基因一樣的~但是並不是種群中所有個體都進行交叉的,實現時可以,設置一個交叉率和交叉概率,隨機選擇種群中兩個體、隨機一個數,小於交叉率就進行交叉操作,並根據交叉概率判斷交叉的程度,從而生成新個體,反之就保留這兩個體。
變異也是一種產生新個體的方式,通過改變個體上基因,期望產生更好的解。比如在以二進制編碼的個體上,將裡面的0、1進行等位變化啥的,就是0變1、1變0這樣。同樣也要考慮變異率、變異產生的新解是不可控的,可能很好,也可能很壞,不能像交叉一樣,確保一定的效果,所以往往變異率設置的比較小。
C. 遺傳演算法的基本原理
遺傳演算法的基本原理:基於達爾文的自然選擇和遺傳理論模擬生物進化過程,解決優化和搜索問題。
遺傳演算法是一種模擬自然進化機制的搜索演算法。它的核心思想是通過模擬生物進化過程中的自然選擇、遺傳和變異等機制,尋找最優解或近似最優解。遺傳演算法的基本原理主要包括以下幾個要點:
編碼與初始化種群
遺傳演算法採用一種特定的編碼方式來表示問題的解空間,如二進制編碼、實數編碼等。這些編碼構成了一個種群,種群中的每個個體代表一個可能的解。初始化種群是演算法的第一步,隨機生成一定數量的個體組成初始種群。
適應度函數
適應度函數用於評估種群中個體的質量,是遺傳演算法中非常重要的部分。適應度函數根據問題的具體需求定義,反映了每個個體解決方案的優劣程度。在進化過程中,適應度高的個體更有可能被選擇並產生後代。
選擇操作
選擇操作模擬了自然選擇的過程。在遺傳演算法中,根據個體的適應度值,按照一定的選擇策略,從當前種群中選擇出適應度較高的個體,用於產生下一代種群。
交叉與變異操作
交叉和變異操作模擬了生物的遺傳過程。交叉操作通過組合兩個個體的基因,產生新的個體。變異操作則是對個體基因進行隨機改變,增加種群的多樣性。這兩個操作共同決定了演算法的搜索能力和方向。
通過上述步驟,遺傳演算法不斷地迭代進化,每一代種群都比前一代更適應環境。最終,通過自然選擇和遺傳機制的模擬,遺傳演算法能夠找到問題的近似最優解或滿意解。由於其獨特的搜索機制和強大的全局搜索能力,遺傳演算法在許多領域得到了廣泛應用。