1. 程式人生 > >遺傳演算法改進

遺傳演算法改進

遺傳演算法(Genetic Algorithm, GA)是近幾年發展起來的一種嶄新的全域性優化演算法。本文將講解這種演算法,並介紹如何 Robocode Java 坦克機器人中採用此演算法以實現機器人進化。

遺傳演算法

遺傳演算法(Genetic Algorithm, GA)是近幾年發展起來的一種嶄新的全域性優化演算法。1962年霍蘭德(Holland)教授首次提出了GA演算法的思想,它借用了模擬生物遺傳學和自然選擇 機理,通過自然選擇、遺傳、變異等作用機制,實現各個個體的適應性的提高。從某種程度上說遺傳演算法是對生物進化過程進行的數學方式模擬。

這一點體現了自然界中"物競天擇、適者生存"進化過程。與自然界相似,遺傳演算法對求解問題的本身一無所知,它所需要的僅是對演算法所產生的每個染色體 進行評價,把問題的解表示成染色體,並基於適應值來選擇染色體,使適應性好的染色體有更多的繁殖機會。在演算法中也即是以二進位制編碼的串。並且,在執行遺傳 演算法之前,給出一群染色體,也即是假設解。然後,把這些假設解置於問題的“環境”中,也即一個適應度函式中來評價。並按適者生存的原則,從中選擇出較適應 環境的染色體進行復制, 淘汰低適應度的個體,再通過交叉,變異過程產生更適應環境的新一代染色體群。對這個新種群進行下一輪進化,至到最適合環境的值。

遺傳演算法已用於求解帶有應用前景的一些問題,例如遺傳程式設計、函式優化、排序問題、人工神經網路、分類系統、計算機影象處理和機器人運動規劃等。

術語說明

由於遺傳演算法是由進化論和遺傳學機理而產生的搜尋演算法,所以在這個演算法中會用到很多生物遺傳學知識,下面是我們將會用來的一些術語說明:

一、染色體(Chronmosome)

染色體又可以叫做基因型個體(individuals),一定數量的個體組成了群體(population),群體中個體的數量叫做群體大小。

二、基因(Gene)

基因是串中的元素,基因用於表示個體的特徵。例如有一個串S=1011,則其中的1,0,1,1這4個元素分別稱為基因。它們的值稱為等位基因 (Alletes)。

三、基因地點(Locus)

基因地點在演算法中表示一個基因在串中的位置稱為基因位置(Gene Position),有時也簡稱基因位。基因位置由串的左向右計算,例如在串 S=1101 中,0的基因位置是3。

四、基因特徵值(Gene Feature)

在用串表示整數時,基因的特徵值與二進位制數的權一致;例如在串 S=1011 中,基因位置3中的1,它的基因特徵值為2;基因位置1中的1,它的基因特徵值為8。

五、適應度(Fitness)

各個個體對環境的適應程度叫做適應度(fitness)。為了體現染色體的適應能力,引入了對問題中的每一個染色體都能進行度量的函式,叫適應度函 數. 這個函式是計算個體在群體中被使用的概率。

操作演算法

霍蘭德(Holland)教授最初提出的演算法也叫簡單遺傳演算法,簡單遺傳演算法的遺傳操作主要有三種:選擇(selection)、交叉 (crossover)、變異(mutation)這也是遺傳演算法中最常用的三種演算法:

1.選擇(selection)

選擇操作也叫複製操作,從群體中按個體的適應度函式值選擇出較適應環境的個體。一般地說,選擇將使適應度高的個體繁殖下一代的數目較多,而適應度較 小的個體,繁殖下一代的數目較少,甚至被淘汰。最通常的實現方法是輪盤賭(roulette wheel)模型。令Σfi表示群體的適應度值之總和,fi表示種群中第i個染色體的適應度值,它被選擇的概率正好為其適應度值所佔份額fi/Σfi。如 下圖表中的資料適應值總和Σfi=6650,適應度為2200變選擇的可能為fi/Σfi=2200/6650=0.394.


圖1. 輪盤賭模型 
圖1. 輪盤賭模型

Fitness 值: 2200 1800 1200 950 400 100
選 擇概率: 3331 0.271 0.18 0.143 0.06 0.015

2.交叉(Crossover)

交叉運算元將被選中的兩個個體的基因鏈按一定概率pc進行交叉,從而生成兩個新的個體,交叉位置pc是隨機的。其中Pc是一個系統引數。根據問題的不 同,交叉又為了單點交叉運算元(Single Point Crossover)、雙點交叉運算元(Two Point Crossover)、均勻交叉運算元 (Uniform Crossover),在此我們只討論單點交叉的情況。

單點交叉操作的簡單方式是將被選擇出的兩個個體S1和S2作為父母個體,將兩者的部分基因碼值進行交換。假設如下兩個8位的個體:

S1	1000  1111	S2	1110  1100

 

產生一個在1到7之間的隨機數c,假如現在產生的是2,將S1和S2的低二位交換:S1的高六位與S2的低六位組成數串10001100,這就是 S1和S2的一個後代P1個體;S2的高六位與S1的低二位組成數串11101111,這就是S1和S2的一個後代P2個體。其交換過程如下圖所示:

