遺傳算法GA(Genetic Algorithm)入門知識梳理

1、遺傳算法進化論背景知識

做爲遺傳算法生物背景的介紹,下面內容瞭解便可:html

  • 種羣(Population):生物的進化以羣體的形式進行,這樣的一個羣體稱爲種羣。python

  • 個體:組成種羣的單個生物。算法

  • 基因 ( Gene ) :一個遺傳因子。編程

  • 染色體 ( Chromosome ) :包含一組的基因。數組

  • 生存競爭,適者生存:對環境適應度高的、牛B的個體參與繁殖的機會比較多,後代就會愈來愈多。適應度低的個體參與繁殖的機會比較少,後代就會愈來愈少。dom

  • 遺傳與變異:新個體會遺傳父母雙方各一部分的基因,同時有必定的機率發生基因變異。分佈式

簡單說來就是:繁殖過程,會發生基因交叉( Crossover ) ,基因突變 ( Mutation ) ,適應度( Fitness )低的個體會被逐步淘汰,而適應度高的個體會愈來愈多。那麼通過N代的天然選擇後,保存下來的個體都是適應度很高的,其中極可能包含史上產生的適應度最高的那個個體。函數

2、遺傳算法思想

GA的組成:性能

  • 編碼(產生初始種羣)學習

  • 適應度函數

  • 遺傳算子(選擇、交叉、變異)

  • 運行參數

借鑑生物進化論,遺傳算法將要解決的問題模擬成一個生物進化的過程,經過複製、交叉、突變等操做產生下一代的解,並逐步淘汰掉適應度函數值低的解,增長適應度函數值高的解。這樣進化N代後就頗有可能會進化出適應度函數值很高的個體。

舉個例子,使用遺傳算法解決「0-1揹包問題」的思路:0-1揹包的解能夠編碼爲一串0-1字符串(0:不取,1:取) ;首先,隨機產生M個0-1字符串,而後評價這些0-1字符串做爲0-1揹包問題的解的優劣;而後,隨機選擇一些字符串經過交叉、突變等操做產生下一代的M個字符串,並且較優的解被選中的機率要比較高。這樣通過G代的進化後就可能會產生出0-1揹包問題的一個「近似最優解」。

2.1 編碼

須要將問題的解編碼成字符串的形式才能使用遺傳算法。最簡單的一種編碼方式是二進制編碼,即將問題的解編碼成二進制位數組的形式。例如,問題的解是整數,那麼能夠將其編碼成二進制位數組的形式。將0-1字符串做爲0-1揹包問題的解就屬於二進制編碼。

基因在必定可以意義上包含了它所表明的問題的解。基因的編碼方式有不少,這也取決於要解決的問題自己。常見的編碼方式有:

  1. 二進制編碼,基因用0或1表示(經常使用於解決01揹包問題) 如:基因A:00100011010 (表明一個個體的染色體)

  2. 互換編碼(用於解決排序問題,如旅行商問題和調度問題) 如旅行商問題中,一串基因編碼用來表示遍歷的城市順序,如:234517986,表示九個城市中,先通過城市2,再通過城市3,依此類推。

  3. 樹形編碼(用於遺傳規劃中的演化編程或者表示)

如,問題:給定了不少組輸入和輸出。請你爲這些輸入輸出選擇一個函數,使得這個函數把每一個輸入儘量近地映射爲輸出。 編碼方法:基因就是樹形結構中的一些函數。

  1. 值編碼 (二進制編碼很差用時,解決複雜的數值問題)

在值編碼中,每一個基因就是一串取值。這些取值能夠是與問題有關任何值:整數,實數,字符或者其餘一些更復雜的東西。

2.2 適應度函數

適應度函數 ( Fitness Function ):用於評價某個染色體的適應度,用f(x)表示。有時須要區分染色體的適應度函數與問題的目標函數。例如:0-1揹包問題的目標函數是所取得物品價值,但將物品價值做爲染色體的適應度函數可能並不必定適合。適應度函數與目標函數是正相關的,可對目標函數做一些變形來獲得適應度函數。

遺傳算子:遺傳算法有3個最基本的操做:選擇,交叉,變異。

2.3 選擇

選擇一些染色體來產生下一代。一種經常使用的選擇策略是 「比例選擇」,也就是個體被選中的機率與其適應度函數值成正比。假設羣體的個體總數是M,那麼那麼一個體Xi被選中的機率爲f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例選擇實現算法就是所謂的「輪盤賭算法」( Roulette Wheel Selection )。

輪盤賭算法

/*

* 按設定的機率,隨機選中一個個體

* P[i]表示第i個個體被選中的機率

*/

int RWS()

