目錄
一、遺傳算法的簡介
遺傳算法(Genetic Algorithm,GA)是一類借鑑生物界的進化規律(適者生存,優勝劣汰遺傳機制)演化而來的隨機化搜索方法,是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。
遺傳算法是從代表問題可能潛在的解集的一個種羣開始的,而一個種羣則由經過基因編碼的一定數目的個體組成。每個個體實際上是染色體帶有特徵的實體。染色體作爲遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現。
在遺傳算法中,被優化的問題的解稱爲個體,它表示的是一個變量的一組序列,叫做基因串或者染色體。染色體通常被表達爲簡單的字符串或者數字串,也有其他的針對特殊的問題的採用的表示方法,這個過程稱爲編碼。首先,算法會隨機生成一定數量的個體,也可以人爲地設定,這樣可以提高初始種羣的質量。在每一代中,所有的個體都被評價,並通過計算適應度函數得到一個適應度數值,依照適應度,對種羣中的個體進行排序。然後,產生一個新的個體種羣,也就是選擇和繁殖,繁殖包括交配和突變。初始的數據便可以通過這樣的選擇原則組成一個相對優化的羣體。之後,被選擇的個體進入交配過程。
經過這一系列的過程(選擇、交配和突變),產生的新一代個體不同於初始的一代,並一代一代向增加整體適應度的方向發展,因爲最好的個體總是更多的被選擇去產生下一代,而適應度低的個體逐漸被淘汰掉。過程不斷重複:每個個體被評價,計算出適應度,兩個個體交配,然後突變,產生第三代......直到滿足終止條件爲止。
二、算法流程
(1)初始化規模爲 N的羣體,其中染色體每個基因的值採用隨機數產生器生成並滿足問題定義的範圍。當前進化代數Generation=0。
(2)採用評估函數對羣體中所有染色體進行評價,分別計算每個染色體的適應值,保存適應值最大的染色體Best。
(3)採用輪盤賭選擇算法對羣體的染色體進行選擇操作,產生規模同樣爲N的種羣。
(4)按照概率Pc 從種羣中選擇染色體進行交配。每兩個進行交配的父代染色體,交換部分基因,產生兩個新的子代染色體,子代染色體取代父代染色體進入新種羣。沒有進行交配的染色體直接複製進入新種羣。
(5)按照概率 Pm對新種羣中染色體的基因進行變異操作。發生變異的基因數值發生改變。變異後的染色體取代原有染色體進入新羣體,未發生變異的染色體直接講入新羣體。
(6)變異後的 新羣體取代原有羣體,重新計算羣體中各個染色體的適應值。倘若羣體的最大適應值大於Best的適應值,則以該最大適應值對應的染色體替代Best。
(7)當 前進化代數Generation加1。如果Generation超過規定的最大進化代數或Best達到規定的誤差要求,算法結束;否則返回第(3)步。
三、參數經驗設置
1.羣體規模N
影響算法的搜索能力和運行效率。
若N設置較大,一次進化所覆蓋的模式較多,可以保證羣體的多樣性,從而提高算法的搜索能力,但是由於羣體中染色體的個數較多,勢必增加算法的計算量,降低了算法的運行效率。
若N設置較小,雖然降低了計算量,但是同時降低了每次進化中羣體包含更多較好染色體的能力。N的設置一般爲20~100。
2.染色體的長度L
影響算法的計算量和交配變異操作的效果。
L的設置跟優化向題密切相關,一般由問題定義的解的形武和選擇的編碼方法決定;對於二進制編碼方法,染色體的長度L根據解的取值範圍和規定精度要求選擇大小。
對於浮點數編碼方法,染色體的長度L跟問題定義的解的維數D相同。
除了染色體長度一定的編碼方法,Goldberg等人還提出了一種變長度染色體遺傳算法Messy GA,其染色體的長度並不是固定的。
3.基因的取值範圍R
R視採用的染色體編碼方案而定。
對於二進制編碼方法,R={0,1},而對於浮點數編碼方法,R與優化問題定義的解每一維變量的取值範圍相同。
4.交配概率Pc
決定了進化過程種羣參加交配的染色體平均數目PcXN。
Pc的取值一般爲0.4~0.99。
也可採用自適應的方法調整算法運行過程中的Pc值。
5.變異概率Pm
增加羣體進化的多樣性,決定了進化過程中羣體發生變異的基因平均個數。
Pm的值不宜過大。因爲變異對已找到的較優解具有一定的破壞作用,如果Pm的值太大,可能會導致算法目前所處的較好的搜索狀態倒退回原來較差的情況。
Pm的取值一般爲0.001~0.1。
也可採用自適應的方法調整算法運行過程中的Pm值。
6.適應值評價
影響算法對種羣的選擇,恰當的評估函數應該能夠對染色體的優劣做出合適的區分,保證選擇機制的有效性,從而提高羣體的進化能力。
評估函數的設置同優化問題的求解目標有關。
評估函數應滿足較優染色體的適應值較大的規定。
爲了更好地提高選擇的效能,可以對評估函數做出一定的修正。
目前主要的評估函數修正方法有:線性變換、乘冪變換、指數變換等
7.終止條件
決定算法何時停止運行,輸出找到的最優解。
採用何種終止條件,跟具體問題的應用有關。
可以便算法在達到最大進化代數時停止,最大進化代數一殷可設置爲100~1000,根據具體問題可對該建議值作相應的修改。
也可以通過考察找到的當前最優解的情況來控制算法的停止,例如,當目前進化過程算法找到的最優解達到一定的誤差要求,則算法可以停止。誤差範圍的設置同樣跟具體的優化問題相關。或者是算法在持續很長的一段時間內所找到的最優解沒有得到改善時,算法可以停止。
四、GA函數的實現
1.目標函數Griewank
function y=Griewank(x)
%Griewan函數
%輸入x,給出相應的y值,在x=(0,0,…,0)處有全局極小點0.
%編制人:
%編制日期:
[row,col]=size(x);
if row>1
error('輸入的參數錯誤');
end
y1=1/4000*sum(x.^2);
y2=1;
for h=1:col
y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
%y=-y;
運行結果:
2.目標函數Rastrigin
function y = Rastrigin(x)
% Rastrigin函數
% 輸入x,給出相應的y值,在x = ( 0 , 0 ,…, 0 )處有全局極小點0.
% 編制人:
% 編制日期:
[row,col] = size(x);
if row > 1
error( ' 輸入的參數錯誤 ' );
end
y =sum(x.^2-10*cos(2*pi*x)+10);
%y =-y;
運行結果:
3.目標函數myfit(簡單求解)
function y = myfit( x )
y = (339-0.01*x(1)-0.003*x(2))*x(1)...
+ (399-0.004*x(1)-0.01*x(2))*x(2)...
- (400000+195*x(1)+225*x(2));
y = -y; %因爲GA是尋找最小值,所以爲了求這個函數的最大值,取f的相反數
end
運行結果:
4.總結
三個不同的目標函數,在種羣規模、交叉變異律等其他參數設置都一樣的情況下得到的最優化函數的圖和表,只畫二維情況作爲可視化輸出。第三個目標函數因爲是簡單的求解函數,得到的可視化二維圖像不夠明顯,前面的兩張圖可以明顯的觀察到圖形的立體形狀。對比分析可以看出後面兩個算法收斂的比較快,而第一個算法的起伏較大。
五、GA的優缺點
1.優點:
(1)能夠求出優化問題的全局最優解。
(2)優化結果與初始條件無關。
(3)適合於求解複雜的優化問題。
2.缺點:
(1)收斂速度慢。
(2)局部搜索能力差。
(3)無確定的終止準則。
代碼附錄:
GA.m
% Optimizing a function using Simple Genetic Algorithm with elitist preserved
%Max f(x1,x2)=100*(x1*x1-x2).^2+(1-x1).^2; -2.0480<=x1,x2<=2.0480
%下面爲代碼。函數最大值爲3904.9262,此時兩個參數均爲-2.0480,有時會出現局部極值,此時一個參數爲-2.0480,一個爲2.0480。變
%異概率pm=0.05,交叉概率pc=0.8。
clc;clear all;
format long;%設定數據顯示格式
%初始化參數
T=500;%仿真代數
N=80;% 羣體規模
pm=0.05;pc=0.8;%交叉變異概率
umax=30;umin=-30;%參數取值範圍
L=10;%單個參數字串長度,總編碼長度Dim*L
Dim=5;%Dim維空間搜索
bval=round(rand(N,Dim*L));%初始種羣,round函數爲四捨五入
bestv=-inf;%最優適應度初值
funlabel=4; %選擇待優化的函數,1爲Rastrigin,2爲Schaffer,3爲Griewank
Drawfunc(funlabel);%畫出待優化的函數,只畫出二維情況作爲可視化輸出
%迭代開始
for ii=1:T
%解碼,計算適應度
for i=1:N %對每一代的第i個粒子
for k=1:Dim
y(k)=0;
for j=1:1:L %從1到L,每次加以1
y(k)=y(k)+bval(i,k*L-j+1)*2^(j-1);%把第i個粒子轉化爲十進制的值,例如y1是第一維
end
x(k)=(umax-umin)*y(k)/(2^L-1)+umin;%轉化爲實際的x1
end
% obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; %目標函數
obj(i)=fun(x,funlabel);
xx(i,:)=x;
end
func=obj;%目標函數轉換爲適應度函數
p=func./sum(func);
q=cumsum(p);%累加
[fmax,indmax]=max(func);%求當代最佳個體
if fmax>=bestv
bestv=fmax;%到目前爲止最優適應度值
bvalxx=bval(indmax,:);%到目前爲止最佳位串
optxx=xx(indmax,:);%到目前爲止最優參數
end
Bfit1(ii)=bestv; % 存儲每代的最優適應度
%%%%遺傳操作開始
%輪盤賭選擇
for i=1:(N-1)
r=rand;
tmp=find(r<=q);
newbval(i,:)=bval(tmp(1),:);
end
newbval(N,:)=bvalxx;%最優保留
bval=newbval;
%單點交叉
for i=1:2:(N-1)
cc=rand;
if cc<pc
point=ceil(rand*(2*L-1));%取得一個1到2L-1的整數
ch=bval(i,:);
bval(i,point+1:2*L)=bval(i+1,point+1:2*L);
bval(i+1,point+1:2*L)=ch(1,point+1:2*L);
end
end
bval(N,:)=bvalxx;%最優保留
%位點變異
mm=rand(N,Dim*L)<pm;%N行
mm(N,:)=zeros(1,Dim*L);%最後一行是精英不變異,強制賦0
bval(mm)=1-bval(mm);
end
%輸出
figure;
plot(-Bfit1);% 繪製最優適應度進化曲線
bestv %輸出最優適應度值
optxx %輸出最優參數
Drawfunc.m
function Drawfunc(label)
%Griewank Rastrigin Schaffer
x=-5:0.05:5;%41列的向量
if label==1
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = Rastrigin([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
if label==2
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = Schaffer([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
if label==3
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = Griewank([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
if label==4
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = myfit([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
fun.m
function y = fun(x,label)
%函數用於計算粒子適應度值
%x input 輸入粒子
%y output 粒子適應度值
if label==1
y=-Rastrigin(x);
elseif label==2
y=-Schaffer(x);
elseif label==3
y=-Griewank(x);
else
y=-myfit(x);
end