1. 程式人生 > >遺傳演算法學習心得

遺傳演算法學習心得

最近在學習遺傳演算法,剛剛掌握了基本遺傳演算法的一些東西,所以記錄下來以便後續學習,也方便剛剛入門的同學學習。根據我學習的編寫的程式,我將按照程式的步驟,來寫這篇部落格。並且借鑑前人經驗,完善結構。

目錄:

1、簡介

2、遺傳演算法的組成

2.1初始種群的產生

2.2適應度函式及停止準則

2.3遺傳運算元的組成

2.3.1選擇

2.3.2交叉

2.3.3變異

2.3.4執行引數

2.4基本的遺傳演算法的優點與不足

2.5遺傳演算法的改進

2.6遺傳演算法的應用

1、 簡介

基本概念

遺傳演算法(Genetic Algorithms, GA)是一類借鑑生物界自然選擇和自然遺傳機制的隨機化搜尋最優解的演算法。

它模擬自然選擇和自然遺傳過程中發生的繁殖、交叉和基因突變現象,在每次迭代中都保留一組候選解,並按某種指標從解群中選取較優的個體,利用遺傳運算元(選擇、交叉和變異)對這些個體進行組合,產生新一代的候選解群,重複此過程,直到滿足某種收斂指標為止。

下面是一些基本的生物學概念,簡單瞭解一下即可。

種群(Population):生物的進化以群體的形式進行,這樣的一個群體稱為種群。

個體:組成種群的單個生物。

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

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

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

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

2、遺傳演算法的組成:

(1)初始種群的產生(編碼)

(2)適應度函式的確定

(3)遺傳運算元(選擇、交叉、變異)

2.1初始種群的產生(編碼)

    要進行後面的操作,首先要產生初始種群,也就是進化的第一代,種群大小,一般取為100~200,當然也要視問題而定。初始種群的選擇很重要,會影響收斂速度和結果。本程式採用的隨機產生的方式。產生了初始種群後要進行編碼,也可以直接在產生種群的時候就是用編碼的方式產生的。基因的編碼方式有很多,這也取決於要解決的問題本身。常見的編碼方式有:

