遺傳演算法 變異演算法

2021-07-06 05:14:28 字數 1881 閱讀 3097

遺傳演算法系列 (4) 變異演算法

在基因交叉之後產生的子代個體,其變數可能以很小的概率或者步長發生轉變,這個過程稱為變異(mutation)。

如果進化的目標函式極值是單峰值的,那麼,將變異概率p設定為種群數量n的倒數是乙個比較好的選擇。

如果變異概率很大,那麼整個搜尋過程就退化為乙個隨機搜尋過程。所以,比較穩妥的做法是,進化過程剛剛開始的時候,取p為乙個比較大的概率,隨著搜尋過程的進行,p逐漸縮小到0附近。

與交叉過程一樣,變異的演算法也可以大致分為實數編碼和二進位制編碼兩種。

(1) 實數變異

<1>步長變異

即給數值加上或者減去乙個值,這個數值稱為步長。大致如下:

x' = x + 0.5 ld 或者

x' = x - 0.5 ld

這裡l為變數的取值範圍 l = upper - lower

d= a(0)/2^0 + a(1)/2^1 + ... + a(m)/s^m

其中a(i)以1/m的概率取1,以 1-1/m的概率取0,一般m=20

c++ **

1template

<

class

gene 

>

2class

real_gene_mutate_algorithm321

}2223//

claculate sig and l

24const

long

double

ran 

=ran();

25long

double

sig =0

;26long

doublel =

0;27if

( ran 

>0.

5l)2832

else

3337

38gene.value 

+=sig *l 

*delta *0

.5l;39

}4041};42

<2>高斯變異

這種變異的方法就是,產生乙個服從高斯分布的隨機數,取代原先基因中的實數數值。這個演算法產生的隨機數,數學期望當為當前基因的實數數值。

乙個模擬產生的演算法是,產生6個服從u(0,1)的隨機數,以他們的數學期望作為高斯分布隨機數的近似。

1template

<

class

gene

>

2class

gauss_mutate_algorithm327

};28

(2)二進位制變異

對二進位制編碼來講,變異就是變數的翻轉,如

100001

11100001

100001

01100001

c++**

1template

<

class

gene 

>

2class

binary_gene_mutate_algorithm321

}; (3)一些相關演算法或者函式

1template

<

class

data, 

class

algorithm

>

2void

mutate( data

&d, 

const

algorithm

&a )36

7template

<

class

population, 

class

gene_mutate_algorithm 

>

8class

population_mutate_algorithm930

}31}32

};33

遺傳演算法 變異操作

對於不同問題以上變異可能是較大的變異也可能是較小的變異,比如,inversion對於鄰接關係是較小的變異,而對於絕對位置和相對位置關係卻是很大的變異。乙個變異應該是具有較小的變化,這樣才能有平滑的適應度變化。1 alberto moraglio.2007.towards a geometric un...

遺傳演算法的交叉變異操作雜記

100個個體,交叉概率為0.1,並不代表交叉個體數為10個.這是乙個概率問題.另外,交叉概率一般會取0.5 1這個範圍內,0.1未免有點小.自適應的遺傳演算法,一般在迭代初期會有較大的交叉概率,越往迭代後期,交叉概率越小.而變異概率則相反.標準的交叉如下 假設六個個體的編號為從1至6,兩兩配對共分為...

python遺傳演算法 Python 遺傳演算法實現

關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...