遺傳算法 一個模擬自然進化過程的啓發式搜索算法

關鍵字:遺傳算法

遺傳算法(Genetic Algorithm)是一種模擬自然界“自然選擇”和“自然遺傳”的啓發式搜索算法,通過模擬自然進化過程搜索最優解的方法。

直到1989年,實現了具有單變量函數的簡單遺傳算法(Simple Genetic Algorithm,SGA)程序,後續有許多學者對遺傳算法提出建議或改良,如精英保留策略遺傳算法、改良遺傳算法、混合遺傳算法等,但他們都是基於SGA的。

本篇也是以SGA爲基礎的,SGA處理流程如下:

簡單遺傳算法SGA的處理流程圖

遺傳算法的理論基礎是達爾文的“進化論”,在遺傳算法模型中,將問題的解答巧妙的編碼在一串數值或符號中(即所謂的染色體),模擬染色體中的一段基因,經過長時間的進化過程,歷經選擇、交叉和變異3個遺傳算子,不斷產生新基因,同時淘汰不良基因,最終進化成最優秀的染色體,並滿足進化的終止條件,得到問題的最優解。

實現遺傳算法時,必須先將要求問題解的質量定義爲適應度函數。適應度函數計算的數值代表該系統的性能指針,也就是該物種對於生存環境的適應程度,簡稱爲適應度值,適應度值越高,表示系統性能越好,被選取的概率也越大。

最常見的進化的終止條件有兩種:得到大於或等於預期的目的適應值,或達到預先定義好的演化代數,也就是說,適應度函數的設計是遺傳演算過程是否可以正常執行的關鍵。

如果適應度函數選擇不當,有可能會收斂於局部,而不能達到“真正的全局”最優解。除此之外,由於遺傳算法具有不確定的變異因素,可能也會出現無法收斂的情況。這時,可以根據指定的演化函數,或發現搜索結果停滯不前,或已經達到某種飽和現象,設置終止條件。

1.編碼

在遺傳算法中,將染色體稱爲個體,常見的基因編碼方式有二進制編碼、浮點數編碼和字符編碼3種。

1)二進制編碼:用二進制表示參數空間,優點:易實現

2)浮點數編碼:直接將參數值當成染色體的基因,省去了編碼和譯碼的動作,缺點:無法默認搜索的精確度,不適合處理不連續的變量空間

3)字符編碼:直接用字符代表基因的方式

2.種羣

根據SGA處理流程可知,遺傳演算開始前,需要先產生初代種羣(由一堆隨機產生的染色體組成的),由於一個染色體代表一個問題解,因而初代種羣也代表初始解的集合。

那一個種羣應該包括多少染色體呢?這個要視問題複雜度來定,一般來說,越複雜的問題需要越大的種羣規模來解決。

3.選擇

選擇機制類似於“無性繁殖”,根據每個染色體的適應度值大小來決定該染色體被選擇的概率,適應度越高,被選擇概率就大(自然選擇),一旦染色體被選擇,就會進行“自我複製”,並且被放置在稱爲配對庫的暫存區中。

實現選擇機制的兩種常用方法是競爭選擇法和輪盤賭選擇法。

1)競爭選擇法

從種羣中選出兩個染色體進行適應度值的比較,最後留下適應度較高的染色體作爲父代,重複進行這個步驟,直到選出所有的父代爲止。

2)輪盤賭選擇法

按照適應度值的大小決定每一個槽的面積大小,可以使用下面公式來表示:

被選中的概率 P(i)= f(i)/( f(1) + f(2) + … + f(S))

其中 f(i):適應度值;S:染色體總個數;

輪盤賭選擇法

也就是說個體被選中的概率與其適應度函數值成正比。

接下來我們來看一個簡單的輪盤賭算法:

/**
 * 按設定的概率隨機選中一個染色體,P(i)表示第i個染色體被選中的概率
 */
int RAN() {
    m =0;
    r =Random(0,1); // r爲0至1的隨機數
    for(i=1;i<=S; i++) {
        /** 
         * 產生的隨機數在m~m+P[i]間則認爲選中了i,i被選中的概率是P[i]
         */
        m = m + P[i];
        if(r<=m) return i;
    }
}

4.交叉

第二個遺傳算子叫做交叉。

交叉

作用:希望通過父代之間進行基因交換的動作後,產生具有較高適應度的子代。

交叉運算的流程示意圖

位於配對庫中的染色體是經過選擇運算的結果,在交叉流程開始時,會先從配對庫中任意取出兩個染色體,並將它們作爲父代。但是並非所有父代都會進行交叉(取決於交叉概率),實現程序時,可以將交叉概率設置爲0.8~1的數值,接着再取一個隨機實數,如果該隨機實數小於交叉概率,就進行交叉運算。

交叉概率的大小會影響搜索最優解的速度,太高的交叉概率有可能流失優良的染色體,反之又會造成進化停滯,故一般把交叉概率設置在0.8~1爲宜。

5.變異

最後一個遺傳算子叫做變異。

變異

是否進行變異取決於變異概率,當隨機實數小於變異概率時就會引發突變運算,也就是會將染色體中的某個位,由原來的0置換成1,或是由原來的1置換成0。可以置換某個固定位置的位,也可以由隨機數來決定位置。

使用這種隨機漫步的方式,突變運算將使遺傳算法脫離佈局最優解的窘境,得到全局最優解。根據文獻研究顯示,建議將變異概率設置爲0.001左右。

6.演化迭代

經過選擇、交叉、變異3個遺傳算子後,即可產生新的子代,繼續下一個循環的進化,目前常用的取代方式有:
1)整羣取代:全部用新產生的染色體取代舊種羣的染色體;
2)精英保留策略:保留舊種羣中適應度值最高的前幾名,用新產生的染色體取代其餘的染色體。

7.基本遺傳算法僞代碼

/**
 * 基本遺傳算法僞代碼
 *  Pj:交叉發生的概率
 *  Pb:變異發生的概率
 *  M:種羣規模
 *  G:終止進化的代數
 *  T:進化產生的任何一個個體的適應度函數超過T,則可以終止進化過程
 */
初始化Pb,Pj,M,G,T等參數,隨機產生第一代種羣Pop
do{ 
    計算種羣Pop中每一個體的適應度f(i),初始化空種羣newPop
    do{
        根據適應度以 輪盤賭算法 從種羣Pop中選出2個個體
        if ( random ( 0 , 1 ) < Pj ){
            對2個個體按交叉概率Pj執行交叉操作
        }
        if ( random ( 0 , 1 ) < Pb ){
            對2個個體按變異概率Pb執行變異操作
        }
        將2個新個體加入種羣newPop中
    } until ( M個子代被創建 )
    用newPop取代Pop
} until ( 任何染色體得分超過T, 或繁殖代數超過G )

到這裏相信大家對遺傳算法已經有了一定的瞭解了。

需要學習的知識:
1.深入學習遺傳算法
2.對遺傳算法的應用

參看文獻:http://blog.csdn.net/smartbetter/article/details/52194663

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章