(1)       二進位制編碼,基因用0或1表示(常用於解決01揹包問題

如:基因A:00100011010 (代表一個個體的染色體)

(2)       互換編碼(用於解決排序問題,如旅行商問題和排程問題

如旅行商問題中,一串基因編碼用來表示遍歷的城市順序,如:234517986,表示九個城市中,先經過城市2,再經過城市3,依此類推。

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

如,問題:給定了很多組輸入和輸出。請你為這些輸入輸出選擇一個函式,使得這個函式把每個輸入儘可能近地對映為輸出。

編碼方法:基因就是樹形結構中的一些函式。

(4)       值編碼 (二進位制編碼不好用時,解決複雜的數值問題)

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

程式中使用的是二進位制編碼的方式,程式的應用背景是影象分割,所以數值是0-255之間,所以,二進位制編碼的位數是8,這裡的計算就是十進位制與二進位制轉換的方式,例如:要在[-1,2]之間產生最優解,小數點後面保留3位小數,那麼就是區間長度2-(-1)=3,3/10^(-3)=3000,2的12次方是4096,2的11次方是2048,所以,二進位制編碼的位數應該是12.

2.2適應度函式及停止準則

遺傳演算法對一個個體(解)的好壞用適應度函式值來評價,適應度函式選擇的越好,解的質量越高。適應度函式是遺傳演算法進化過程的驅動力,也是進行自然選擇的唯一標準,它的設計應結合求解問題本身的要求而定。

在影象分割中,根據大於閾值部分和小於閾值部分的差異性來確定的適應度函式,差異性越大的閾值,適應度越好,也就是說適應度函式值越大,越容易遺傳到下一代。也就是說下面的精英選擇依據就是適應度的大小。

停止準則有兩個,一個是最大迭代次數,一個就是適應度變化的大小,當然你也可以自己設定其他的停止準則,在本程式中是採用的這兩個停止準則。最大代數,一般取為500~100,這是為了防止出現迭代次數過多,或者不收斂的情況,所設定的最大的執行次數。當適應度值變化小於某個值時,進化停止,如果始終達不到這個條件,就達到最大迭代次數時停止進化迭代。

2.3遺傳運算元的組成

2.3.1選擇

遺傳演算法使用選擇運算來實現對群體中的個體進行優勝劣汰操作:適應度高的個體被遺傳到下一代群體中的概率大;適應度低的個體,被遺傳到下一代群體中的概率小。選擇操作的任務就是按某種方法從父代群體中選取一些個體,遺傳到下一代群體。

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

輪盤賭選擇又稱比例選擇運算元,基本思想:各個個體被選中的概率與其適應度函式值大小成正比。設群體大小為n ,個體i 的適應度為 Fi,則個體i 被選中遺傳到下一代群體的概率為:


在本程式的演算法實現中,為了加速優化,沒有采用這種方式,而是用的計算上一代各個個體的適應度並排序,如果上一代的個體的適應度比當前代的最大適應度值大,就採用一定的方式遺傳到下一代,替換當前代的個體。否則就不進行選擇遺傳。

2.3.2交叉

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

遺傳演算法中,交叉運算元因其全域性搜尋能力而作為主要運算元,變異運算元因其區域性搜尋能力而作為輔助運算元。遺傳演算法通過交叉和變異這對相互配合又相互競爭的操作而使其具備兼顧全域性和區域性的均衡搜尋能力。所謂相互配合.是指當群體在進化中陷於搜尋空間中某個超平面而僅靠交叉不能擺脫時,通過變異操作可有助於這種擺脫。所謂相互競爭,是指當通過交叉已形成所期望的積木塊時,變異操作有可能破壞這些積木塊。如何有效地配合使用交叉和變異操作,是目前遺傳演算法的一個重要研究內容。

由於交叉是產生新個體的主要方法,所以一般情況下交叉概率比較大,交叉概率,一般取為0.4~0.6。

交叉運算元從兩個雙親子串中通過複製選定位產生兩個新的後代,每個後代的第i位,是從它的某個雙親的第i位複製得來的,至於雙親中的哪一個在第i位起作用,這是由另外一個被稱為交叉掩碼的位串決定的。

1.    單交叉點法 (用於二進位制編碼)

選擇一個交叉點,子代在交叉點前面的基因從一個父代基因那裡得到,後面的部分從另外一個父代基因那裡得到。在單點交叉中交叉掩碼總是這樣組成的,它以連續的n個1開始。

如:交叉前:

00000|01110000000010000

11100|00000111111000101

交叉後:

00000|00000111111000101

11100|01110000000010000

2. 雙交叉點法 (用於二進位制編碼)

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

如:交叉前:

01 |0010| 11

11 |0111| 01

交叉後:

11 |0010| 01

01 |0111| 11

3. 基於“ 與/或 ”交叉法 (用於二進位制編碼) 

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

如:交叉前:

       01001011

       11011101

交叉後:

       01001001

       11011111

4. 單交叉點法 (用於互換編碼)

選擇一個交叉點,子代的從初始位置出發的部分從一個基因複製,然後在另一個基因中掃描,如果某個位點在子代中沒有,就把它新增進去。

如:交叉前:

    87213 | 09546

    98356 | 71420

交叉後:

    87213 | 95640

    98356 | 72104

5. 部分匹配交叉(PMX)法(用於互換編碼)

先隨機產生兩個交叉點,定義這兩點間的區域為匹配區域,並用交換兩個父代的匹配區域。

父代A:872 | 130 | 9546

父代B:983 | 567 | 1420    變為:

TEMP A: 872 | 567 | 9546

TEMP B: 983 | 130 | 1420

對於 TEMP A、TEMP B中匹配區域以外出現的數碼重複,要依據匹配區域內的位置逐一進行替換。匹配關係:1<——>5 3<——>6 7<——>0

子代A:802 | 567 | 9143

子代B:986 | 130 | 5427

6. 順序交叉法(OX) (用於互換編碼)

從父代A隨機選一個編碼子串,放到子代A的對應位置;子代A空餘的位置從父代B中按B的順序選取(與己有編碼不重複)。同理可得子代B。

父代A: 872 | 139 | 0546

父代B: 983 | 567 | 1420

交叉後:

子代A: 856 | 139 | 7420

子代B: 821 | 567 | 3904

7. 迴圈交叉(CX)法(用於互換編碼)

CX同OX交叉都是從一個親代中取一些城市,而其它城市來自另外一個親代,但是二者不同之處在於:OX中來自第一個親代的編碼子串是隨機產生的,而CX卻不是,它是根據兩個雙親相應位置的編碼而確定的。

父代A:1 2 3 4 5 6 7 8 9

           |  |   |  |        |

父代A:5 4 6 9 2 3 7 8 1

可得迴圈基因:1->5->2->4->9->1

用迴圈的基因構成子代A,順序與父代A一樣

1 2   4 5          9

用父代B剩餘的基因填滿子代A:

1 2 6 4 5 3 7 8 9

子代B的編碼同理。(迴圈基因 5->1->9->4->2->5)

2.3.3變異

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

注:變異概率Pm不能太小,這樣降低全域性搜尋能力;也不能太大,Pm > 0.5,這時GA退化為隨機搜尋。變異概率,一般取為0.001~0.1

1. 基本位變異運算元 (用於二進位制編碼)

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

如:變異前:

000001110000000010000

變異後:

000001110001000010000

2. 逆轉變異運算元(用於互換編碼)

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

如:變異前:

1346798205

變異後:

1246798305

2.3.4 執行引數

GA執行時選擇的引數應該視解決的具體問題而定,到目前為止,還沒有一個適用於GA所有應用領域的關於演算法引數的理論。下面是一般情況下使用GA時推薦的引數:

1) 交叉率

交叉率一般來說應該比較大,推薦使用80%-95%。

2) 變異率