{

m =0;

r =Random(0,1); //r爲0至1的隨機數

for(i=1;i<=N; i++)

{

/* 產生的隨機數在m~m+P[i]間則認爲選中了i

* 所以i被選中的機率是P[i]

*/

m = m + P[i];

if(r<=m) return i;

2.4 交叉

所謂交叉運算,是指對兩個相互配對的染色體依據交叉機率按某種方式相互交換其部分基因,從而造成兩個新的個體。交叉運算在GA中起關鍵做用,是產生新個體的主要方法。

2.4.1 2條染色體交換部分基因,來構造下一代的2條新的染色體。例如:

交叉前:

00000|011100000000|10000

11100|000001111110|00101

交叉後:

00000|000001111110|10000

11100|011100000000|00101

染色體交叉是以必定的機率發生的,這個機率記爲Pc 。

2.4.2 雙交叉點法 (用於二進制編碼)

選擇兩個交叉點,子代基因在兩個交叉點間部分來自一個父代基因,其他部分來自於另一個父代基因. 如:

交叉前:

01 |0010| 11

11 |0111| 01

交叉後:

11 |0010| 01

01 |0111| 11

2.4.3. 基於「 與/或 」交叉法 (用於二進制編碼)

對父代按位"與」邏輯運算產生一子代A;按位」或」邏輯運算產生另外一子代B。該交叉策略在解揹包問題中效果較好 . 如:

交叉前:

01001011

11011101

交叉後:

01001001

11011111

還有其餘交叉方法,參考遺傳算法學習心得

2.5 變異

變異是指依據變異機率將個體編碼串中的某些基因值用其它基因值來替換,從而造成一個新的個體。GA中的變異運算是產生新個體的輔助方法,它決定了GA的局部搜索能力,同時保持種羣的多樣性。交叉運算和變異運算的相互配合,共同完成對搜索空間的全局搜索和局部搜索。

注:變異機率Pm不能過小,這樣下降全局搜索能力;也不能太大,Pm > 0.5,這時GA退化爲隨機搜索。

在繁殖過程,新產生的染色體中的基因會以必定的機率出錯,稱爲變異。變異發生的機率記爲Pm 。

2.5.1. 基本位變異算子 (用於二進制編碼)

基本位變異算子是指對個體編碼串隨機指定的某一位或某幾位基因做變異運算。對於基本遺傳算法中用二進制編碼符號串所表示的個體,若須要進行變異操做的某一基因座上的原有基因值爲0,則變異操做將其變爲1;反之,若原有基因值爲1,則變異操做將其變爲0。

變異前:

000001110000000010000

變異後:

000001110000100010000

2.5.2. 逆轉變異算子(用於互換編碼)

在個體中隨機挑選兩個逆轉點,再將兩個逆轉點間的基因交換。 如:

變異前: 1346798205

變異後: 1246798305

2.6 運行參數

GA運行時選擇的參數應該視解決的具體問題而定,到目前爲止,尚未一個適用於GA全部應用領域的關於算法參數的理論。下面是通常狀況下使用GA時推薦的參數:

2.6.1 交叉率

交叉率通常來講應該比較大,推薦使用80%-95%。

2.6.2 變異率

變異率通常來講應該比較小,通常使用0.5%-1%最好。

2.6.3 種羣的規模

種羣規模指的是羣體中個體的個數。實驗發現,比較大的種羣的規模並不能優化遺傳算法的結果。種羣的大小推薦使用20-30,一些研究代表,種羣規模 的大小取決於編碼的方法,具體的說就是編碼串(Encoded String)的大小。也就是說,若是說採用32位爲基因編碼的時候種羣的規模大小最好爲32的話,那麼當採用16位爲基因編碼時種羣的規模相應應變爲原 來的兩倍。

2.6.4 遺傳運算的終止進化代數

我的的想法是,設定一個計數器,若是連續N代出現的最優個體的適應度都同樣時,(嚴格的說應該是,連續N代子代種羣的最優個體適應度都<=父代最優個性的適應度)能夠終止運算。

3、SGA(基本遺傳算法)的僞代碼

SGA(基本遺傳算法)中採用輪盤賭選擇方法

3.1算法流程圖

GA流程圖

基本遺傳算法僞代碼



/*

* Pc:交叉發生的機率

* Pm:變異發生的機率

* M:種羣規模

* G:終止進化的代數

* Tf:進化產生的任何一個個體的適應度函數超過Tf,則能夠終止進化過程

*/

初始化Pm,Pc,M,G,Tf等參數。隨機產生第一代種羣Pop



do

{ 

  計算種羣Pop中每個體的適應度F(i)。

  初始化空種羣newPop

  do

  {

    根據適應度以比例選擇算法從種羣Pop中選出2個個體

    if ( random ( 0 , 1 ) < Pc )

    {

      對2個個體按交叉機率Pc執行交叉操做

    }

    if ( random ( 0 , 1 ) < Pm )

    {

      對2個個體按變異機率Pm執行變異操做

    }

將2個新個體加入種羣newPop中

} until ( M個子代被建立 )

用newPop取代Pop

}until ( 任何染色體得分超過Tf, 或繁殖代數超過G )

4、基本遺傳算法的優化

下面的方法可優化遺傳算法的性能。

4.1 災變

遺傳算法的局部搜索能力較強,可是很容易陷入局部極值。引用網上的一段原話: 「那麼如何解決遺傳算法容易陷入局部極值的問題呢?讓咱們來看看大天然提供的方案。

六千五百萬年之前,恐龍和靈長類動物並存,恐龍在地球上佔絕對統 治地位,若是恐龍沒有滅絕靈長類動物是絕沒有可能統治地球的。正是恐龍的滅絕才使靈長類動物有了充分進化的餘地,事實上地球至少經歷了5次物種大滅絕,每 次物種滅絕都給更加高級的生物提供了充分進化的餘地。因此要跳出局部極值就必須殺死當前全部的優秀個體,從而讓遠離當前極值的點有充分的進化餘地。這就是災變的思想。」

災變就是殺掉最優秀的個體,這樣纔可能產生更優秀的物種。那什麼時候進行災變,災變次數又如何設定?

什麼時候進行災變,能夠採用災變倒計數的方式。若是n代尚未出現比以前更優秀的個體時,能夠發生災變。災變次數能夠這樣來肯定,若是若干次災變後產生的個體的適應度與沒災變前的同樣,可中止災變。

4.2 精英主義(Elitist Strategy)選擇:

當利用交叉和變異產生新的一代時,咱們有很大的可能把在某個中間步驟中獲得的最優解丟失。

精英主義的思想是,在每一次產生新的一代時,首先把當前最優解原封不動的複製到新的一代中。而後按照前面所說的那樣作就行。精英主義方法能夠大幅提升運算速度,由於它能夠防止丟失掉找到的最好的解。

精英主義是基本遺傳算法的一種優化。爲了防止進化過程當中產生的最優解被交叉和變異所破壞,能夠將每一代中的最優解原封不動的複製到下一代中。

4.3 矛盾

由上面看來,災變與精英主義之間彷佛存在着矛盾.前者是將產生的最優個體殺掉,然後者是將最優秀個體基因直接保存到下一代.

應該辯證地看待它們之間的矛盾,二者實際上是能夠共存的.咱們在每一代進行交叉運算時,均直接把最優秀的個體複製到下一代;但當連續N代,都沒有更優 秀的個體出現時,即可以猜測可能陷入局部最優解了,這樣能夠採用災變的手段.能夠說,精英主義是伴隨的每一代的,但災變卻不須要常常發生,不然算法可能下 降爲隨機搜索了.

固然,每一個算法中不必定要用精英主義和災變的手段,應該根據具體的問題而定

4.4 插入操做:

可在3個基本操做的基礎上增長一個插入操做。插入操做將染色體中的某個隨機的片斷移位到另外一個隨機的位置。

5、GA算法特色

5.1 遺傳算法的優勢:

  • 羣體搜索,易於並行化處理;

  • 不是盲目窮舉,而是啓發式搜索;

  • 適應度函數不受連續、可微等條件的約束,適用範圍很廣。

  • 容易實現。一旦有了一個遺傳算法的程序,若是想解決一個新的問題,只需針對新的問題從新進行基因編碼就行;若是編碼方法也相同,那隻須要改變一下適應度函數就能夠了。

5.2 遺傳算法的缺點:

  • 全局搜索能力不強,很容易陷入局部最優解跳不出來;(可結合SA進行改進,由於SA在理率上是100%獲得全局最優的,但搜索代價高)

將遺傳算法用於解決各類實際問題後,人們發現遣傳算法也會因爲各類緣由過早向目標函數的局部最優解收斂,從而很難找到全局最優解。其中有些是因爲目標函數的特性形成的,例如函數具備欺騙性,不知足構造模塊假說等等;另一些則是因爲算法設計不當。爲此,不斷有人對遺傳算法提出各類各樣的改進方案。例如:針對原先的定長二進制編碼方案;提出了動態編碼、實數編碼等改進方案;針對按比例的選擇機制,提出了競爭選擇、按續挑選等改進方案;針對原先的一點交算子,提出了兩點交、多點交、均勻交等算子;針對原先遺傳算法各控制參數在進化過程當中不變的狀況,提出了退化遺傳算法、自適應遺傳算法等。另外,針對不一樣問題還出現了分佈式遺傳算法、並行遺傳算法等等。

6、遺傳算法的實例

參考:

參考文獻都是乾貨!!!參考文獻都是乾貨!!!參考文獻都是乾貨!!!

  1. 遺傳算法入門-博客園-蒼梧
    本文主要參考,推薦!感謝做者~

  2. 經典算法研究系列:7、深刻淺出遺傳算法
    July大神寫的,通俗易懂,推薦!!!

  3. HELLO,遺傳算法!
    博主語言輕鬆,用python描述了遺傳算法求解一個函數最大值的例子。

  4. 遺傳算法理論基礎與簡單應用實例
    博主總結整理的內容,挺不錯的,文中的連接有實例應用。

  5. 遺傳算法入門到掌握(一) CSDN-GA代碼下載
    袋鼠跳的例子來描述了GA算法,幫助理解GA。

  6. 很是好的理解遺傳算法的例子
    求下述二元函數的最大值的例子

  7. 遺傳算法學習心得


歡迎來個人博客看看~
Michael翔的小窩-GA總結

相關文章
相關標籤/搜索