Crossover 11110000 Crossover 11110000
S1 1000 1111 S2 1110 1100
P1 1000 1100 P2 1110 1111

3.變異(Mutation)

這是在選中的個體中,將新個體的基因鏈的各位按概率pm進行異向轉化,最簡單方式是改變串上某個位置數值。對二進位制編碼來說將0與1互換:0變異為 1,1變異為0。

如下8位二進位制編碼:

1	1	1	0	1	1	0	0

 

隨機產生一個1至8之間的數i,假如現在k=6,對從右往左的第6位進行變異操作,將原來的1變為0,得到如下串:

1	1	0	0	1	1	0	0

 

整個交叉變異過程如下圖:


圖2. 交叉變異過程 
圖2. 交叉變異過程 圖2. 交叉變異過程

4.精英主義 (Elitism)

僅僅從產生的子代中選擇基因去構造新的種群可能會丟失掉上一代種群中的很多資訊。也就是說當利用交叉和變異產生新的一代時,我們有很大的可能把在某 箇中間步驟中得到的最優解丟失。在此我們使用精英主義(Elitism)方法,在每一次產生新的一代時,我們首先把當前最優解原封不動的複製到新的一代 中,其他步驟不變。這樣任何時刻產生的一個最優解都可以存活到遺傳演算法結束。

上述各種運算元的實現是多種多樣的,而且許多新的運算元正在不斷地提出,以改進GA某些效能。比如選擇演算法還有分級均衡選擇等等。

遺傳演算法的所需引數

說簡單點遺傳演算法就是遍歷搜尋空間或連線池,從中找出最優的解。搜尋空間中全部都是個體,而群體為搜尋空間的一個子集。並不是所有被選擇了的染色體 都要進行交叉操作和變異操作,而是以一定的概率進行,一般在程式設計中交叉發生的概率要比變異發生的概率選取得大若干個數量級。大部分遺傳演算法的步驟都很 類似,常使用如下引數:

Fitness函式:見上文介紹。

Fitnessthreshold(適應度閥值):適合度中的設定的閥值,當最優個體的適應度達到給定的閥值,或者最優個體的適應度和群體適應度不 再上升時(變化率為零),則演算法的迭代過程收斂、演算法結束。否則,用經過選擇、交叉、變異所得到的新一代群體取代上一代群體,並返回到選擇操作處繼續迴圈 執行。

P:種群的染色體總數叫種群規模,它對演算法的效率有明顯的影響,其長度等於它包含的個體數量。太小時難以求出最優解,太大則增長收斂時間導致程式運 行時間長。對不同的問題可能有各自適合的種群規模,通常種群規模為 30 至 160。

pc:在迴圈中進行交叉操作所用到的概率。交叉概率(Pc)一般取0.6至0.95之間的值,Pc太小時難以向前搜尋,太大則容易破壞高適應值的結 構。

Pm:變異概率,從個體群中產生變異的概率,變異概率一般取0.01至0.03之間的值變異概率Pm太小時難以產生新的基因結構,太大使遺傳演算法成 了單純的隨機搜尋。

另一個系統引數是個體的長度,有定長和變長兩種。它對演算法的效能也有影響。由於GA是一個概率過程,所以每次迭代的情況是不一樣的,系統引數不同, 迭代情況也不同。

遺傳步驟

瞭解了上面的基本引數,下面我們來看看遺傳演算法的基本步驟。

基本過程為:

  1. 對待解決問題進行編碼,我們將問題結構變換為位串形式編碼表示的過程叫編碼;而相反將位串形式編碼表示變換為原問題結構的過程叫譯碼。
  2. 隨機初始化群體P(0):=(p1, p2, … pn);
  3. 計算群體上每個個體的適應度值(Fitness)
  4. 評估適應度,對當前群體P(t)中每個個體Pi計算其適應度F(Pi),適應度表示了該個體的效能好壞
  5. 按由個體適應度值所決定的某個規則應用選擇運算元產生中間代Pr(t)
  6. 依照Pc選擇個體進行交叉操作
  7. 仿照Pm對繁殖個體進行變異操作
  8. 沒有滿足某種停止條件,則轉第3步,否則進入9
  9. 輸出種群中適應度值最優的個體

程式的停止條件最簡單的有如下二種:完成了預先給定的進化代數則停止;種群中的最優個體在連續若干代沒有改進或平均適應度在連續若干代基本沒有改進 時停止。

根據遺傳演算法思想可以畫出如右圖所示的簡單遺傳演算法框圖:


圖3. 簡單遺傳演算法框圖 
圖3. 簡單遺傳演算法框圖

下面虛擬碼簡單說明了遺傳演算法操作過程:

choose an intial population

For each h in population,compute Fitness(h)

While(max Fitness(h) < Fitnessthreshold)

do selection

    do crossover

do mutation  

 update population

For each h in population,compute Fitness(h)

Return best Fitness