遺傳演算法系列 (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鏈 生成隨機初代 選擇,適應度 ...