變異率一般來說應該比較小,一般使用0.5%-1%最好。

3) 種群的規模

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

4) 遺傳運算的終止進化代數

個人的想法是,設定一個計數器,如果連續N代出現的最優個體的適應度都一樣時,(嚴格的說應該是,連續N代子代種群的最優個體適應度都<=父代最優個性的適應度)可以終止運算。

也可以簡單的根據經驗固定進化的代數。

II 運算流程

 圖中的“是否滿足停止準則”便可參照上節中“遺傳運算的終止進化代數”

下面是補充內容,於本演算法沒有太多的關係。

災變與精英主義

災變

遺傳演算法的區域性搜尋能力較強,但是很容易陷入區域性極值。引用網上的一段原話:

“那麼如何解決遺傳演算法容易陷入區域性極值的問題呢?讓我們來看看大自然提供的方案。六千五百萬年以前,恐龍和靈長類動物並存,恐龍在地球上佔絕對統 治地位,如果恐龍沒有滅絕靈長類動物是絕沒有可能統治地球的。正是恐龍的滅絕才使靈長類動物有了充分進化的餘地,事實上地球至少經歷了5次物種大滅絕,每 次物種滅絕都給更加高階的生物提供了充分進化的餘地。所以要跳出區域性極值就必須殺死當前所有的優秀個體,從而讓遠離當前極值的點有充分的進化餘地。這就是災變的思想。”

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

何時進行災變,可以採用災變倒計數的方式。如果n代還沒有出現比之前更優秀的個體時,可以發生災變。災變次數可以這樣來確定,如果若干次災變後產生的個體的適應度與沒災變前的一樣,可停止災變。

精英主義

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

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

矛盾

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

應該辯證地看待它們之間的矛盾,兩者其實是可以共存的.我們在每一代進行交叉運算時,均直接把最優秀的個體複製到下一代;但當連續N代,都沒有更優 秀的個體出現時,便可以猜想可能陷入區域性最優解了,這樣可以採用災變的手段.可以說,精英主義是伴隨的每一代的,但災變卻不需要經常發生,否則演算法可能下 降為隨機搜尋了.

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

2.4基本的遺傳演算法的優點與不足

遺傳演算法的優點:

(1)群體搜尋,易於並行化處理;

(2)不是盲目窮舉,而是啟發式搜尋;

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

(4)容易實現。一旦有了一個遺傳演算法的程式,如果想解決一個新的問題,只需針對新的問題重新進行基因編碼就行;如果編碼方法也相同,那隻需要改變一下適應度函式就可以了。

遺傳演算法的不足:

1、早熟。這是最大的缺點,即演算法對新空間的探索能力是有限的,也容易收斂到區域性最優解。
2、大量計算。涉及到大量個體的計算,當問題複雜時,計算時間是個問題。
3、處理規模小。目前對於維數較高的問題,還是很難處理和優化的。
4、難於處理非線性約束。對非線性約束的處理,大部分演算法都是新增懲罰因子,這是一筆不小的開支。
5、穩定性差。因為演算法屬於隨機類演算法,需要多次運算,結果的可靠性差,不能穩定的得到解。

2.5遺傳演算法的改進

儘管遺傳演算法有許多優點,也有許多專家學者對遺傳演算法進行不斷研究,但目前存在的問題依然很多,如:

(1)適應度值標定方式多種多樣,沒有一個簡潔、通用的方法,不利於對遺傳演算法的使用。    

(2)遺傳演算法的早熟現象即很快收斂到區域性最優解而不是全域性最優解是迄今為止最難處理的關鍵問題。

(3)快要接近最優解時在最優解附近左右擺動,收斂較慢。

本節根據遺傳演算法所存在的這些問題分別從適應度值函式標定和增加群體多樣性兩方面著手解決。

遺傳演算法通常需要解決以下問題,如確定編碼方案,適應度函式標定,選擇遺傳操作方式及相關控制引數,停止準則確定等。相應地,為改進簡單遺傳演算法的實際計算效能,很多學者的改進工作也是分別從引數編碼、初始群體設定、適應度函式標定、遺傳操作運算元、控制引數的選擇以及遺傳演算法的結構等方面提出的。自從1975年J.H.Holland系統提出遺傳演算法的完整結構和理論以來,眾多學者一直致力於推動遺傳演算法的發展,對編碼方式、控制引數的確定和交叉機理等進行了深入的研究,提出了各種變形的遺傳演算法。其基本途徑概括起來主要有下面幾個方面:

(1)改進遺傳演算法的組成成分或使用技術,如選用優化控制引數、適合問題特性的編碼技術等。

(2)採用混合遺傳演算法(Hybrid Genetic Algorithm)。

(3)採用動態自適應技術,在進化過程中調整演算法控制引數和編碼精度。

(4)採用非標準的遺傳操作運算元。

(5)採用並行演算法。

在許多資料中都介紹了七種改進遺傳演算法:

(1)分層遺傳演算法(Hierarchic Genetic Algorithm);

(2)  CHC演算法;

(3)  Messy 遺傳演算法;

(4)自適應遺傳演算法(Adaptive Genetic Algorithm);

(5)基於小生境技術的遺傳演算法(Niched Genetic Algorithm,NGA);

(6)並行遺傳演算法(Parallel Genetic Algorithm);

(7)混合遺傳演算法:

①遺傳演算法與最速下降法相結合的混合遺傳演算法。

②遺傳演算法與模擬退火法(Simulated Annealing)相結合的混合遺傳演算法

2.6遺傳演算法的應用

遺傳演算法提供了一種求解複雜系統優化問題的通用框架,它不依賴於問題的具體領域,對問題的種類有很強的魯棒性。所以,廣泛應用於很多學科。下面是遺傳演算法的一此主要應用領域。
2.6.1函式優化
函式優化是遺傳演算法的經典應用領域,也是對遺傳演算法進行效能評價的常用算例。很多人構造出了各種各樣的複雜形式的測試函式。有連續函式也有離散函式,有凸函式也有凹函式,有低維函式也有高維函式,有確定函式也有隨機函式,有單峰值函式也有多峰值函式等。用這些幾何特性各具特色的函式來評價遺傳演算法的效能,更能反映演算法的本質效果而對於一些非線性、多模型、多目標的函式優化問題,用其他優化方法較難求解。而遺傳演算法卻可以方便地得到較好的結果。

