數學建模方法-遺傳算法(理論篇)


一、引言

  哈嘍大家好,今天要給大家講的是“遺傳算法”。跟粒子群算法、蟻群算法一樣,遺傳算法也是屬於啟發式算法,它基於達爾文的進化論,模擬進化論中的“自然選擇,物競天擇、適者生存”,通過N代的遺傳、變異、交叉、復制,進化出問題的最優解。

二、淺談生物學

2.1  達爾文教你進化論

  學過初中生物的應該都知道達爾文的進化論。總結起來其實就是“物競天擇、適者生存”。這是什么意思呢?通俗講,就是在弱肉強食的時代,唯有強者才能生存下來。記住這句話,這是遺傳算法的核心。

2.2  遺傳學所告訴我們的

  好,達爾文告訴我們要生存下去就要適應環境,但是如何它沒告訴我們存活下來的生物是如何不被淘汰的。遺傳學告訴了我們答案。我們知道,細胞是所有生物的基石。對於每個細胞,都有一套相同的染色體,而染色體,則是由DNA所聚合而成,其中DNA又是由基因組成的。每個基因都編碼了一個獨特的性狀,比如頭發或眼皮的顏色。如下圖:

  我們假設在某個地區O,生活着兩類生物,其中攜帶基因a的生物種群P能夠適應當前的自然環境,攜帶基因b的生物種群Q不能夠適應當前的自然環境。因此,隨着歲月的流逝,那些不能適應當前自然環境的生物一個個死去,而能夠適應當前自然環境的生物不斷的繁衍。很多年很多年過去后,這個地區O留下來的都是攜帶基因a的生物種群P。

  好了,生物學知識暫且講到這里,足夠我們接下來解釋我們的遺傳算法了。

三、遺傳算法

3.1  遺傳算法的定義

  我們把種群P當成問題的最優解,把除P外的種群當成普通解。那么進化就是普通解不斷被淘汰而最后留下的只有最優解的過程。這就是遺傳算法的思想。我們先給出遺傳算法的流程如下,具體在后面解釋:

  1. 種群初始化
  2. 計算每個種群的適應度值
  3. 選擇(Selection)
  4. 交叉(Crossover)
  5. 變異(Mutation)
  6. 重復2-5步直至達到進化次數

  現在,我們來逐步理解一下整個流程。

3.2 遺傳算法的具體步驟

  講步驟的時候可不能少了例子,這次我們利用遺傳算法來解決一個著名的問題——背包問題。背包問題是這樣子的:大家知道荒野求生的貝爺么,不知道的百度hh,是一個站在食物鏈最頂層的男人。貝爺決定去一個荒島開始它一個月的野外生活。但是它只有一個只能放35kg的背包。現在,它有不同的野外求生必需物品,每類物品都有其對應的生存點數具體在下表給出)。那么,問題就是,如何在有限的背包重量下,最大化貝爺的生存點數

  (1) 初始化

  首先我們要先我們要進化的種群,每個種群的個體都有一套自己的染色體。染色體則由基因組成。因此,一般的,我們的染色體可表達為二進制數串。在“背包問題”中,1代表基因存在,0表示基因缺失。在特定位置上的基因代表了上方表格中物體,如表中第一行是睡袋,那么對應的染色體上的左邊第一個基因位置就是描述睡袋的。如圖:  

  我們假定一開始只有4個個體,每個個體的染色體分別為C1-C4。那么這四個個體構成我們的一個種群。

  (2) 對每個個體計算其適應度值

  適應度值fitness value。在前面幾篇文章都出現過,是用於確定個體好壞的一個評價准則。在這個背包問題中,生存點數高就是個體好,因此這個個體的生存點數就是個體的適應度值。

  對於C1染色體[100110],其fitness value為:

$fitVal(C_{1}) = 1 \times 15 + 0 \times 7 + 0 \times 10 + 1 \times 5 + 1 \times 8 + 0 \times 17 = 28$

  對於C2染色體[001110],其fitness value為:

$fitVal(C_{2}) = 0 \times 15 + 0 \times 7 + 1 \times 10 + 1 \times 5 + 1 \times 8 + 0 \times 17 = 23$

  對於C3染色體[010100],其fitness value為:

$fitVal(C_{3}) = 0 \times 15 + 1 \times 7 + 0 \times 10 + 1 \times 5 + 0 \times 8 + 0 \times 17 = 12$

  對於C4染色體[011001],其fitness value為:

$fitVal(C_{4}) = 0 \times 15 + 1 \times 7 + 1 \times 10 + 0 \times 5 + 0 \times 8 + 1 \times 17 = 34$

  顯然,含有染色體C4的個體生存點數更高,適應性最強。

  (3) 選擇(selection)

  接下來我們就是要選擇要進行“交配”的染色體了,我們的目的是為了產生優良的下一代,因此選擇“交配”的染色體自然也是要優良的。因此我們應該選擇生存點數較高的C4染色體和C1染色體,對吧。這樣想沒錯,但是這樣的話在幾代后染色體之間的相互差異就減少,失去多樣性了。因此,我們一般會往里面假如一些隨機性。讓選擇也具有一些隨機性。那怎么加入呢?一般是采用輪盤賭選擇法。在前面的文章也出現了輪盤賭選擇法,但是那時我沒有解釋。現在來解釋下:

  假設有一個輪盤,我們把它分割成n份(n表示總體中染色體的個數),每條染色體在輪盤上的占用面積跟它的適應值正比。以前面的例子來看,應如下圖:

  現在,將這個輪盤進行旋轉,當停下來的時候,指針指中的那片區域所代表的染色體即為第一個親本,重復操作得到第二個親本。選中這兩個親本進行“交配”產生下一代。

  (4) 交叉(crossover)

  好了我們已經選擇可以產生后代的親本染色體了,接下來就是要“交配”了。誒誒怎么交配,其實這里的交配指的是染色體交叉互換,其中根據交叉點的個數可分為單點交叉多點交叉

  單點交叉:交叉最基本的形式,隨機選擇一個交叉點,將交叉點前后的染色體部分進行染色體間的交叉對調從而產生新后代,如下圖:

   多點交叉:選擇兩個交叉點,將交叉點之間的染色體部分進行對調從而產生后代,如下圖:

    (5) 變異(mutation)

  在生物學中,在后代的生長過程中,它們體內的基因會發生一些變化,使得它們與父母不同,這個過程我們稱為變異變異是導致子一代的性狀與親一代不一樣的原因。也就是說,正是因為變異,才導致種群存在多樣性。

  一般的,我們定義變異為染色體上發生的隨機變化。如下圖:

  變異完成后,我們就得到了新的個體,完成一次進化。整個過程如下圖(圖來源:http://www.jade-cheng.com/au/coalhmm/optimization/):

  這樣就算完成了一次進化,接着我們由要用適應度函數去對這些新的后代進行判定,如果后代的適應度值夠大,則將其替代掉總體中那些適應度值較低的染色體(保證種群的個數不變)。接着不斷重復選擇-交叉-變異這幾個步驟,直至達到進化次數。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM