1 遺傳算法的概念
1.1 遺傳算法的科學定義
??遺傳算法(Genetic Algorithm, GA) 是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法 。
??其主要特點是:
??1.直接對結構對象進行操作,不存在求導和函數連續性的限定;
??2.具有內在的隱并行性和更好的全局尋優能力;
??3.采用概率化的尋優方法,不需要確定的規則就能自動獲取和指導優化的搜索空間,自適應地調整搜索方向。
??遺傳算法以一種群體中的所有個體為對象,并利用隨機化技術指導一個被編碼的參數空間進行高效搜索。其中,選擇、交叉和變異構成了遺傳算法的遺傳操作;參數編碼、初始群體的設定、適應度函數的設計、遺傳操作設計、控制參數設定五個要素組成了遺傳算法的核心內容。
1.2 遺傳算法的執行過程
??遺傳算法是從代表問題可能潛在的解集的一個種群(population)開始的,而一個種群則由經過基因(gene)編碼的一定數目的個體(individual)組成。每個個體實際上是染色體(chromosome)帶有特征的實體 。
??染色體作為遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現,如黑頭發的特征是由染色體中控制這一特征的某種基因組合決定的。因此,在一開始需要實現從表現型到基因型的映射即編碼工作 。由于仿照基因編碼的工作很復雜,我們往往進行簡化,如二進制編碼。
??初代種群產生之后,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇(selection)個體,并借助于自然遺傳學的遺傳算子(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。
??這個過程將導致種群像自然進化一樣的后生代種群比前代更加適應于環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解 。
1.3 遺傳算法過程圖解
2 相關生物學術語
??為了大家更好了解遺傳算法,在此之前先簡單介紹一下相關生物學術語,大家了解一下即可。
??基因型(genotype):性狀染色體的內部表現。
??表現型(phenotype):染色體決定的性狀的外部表現,或者說,根據基因型形成的個體的外部表現。
??進化(evolution):種群逐漸適應生存環境,品質不斷得到改良。生物的進化是以種群的形式進行的。
??適應度(fitness):度量某個物種對于生存環境的適應程度。
??選擇(selection):以一定的概率從種群中選擇若干個個體。一般,選擇過程是一種基于適應度的優勝劣汰的過程。
??復制(reproduction):細胞分裂時,遺傳物質DNA通過復制而轉移到新產生的細胞中,新細胞就繼承了舊細胞的基因。
??交叉(crossover):兩個染色體的某一相同位置處DNA被切斷,前后兩串分別交叉組合形成兩個新的染色體。也稱基因重組或雜交。
??變異(mutation):復制時可能(很小的概率)產生某些復制差錯,變異產生新的染色體,表現出新的性狀。
??編碼(coding):DNA中遺傳信息在一個長鏈上按一定的模式排列。遺傳編碼可看作從表現型到基因型的映射。
??解碼(decoding):基因型到表現型的映射。
??個體(individual):指染色體帶有特征的實體。
??種群(population:個體的集合,該集合內個體數稱為種群。
3 實現流程
??遺傳算法中每一條染色體,對應著遺傳算法的一個解決方案,一般我們用適應性函數(fitness function)來衡量這個解決方案的優劣。所以從一個基因組到其解的適應度形成一個映射。遺傳算法的實現過程實際上就像自然界的進化過程那樣。
??下面我們用袋鼠跳中的步驟一一對應解釋,以方便大家理解:
??1) 首先尋找一種對問題潛在解進行“數字化”編碼的方案。(建立表現型和基因型的映射關系)
??2) 隨機初始化一個種群(那么第一批袋鼠就被隨意地分散在山脈上),種群里面的個體就是這些數字化的編碼。
??3) 接下來,通過適當的解碼過程之后(得到袋鼠的位置坐標)。
??4) 用適應性函數對每一個基因個體作一次適應度評估(袋鼠爬得越高當然就越好,所以適應度相應越高)。
??5) 用選擇函數按照某種規定擇優選擇(每隔一段時間,射殺一些所在海拔較低的袋鼠,以保證袋鼠總體數目持平。)
??6) 讓個體基因變異(讓袋鼠隨機地跳一跳)。
??7) 然后產生子代(希望存活下來的袋鼠是多產的,并在那里生兒育女)。
??遺傳算法并不保證你能獲得問題的最優解,但是使用遺傳算法的最大優點在于你不必去了解和操心如何去“找”最優解。(你不必去指導袋鼠向那邊跳,跳多遠。)而只要簡單的“否定”一些表現不好的個體就行了。(把那些總是愛走下坡路的袋鼠射殺,這就是遺傳算法的精粹!)
??由此我們可以得出遺傳算法的一般步驟:
??1) 隨機產生種群。
??2) 根據策略判斷個體的適應度,是否符合優化準則,若符合,輸出最佳個體及其最優解,結束。否則,進行下一步。
??3) 依據適應度選擇父母,適應度高的個體被選中的概率高,適應度低的個體被淘汰。
??4) 用父母的染色體按照一定的方法進行交叉,生成子代。
??5) 對子代染色體進行變異。
??6) 由交叉和變異產生新一代種群,返回步驟2,直到最優解產生。
4 實現細節(以求解一元函數最大值為例)
4.1 編碼
??編碼是應用遺傳算法時要解決的首要問題,也是設計遺傳算法時的一個關鍵步驟。編碼方法影響到交叉算子、變異算子等遺傳算子的運算方法,很大程度上決定了遺傳進化的效率 。
??迄今為止人們已經提出了許多種不同的編碼方法。總的來說,這些編碼方法可以分為三大類:二進制編碼法、浮點編碼法、符號編碼法 。下面分別進行介紹。
4.1.1 二進制編碼
??就像人類的基因有AGCT 4種堿基序列一樣。不過在這里我們只用了0和1兩種堿基,然后將它們串成一條鏈形成染色體。一個位能表示出2種狀態的信息量,因此足夠長的二進制染色體便能表示所有的特征。這便是二進制編碼。如下:
??1110001010111
??它由二進制符號0和1所組成的二值符號集。它有以下一些優點:
??1)編碼、解碼操作簡單易行
??2)交叉、變異等遺傳操作便于實現
??3)合最小字符集編碼原則
??4)利用模式定力對算法進行理論分析
??二進制編碼的缺點是:對于一些連續函數的優化問題,由于其隨機性使得其局部搜索能力較差,如對于一些高精度的問題(如上題),當解迫近于最優解后,由于其變異后表現型變化很大,不連續,所以會遠離最優解,達不到穩定。
4.1.2 浮點編碼法
??二進制編碼雖然簡單直觀,一目了然。但是存在著連續函數離散化時的映射誤差。個體長度較短時,可能達不到精度要求,而個體編碼長度較長時,雖然能提高精度,但增加了解碼的難度,使遺傳算法的搜索空間急劇擴大。
??所謂浮點法,是指個體的每個基因值用某一范圍內的一個浮點數來表示。在浮點數編碼方法中,必須保證基因值在給定的區間限制范圍內,遺傳算法中所使用的交叉、變異等遺傳算子也必須保證其運算結果所產生的新個體的基因值也在這個區間限制范圍內。如下所示:
??1.2-3.2-5.3-7.2-1.4-9.7
??浮點數編碼方法有下面幾個優點:
??1) 適用于在遺傳算法中表示范圍較大的數。
??2) 適用于精度要求較高的遺傳算法。
??3) 便于較大空間的遺傳搜索。
??4) 改善了遺傳算法的計算復雜性,提高了運算交率。
??5) 便于遺傳算法與經典優化方法的混合使用。
??6) 便于設計針對問題的專門知識的知識型遺傳算子。
??7) 便于處理復雜的決策變量約束條件。
4.1.3 符號編碼法
??符號編碼法是指個體染色體編碼串中的基因值取自一個無數值含義、而只有代碼含義的符號集如{A,B,C…}。
??符號編碼的主要優點是:
??1) 符合有意義積術塊編碼原則。
??2) 便于在遺傳算法中利用所求解問題的專門知識。
??3) 便于遺傳算法與相關近似算法之間的混合使用。
4.2 對解的編碼(以求解一元函數最大值為例)
??我們將求解一元函數最大值問題的解視為袋鼠蹦跳的問題,那么,如何利用上面的編碼來為我們的袋鼠染色體編碼呢?首先我們要明確一點:編碼無非就是建立從基因型到表現型的映射關系。這里的表現型可以理解為個體特征(比如身高、體重、毛色等等)。那么,在此問題下,我們關心的個體特征就是:袋鼠的位置坐標(因為我們要把海拔低的袋鼠給殺掉)。無論袋鼠長什么樣,愛吃什么。我們關心的始終是袋鼠在哪里,并且只要知道了袋鼠的位置坐標 (位置坐標就是相應的染色體編碼,可以通過解碼得出),我們就可以:
??1) 在喜馬拉雅山脈的地圖上找到相應的位置坐標,算出海拔高度。(相當于通過自變量求得適應函數的值)然后判讀該不該射殺該袋鼠。
??2) 可以知道染色體交叉和變異后袋鼠新的位置坐標。
??在一元函數求解最大值的問題中,我們把極大值比喻為山峰,那么,袋鼠的位置坐標可以比喻為區間[-1, 2]的某一個x坐標(有了x坐標,再通過函數表達式可以算出函數值 <==> 得到了袋鼠染色體編碼,解碼得到位置坐標,在喜馬拉雅山脈地圖查詢位置坐標算出海拔高度)。這個x坐標是一個實數,現在,說白了就是怎么對這個x坐標進行編碼。下面我們以二進制編碼為例講解,不過這種情況下以二進制編碼比較復雜就是了。(如果以浮點數編碼,其實就很簡潔了,就一浮點數而已。)
??我們說過,一定長度的二進制編碼序列,只能表示一定精度的浮點數。 在這里假如我們要求解精確到六位小數,由于區間長度為2 - (-1) = 3 ,為了保證精度要求,至少把區間[-1,2]分為3 × 10^6等份。又因為
??2^21 = 2097152 < 3*10^6 < 2^22 = 4194304
??所以編碼的二進制串至少需要22位。
??把一個二進制串(b0,b1,....bn)轉化為區間里面對應的實數值可以通過下面兩個步驟:
??1)將一個二進制串代表的二進制數轉化為10進制數
??2)對應區間內的實數:
??例如一個二進制串(1000101110110101000111)通過上面換算以后,表示實數值0.637197。
??好了,上面的編碼方式只是舉個例子讓大家更好理解而已,編碼的方式千奇百怪,層出不窮,每個問題可能采用的編碼方式都不一樣。 在這一點上大家要注意。
4.3 評價個體的適應度
??前面說了,適應度函數主要是通過個體特征從而判斷個體的適應度 。在本例的袋鼠跳中,我們只關心袋鼠的海拔高度,以此來判斷是否該射殺該袋鼠。這樣一來,該函數就非常簡單了。只要輸入袋鼠的位置坐標,在通過相應查找運算,返回袋鼠當前位置的海拔高度就行。
??適應度函數也稱評價函數,是根據目標函數確定的用于區分群體中個體好壞的標準。適應度函數總是非負的,而目標函數可能有正有負,故需要在目標函數與適應度函數之間進行變換。
??評價個體適應度的一般過程為:
??1. 對個體編碼串進行解碼處理后,可得到個體的表現型。
??2. 由個體的表現型可計算出對應個體的目標函數值。
??3. 根據最優化問題的類型,由目標函數值按一定的轉換規則求出個體的適應度。
4.4 選擇個體
??遺傳算法中的選擇操作就是用來確定如何從父代群體中按某種方法選取那些個體,以便遺傳到下一代群體。選擇操作用來確定重組或交叉個體,以及被選個體將產生多少個子代個體。前面說了,我們希望海拔高的袋鼠存活下來,并盡可能繁衍更多的后代。但我們都知道,在自然界中,適應度高的袋鼠越能繁衍后代,但這也是從概率上說的而已。畢竟有些適應度低的袋鼠也可能逃過我們的眼睛。
4.4.1 選擇個體的方法
??那么,怎么建立這種概率關系呢?
??下面介紹幾種常用的選擇算子:
??1. 輪盤賭選擇(Roulette Wheel Selection):是一種回放式隨機采樣方法。每個個體進入下一代的概率等于它的適應度值與整個種群中個體適應度值和的比例。選擇誤差較大。
??2. 隨機競爭選擇(Stochastic Tournament):每次按輪盤賭選擇一對個體,然后讓這兩個個體進行競爭,適應度高的被選中,如此反復,直到選滿為止。
??3. 最佳保留選擇:首先按輪盤賭選擇方法執行遺傳算法的選擇操作,然后將當前群體中適應度最高的個體結構完整地復制到下一代群體中。
??4. 無回放隨機選擇(也叫期望值選擇Excepted Value Selection):根據每個個體在下一代群體中的生存期望來進行隨機選擇運算。方法如下:
??(1) 計算群體中每個個體在下一代群體中的生存期望數目N。
??(2) 若某一個體被選中參與交叉運算,則它在下一代中的生存期望數目減去 0.5,若某一個體未被選中參與交叉運算,則它在下一代中的生存期望數目減去1.0。
??(3) 隨著選擇過程的進行,若某一個體的生存期望數目小于0時,則該個體就不再有機會被選中。
??5. 確定式選擇:按照一種確定的方式來進行選擇操作。具體操作過程如下:
??(1)計算群體中各個個體在下一代群體中的期望生存數目N。
??(2)用N的整數部分確定各個對應個體在下一代群體中的生存數目。
??(3)用N的小數部分對個體進行降序排列,順序取前M個個體加入到下一代群體中。至此可完全確定出下一代群體中M個個體。
??6. 無回放余數隨機選擇:可確保適應度比平均適應度大的一些個體能夠被遺傳到下一代群體中,因而選擇誤差比較小。
??7. 均勻排序:對群體中的所有個體按期適應度大小進行排序,基于這個排序來分配各個個體被選中的概率。
??8. 最佳保存策略:當前群體中適應度最高的個體不參與交叉運算和變異運算,而是用它來代替掉本代群體中經過交叉、變異等操作后所產生的適應度最低的個體。
??9. 隨機聯賽選擇:每次選取幾個個體中適應度最高的一個個體遺傳到下一代群體中。
??10. 排擠選擇:新生成的子代將代替或排擠相似的舊父代個體,提高群體的多樣性。
4.4.2 個體選擇方法示例
??下面以輪盤賭選擇為例給大家講解一下:
??假如有5條染色體,他們的適應度分別為5、8、3、7、2。
??那么總的適應度為:F = 5 + 8 + 3 + 7 + 2 = 25。
??那么各個個體的被選中的概率為:
??α1 = ( 5 / 25 ) * 100% = 20%
??α2 = ( 8 / 25 ) * 100% = 32%
??α3 = ( 3 / 25 ) * 100% = 12%
??α4 = ( 7 / 25 ) * 100% = 28%
??α5 = ( 2 / 25 ) * 100% = 8%
??所以轉盤如下:
??當指針在這個轉盤上轉動,停止下來時指向的個體就是天選之人啦。可以看出,適應性越高的個體被選中的概率就越大。
4.5 遺傳--染色體交叉(crossover)
??遺傳算法的交叉操作,是指對兩個相互配對的染色體按某種方式相互交換其部分基因,從而形成兩個新的個體。
??適用于二進制編碼個體或浮點數編碼個體的交叉算子:
??1. 單點交叉(One-point Crossover):指在個體編碼串中只隨機設置一個交叉點,然后再該點相互交換兩個配對個體的部分染色體。
??2. 兩點交叉與多點交叉:
??(1) 兩點交叉(Two-point Crossover):在個體編碼串中隨機設置了兩個交叉點,然后再進行部分基因交換。
??(2) 多點交叉(Multi-point Crossover)
??3. 均勻交叉(也稱一致交叉,Uniform Crossover):兩個配對個體的每個基因座上的基因都以相同的交叉概率進行交換,從而形成兩個新個體。
??4. 算術交叉(Arithmetic Crossover):由兩個個體的線性組合而產生出兩個新的個體。該操作對象一般是由浮點數編碼表示的個體。
??二進制編碼的染色體交叉過程非常類似高中生物中所講的同源染色體的聯會過程――隨機把其中幾個位于同一位置的編碼進行交換,產生新的個體。
??對應的二進制交叉:
4.6 變異--基因突變(Mutation)
??遺傳算法中的變異運算,是指將個體染色體編碼串中的某些基因座上的基因值用該基因座上的其它等位基因來替換,從而形成新的個體。
??例如下面這串二進制編碼:
101101001011001
??經過基因突變后,可能變成以下這串新的編碼:
??以下變異算子適用于二進制編碼和浮點數編碼的個體:
??1. 基本位變異(Simple Mutation):對個體編碼串中以變異概率、隨機指定的某一位或某幾位僅因座上的值做變異運算。
??2. 均勻變異(Uniform Mutation):分別用符合某一范圍內均勻分布的隨機數,以某一較小的概率來替換個體編碼串中各個基因座上的原有基因值。(特別適用于在算法的初級運行階段)
??3. 邊界變異(Boundary Mutation):隨機的取基因座上的兩個對應邊界基因值之一去替代原有基因值。特別適用于最優點位于或接近于可行解的邊界時的一類問題。
??4. 非均勻變異:對原有的基因值做一隨機擾動,以擾動后的結果作為變異后的新基因值。對每個基因座都以相同的概率進行變異運算之后,相當于整個解向量在解空間中作了一次輕微的變動。
??5. 高斯近似變異:進行變異操作時用符號均值為P的平均值,方差為P**2的正態分布的一個隨機數來替換原有的基因值。
Code: