2013-07-18 108 views
0

我想在MATLAB中實現基本的遺傳算法。我有一些關於交叉操作的問題。我正在閱讀材料,並發現總是選擇兩位父母進行交叉操作。遺傳算法交叉操作

  1. 如果我碰巧有一個奇數的父母會怎麼樣?

  2. 假設我有父母A,父母B &父母C和我交叉父母A與B和再次父母B與C產生後代,即使那時我得到4後代。拒絕其中一個的標準是什麼?因爲我的人口總是保持不變?我應該拒絕適應值最低的後代嗎?

  3. 父母之間的算術運算能像OR或AND運算一樣被認爲是一個很好的交叉操作嗎?我發現有些網站將它們列爲交叉操作,但我不確定。

  4. 我該怎麼做多個父母之間的交叉?

回答

1

「交叉」與其說是一個定義良好的操作者由於考慮父母的方面,並利用他們產生類似於在某些方面,每個父母子女的一般想法。因此,對於如何進行交叉的問題沒有真正的正確答案。

實際上,您應該爲您的問題域和編碼做任何有意義的事情。像二進制編碼個體的兩個母體重組一樣,有一些明顯的選擇 - 例如像n點和均勻交叉的東西。對於實值編碼,如果從嚴格的生物學角度來看,有些事情像SBX那樣不太明智。相反,它們只是設計成具有一些預定的屬性。類似地,置換編碼提供了許多衆所周知的操作符(順序交叉,循環交叉,邊緣裝配交叉等),這同樣是分析父母的哪些特徵對於使特定問題域可遺傳是有意義的結果。

你可以自由地做同樣的事情。如果你有三位家長(與像二進制一些離散的編碼),你可以這樣做以下:

child = new chromosome(L) 
for i=1 to L 
    switch(rand(3)) 
     case 0: 
      child[i] = parentA[i] 
     case 1: 
      child[i] = parentB[i] 
     case 2: 
      child[i] = parentC[i] 

這是否是一個很好的操作與否將取決於幾個因素(問題域,的解釋編碼等),但它是生成後代的完美合法方式。你也可以發明你自己的更復雜的方法,例如,對每個等位基因值進行多個父母的加權平均,做AND和OR等布爾操作。如果你喜歡哪個不同,你也可以構建一個更「結構化」的操作符父母有特定的角色。基本的差異進化算法選擇三個父母,a,b和c,並計算一個像a + F(b - c)(具有某些函數F)的更新,大致對應於後代。