2.6.2組合優化
隨著問題規模的增大,組合優化問題的搜尋空間也急劇擴大。有時在目前的計算機上用列舉法很難或甚至不可能求出其精確最優解。對這類複雜問題,人們已意識到應把主要精力放在尋求其滿意解上,而遺傳演算法是尋求這種滿意解的最佳工具之一。實踐證明,遺傳演算法已經在求解旅行商問題、揹包問題、裝箱問題、佈局優化、圖形劃分問題等各種具有NP難度的問題得到成功的應用。
2.6.3生產排程問題
生產排程問題在很多情況下建立起來的數學模難以精確求解,即使經過一些簡化之後可以進行求解.也會因簡化得太多而使得求解結果與實際相差甚遠。目前在現實生產中主要是靠一些經驗來進行排程。現在遺傳演算法已成為解決複雜排程問題的有效下具。在單件生產車間排程、流水線生產間排程、生產規劃、任務分配等方面遺傳演算法都得到了有效的應用。
2.6.4自動控制
在自動控制領域中有很多與優化相關的問題需要求解。遺傳演算法已在其中得到了初步的應用,並顯示出良好的效果。例如用遺傳演算法進行航空控制系統的優化、使用遺傳演算法設計空間交會控制器、基於遺傳演算法的模糊控制器的優化設計、基於遺傳演算法的引數辨識、基於遺傳演算法的模糊控制規則的學習、利用遺傳演算法進行人工神經網路的結構優化設計和權值學習等。都顯出了遺傳演算法在這此領域中應用的可能性。
2.6.5 機器人學
機器人是一類複雜的難以精確建模的人工系統,而遺傳演算法的起源就來自於人工自適應系統的研究。所以,機器人學理所當然地成為遺傳演算法的一個重要應用領域。例如,遺傳演算法已經在移動機器人路徑規劃、關節機器人運動軌跡規劃、機器人逆運動學求解、細胞機器人的結構優化和行為協調等方而得到研究和應用。 
2.6.6 影象處理

影象處理是計算機視覺中的一個重要研究領域。在影象處理過程中,如掃描、特徵提取、影象分割等不可避免地會存在一此誤差,從而影響影象的效果。如何使這些誤差最小是使計算機視覺達到實用化的重要要求。遺傳演算法在這些影象處理中的優化計算方面找到了用武之地。目前已在模式識別(包括漢字識別)、影象恢復、影象邊緣特徵提取等方而得到了應用。
2.6.7 人工生命
人下生命是用計算機、機械等人下媒體模擬或構造出的具有自然生物系統特有行為的人造系統。自組織能力和自學習能力是人下生命的兩大主要特徵。人下生命與遺傳演算法有著密切的關係。基於遺傳演算法的進化模型是研究人下生命現象的重要基礎理論。雖然人下生命的研究尚處於啟蒙階段,但遺傳演算法已在其進化模型、學習模型、行為模型、自組織模型等方面顯示出了初步的應用能力,並且必將得到更為深入的應用和發展。人工生命與遺傳演算法相輔相成,遺傳演算法為人下生命的研究提供一個有效的下具,人下生命的研究也必將促進遺傳演算法的進一步發展。
2.6.8 遺傳程式設計
1989年,美國Standford大學的Koza教授發展了遺傳程式設計的概念,其基木思想是:採用樹型結構表示計算機程式,運用遺傳演算法的思想,通過自動生成計算機程式來解決問題。雖然遺傳程式設計的理論尚米成熱,應用也有一此限制,但它已成功地應用於人工智慧、機器學習等領域。目前公開的遺傳程式設計實驗系統有十多個。例如,Koza開發的ADF系統,While開發的GPELST系統等。
2.6.9 機器學習
學習能力是高階自適應系統所具備的能力之一,基於遺傳演算法的機器學習,特別是分類器系統,在很多領域中都得到了應用。例如,遺傳演算法被用於學習模糊控制規則,利用遺傳演算法來學習隸屬度函式,從而更好地改進了模糊系統的效能;基於遺傳演算法的機器學習可用來調整人工神經網路的連線權,也可用於人工神經網路結構優化設計;分類器系統也在學習式多機器人路徑規劃系統中得到了成功的應用。
2.6.10 資料探勘
資料探勘是近幾年出現的資料庫技術,它能夠從大型資料庫中提取隱含的、先前未知的、有潛在應用價值的知識和規則。許多資料探勘問題可看成是搜尋問題,資料庫看作是搜尋空間,挖掘演算法看作是搜尋策略。因此,應用遺傳演算法在資料庫中進行搜尋,對隨機產生的一組規則進行進化.直到資料庫能被該組規則覆蓋,從而挖掘出隱含在資料庫中的規則。Sunil已成功地開發了一個基於遺傳演算法的資料探勘下具。利用該工具對兩個飛機失事的真實資料庫進行了資料探勘實驗,結果表明遺傳演算法是進行資料探勘的有效方法之一。