經典算法研究系列:七、深入淺出遺傳算法
作者:July 二零一一年一月十二日。
本文參考:維基百科 華南理工大學電子講義 互聯網
-------------------------------------------------------------------------------
一、初探遺傳算法
Ok,先看維基百科對遺傳算法所給的解釋:
遺傳算法是計算數學中用於解決最優化的搜索算法,是進化算法的一種。進化算法最初是借鑑了進化生物學中的一些現象而發展起來的,這些現象包括遺傳、突變、自然選擇以及雜交等。
遺傳算法通常實現方式爲一種計算機模擬。對於一個最優化問題,一定數量的候選解(稱爲個體)的抽象表示(稱爲染色體)的種羣向更好的解進化。傳統上,解用二進制表示(即0和1的串),但也可以用其他表示方法。進化從完全隨機個體的種羣開始,之後一代一代發生。在每一代中,整個種羣的適應度被評價,從當前種羣中隨機地選擇多個個體(基於它們的適應度),通過自然選擇和突變產生新的生命種羣,該種羣在算法的下一次迭代中成爲當前種羣。
光看定義,可能思路並不清晰,咱們來幾個清晰的圖解、步驟、公式:
基本遺傳算法的框圖:
所以,遺傳算法基本步驟是:
1) 初始化 t←0進化代數計數器;T是最大進化代數;隨機生成M個個體作爲初始羣體 P(t);
2) 個體評價 計算P(t)中各個個體的適應度值;
3) 選擇運算 將選擇算子作用於羣體;
4) 交叉運算 將交叉算子作用於羣體;
5) 變異運算 將變異算子作用於羣體,並通過以上運算得到下一代羣體P(t + 1);
6) 終止條件判斷 t≦T:t← t+1 轉到步驟2;
t>T:終止 輸出解。
好的,看下遺傳算法的僞代碼實現:
▲Procedures GA: 僞代碼
begin
initialize P(0);
t = 0; //t是進化的代數,一代、二代、三代...
while(t <= T) do
for i = 1 to M do //M是初始種羣的個體數
Evaluate fitness of P(t); //計算P(t)中各個個體的適應度
end for
for i = 1 to M do
Select operation to P(t); //將選擇算子作用於羣體
end for
for i = 1 to M/2 do
Crossover operation to P(t); //將交叉算子作用於羣體
end for
for i = 1 to M do
Mutation operation to P(t); //將變異算子作用於羣體
end for
for i = 1 to M do
P(t+1) = P(t); //得到下一代羣體P(t + 1)
end for
t = t + 1; //終止條件判斷 t≦T:t← t+1 轉到步驟2
end while
end
二、深入遺傳算法
1、智能優化算法概述
智能優化算法又稱現代啓發式算法,是一種具有全局優化性能、通用性強且適合於並行處理的算法。
這種算法一般具有嚴密的理論依據,而不是單純憑藉專家經驗,理論上可以在一定的時間內找到最優解或近似最優解。
遺傳算法屬於智能優化算法之一。
常用的智能優化算法有:
遺傳算法 、模擬退火算法、禁忌搜索算法、粒子羣算法、蟻羣算法。
(本經典算法研究系列,日後將陸續闡述模擬退火算法、粒子羣算法、蟻羣算法。)
2、遺傳算法概述
遺傳算法是由美國的J. Holland教授於1975年在他的專著《自然界和人工系統的適應性》中首先提出的。
借鑑生物界自然選擇和自然遺傳機制的隨機化搜索算法。
模擬自然選擇和自然遺傳過程中發生的繁殖、交叉和基因突變現象。
在每次迭代中都保留一組候選解,並按某種指標從解羣中選取較優的個體,利用遺傳算子(選擇、交叉和變異)對這些個
體進行組合,產生新一代的候選解羣,重複此過程,直到滿足某種收斂指標爲止。
基本遺傳算法(Simple Genetic Algorithms,GA)又稱簡單遺傳算法或標準遺傳算法),是由Goldberg總結出的一種最基本的遺傳算法,其遺傳進化操作過程簡單,容易理解,是其它一些遺傳算法的雛形和基礎。
3、基本遺傳算法的組成
(1)編碼(產生初始種羣)
(2)適應度函數
(3)遺傳算子(選擇、交叉、變異)
(4)運行參數
接下來,咱們分門別類,分別闡述着基本遺傳算法的五個組成部分:
1、編碼
遺傳算法(GA)通過某種編碼機制把對象抽象爲由特定符號按一定順序排成的串。
正如研究生物遺傳是從染色體着手,而染色體則是由基因排成的串。
基本遺傳算法(SGA)使用二進制串進行編碼。
初始種羣:基本遺傳算法(SGA)採用隨機方法生成若干個個體的集合,該集合稱爲初始種羣。
初始種羣中個體的數量稱爲種羣規模。
2、適應度函數
遺傳算法對一個個體(解)的好壞用適應度函數值來評價,適應度函數值越大,解的質量越好。
適應度函數是遺傳算法進化過程的驅動力,也是進行自然選擇的唯一標準,
它的設計應結合求解問題本身的要求而定。
3.1、選擇算子
遺傳算法使用選擇運算對個體進行優勝劣汰操作。
適應度高的個體被遺傳到下一代羣體中的概率大;適應度低的個體,被遺傳到下一代羣體中的概率小。
選擇操作的任務就是從父代羣體中選取一些個體,遺傳到下一代羣體。
基本遺傳算法(SGA)中選擇算子採用輪盤賭選擇方法。
Ok,下面就來看下這個輪盤賭的例子,這個例子通俗易懂,對理解選擇算子幫助很大。
輪盤賭選擇方法
輪盤賭選擇又稱比例選擇算子,其基本思想是:
各個個體被選中的概率與其適應度函數值大小成正比。
設羣體大小爲N,個體xi 的適應度爲 f(xi),則個體xi的選擇概率爲:
輪盤賭選擇法可用如下過程模擬來實現:
(1)在[0, 1]內產生一個均勻分佈的隨機數r。
(2)若r≤q1,則染色體x1被選中。
(3)若qk-1<r≤qk(2≤k≤N), 則染色體xk被選中。
其中的qi稱爲染色體xi (i=1, 2, …, n)的積累概率, 其計算公式爲:
積累概率實例:
輪盤賭選擇方法的實現步驟:
(1)計算羣體中所有個體的適應度值;
(2)計算每個個體的選擇概率;
(3)計算積累概率;
(4)採用模擬賭盤操作(即生成0到1之間的隨機數與每個個體遺傳到下一代羣體的概率進行匹配)
來確定各個個體是否遺傳到下一代羣體中。
例如,有染色體
s1= 13 (01101)
s2= 24 (11000)
s3= 8 (01000)
s4= 19 (10011)
假定適應度爲f(s)=s^2 ,則
f (s1) = f(13) = 13^2 = 169
f (s2) = f(24) = 24^2 = 576
f (s3) = f(8) = 8^2 = 64
f (s4) = f(19) = 19^2 = 361
染色體的選擇概率爲:
染色體的累計概率爲:
根據上面的式子,可得到:
例如設從區間[0, 1]中產生4個隨機數:
r1 = 0.450126, r2 = 0.110347
r3 = 0.572496, r4 = 0.98503
3.2、交叉算子
交叉運算,是指對兩個相互配對的染色體依據交叉概率 Pc 按某種方式相互交換其部分基因,
從而形成兩個新的個體。
交叉運算是遺傳算法區別於其他進化算法的重要特徵,它在遺傳算法中起關鍵作用,
是產生新個體的主要方法。
基本遺傳算法(SGA)中交叉算子採用單點交叉算子。
單點交叉運算
3.3、變異算子
變異運算,是指改變個體編碼串中的某些基因值,從而形成新的個體。
變異運算是產生新個體的輔助方法,決定遺傳算法的局部搜索能力,保持種羣多樣性。
交叉運算和變異運算的相互配合,共同完成對搜索空間的全局搜索和局部搜索。
基本遺傳算法(SGA)中變異算子採用基本位變異算子。
基本位變異算子是指對個體編碼串隨機指定的某一位或某幾位基因作變異運算。
對於二進制編碼符號串所表示的個體,若需要進行變異操作的某一基因座上的原有基因值爲0,
則將其變爲1;反之,若原有基因值爲1,則將其變爲0 。
基本位變異算子的執行過程:
4、運行參數
(1)M :種羣規模
(2)T : 遺傳運算的終止進化代數
(3)Pc :交叉概率
(4)Pm :變異概率
三、淺出遺傳算法
遺傳算法的本質
遺傳算法本質上是對染色體模式所進行的一系列運算,即通過選擇算子將當前種羣中的優良模式遺傳
到下一代種羣中,利用交叉算子進行模式重組,利用變異算子進行模式突變。
通過這些遺傳操作,模式逐步向較好的方向進化,最終得到問題的最優解。
遺傳算法的主要有以下八方面的應用:
(1)組合優化 (2)函數優化 (3)自動控制 (4)生產調度
(5)圖像處理 (6)機器學習 (7)人工生命 (8)數據挖掘
四、遺傳算法的應用
遺傳算法的應用舉例、透析本質(這個例子簡明、但很重要)
已知x爲整數,利用遺傳算法求解區間[0, 31]上的二次函數y=x2的最大值。
[分析]
原問題可轉化爲在區間[0, 31]中搜索能使 y 取最大值的點 a 的問題。
個體:[0, 31] 中的任意點x
適應度:函數值f(x)=x2
解空間:區間[0, 31]
這樣, 只要能給出個體x的適當染色體編碼, 該問題就可以用遺傳算法來解決。
[解]
(1) 設定種羣規模,編碼染色體,產生初始種羣。
將種羣規模設定爲4;用5位二進制數編碼染色體;取下列個體組成初始種羣S1
s1= 13 (01101), s2= 24 (11000)
s3= 8 (01000), s4= 19 (10011)
(2) 定義適應度函數, 取適應度函數
f (x)=x^2
(3) 計算各代種羣中的各個體的適應度, 並對其染色體進行遺傳操作,
直到適應度最高的個體,即31(11111)出現爲止。
首先計算種羣S1中各個體:
s1= 13(01101), s2= 24(11000)
s3= 8(01000), s4= 19(10011)
的適應度f (si), 容易求得:
f (s1) = f(13) = 13^2 = 169
f (s2) = f(24) = 24^2 = 576
f (s3) = f(8) = 8^2 = 64
f (s4) = f(19) = 19^2 = 361
再計算種羣S1中各個體的選擇概率:
由此可求得
P(s1) = P(13) = 0.14
P(s2) = P(24) = 0.49
P(s3) = P(8) = 0.06
P(s4) = P(19) = 0.31
再計算種羣S1中各個體的積累概率:
選擇-複製
設從區間[0, 1]中產生4個隨機數如下:
r1 = 0.450126, r2 = 0.110347
r3 = 0.572496, r4 = 0.98503
於是,經複製得羣體:
s1’ =11000(24), s2’ =01101(13)
s3’ =11000(24)(24被選中倆次), s4’ =10011(19)
交叉
設交叉率pc=100%,即S1中的全體染色體都參加交叉運算。
設s1’與s2’配對,s3’與s4’配對。
s1’ =11000(24), s2’ =01101(13)
s3’ =11000(24), s4’ =10011(19)
分別交換後兩位基因,得新染色體:
s1’’=11001(25), s2’’=01100(12)
s3’’=11011(27), s4’’=10000(16)
變異
設變異率pm=0.001。
這樣,羣體S1中共有
5×4×0.001=0.02
位基因可以變異。
0.02位顯然不足1位,所以本輪遺傳操作不做變異。
於是,得到第二代種羣S2:
s1=11001(25), s2=01100(12)
s3=11011(27), s4=10000(16)
第二代種羣S2中各染色體的情況:
假設這一輪選擇-複製操作中,種羣S2中的4個染色體都被選中,則得到羣體:
s1’=11001(25), s2’= 01100(12)
s3’=11011(27), s4’= 10000(16)
做交叉運算,讓s1’與s2’,s3’與s4’ 分別交換後三位基因,得
s1’’=11100(28), s2’’ = 01001(9)
s3’’ =11000(24), s4’’ = 10011(19)
這一輪仍然不會發生變異。
於是,得第三代種羣S3:
s1=11100(28), s2=01001(9)
s3=11000(24), s4=10011(19)
第三代種羣S3中各染色體的情況:
設這一輪的選擇-複製結果爲:
s1’=11100(28), s2’=11100(28)
s3’=11000(24), s4’=10011(19)
做交叉運算,讓s1’與s4’,s2’與s3’ 分別交換後兩位基因,得
s1’’=11111(31), s2’’=11100(28)
s3’’=11000(24), s4’’=10000(16)
這一輪仍然不會發生變異。
於是,得第四代種羣S4:
s1=11111(31)(出現最優解), s2=11100(28)
s3=11000(24), s4=10000(16)
顯然,在這一代種羣中已經出現了適應度最高的染色體s1=11111。
於是,遺傳操作終止,將染色體(11111)作爲最終結果輸出。
然後,將染色體“11111”解碼爲表現型,即得所求的最優解:31。
將31代入函數y=x2中,即得原問題的解,即函數y=x2的最大值爲961。
所以,綜合以上各代羣的情況,如下:
ok,完。
文章有誤之處,一經發現,立馬修正。同時,也望各位不吝指正。
-------------------------------------------
本人July對本博客所有文章和資料享有版權,轉載或引用任何文章、資料請註明出處。
向您的厚道致敬。謝謝。 July、二零一一年一月十二日。