1.遺傳算法簡介
遺傳算法是一種基於自然選擇和群體遺傳機理的搜索算法,它模擬了自然選擇和自然遺傳過程中的繁殖、雜交和突變現象.再利用遺傳算法求解問題時,問題的每一個可能解都被編碼成一個“染色體”,即個體,若干個個體構成了群體(所有可能解).在遺傳算法開始時,總是隨機的產生一些個體(即初始解),根據預定的目標函數對每一個個體進行評估,給出一個適應度值,基於此適應度值,選擇一些個體用來產生下一代,選擇操作體現了“適者生存”的原理,“好”的個體被用來產生下一代,“壞”的個體則被淘汰,然后選擇出來的個體,經過交叉和變異算子進行再組合生成新的一代,這一代的個體由於繼承了上一代的一些優良性狀,因而在性能上要優於上一代,這樣逐步朝着最優解的方向進化.因此,遺傳算法可以看成是一個由可行解組成的群體初步進化的過程.
2.遺傳算法原理簡析
2.1.GA算法是一種元啟發式自然選擇的過程 ,遺傳算法通常是利用生物啟發算子,如變異、交叉和選擇來生成高質量的優化和搜索問題的解決方案。
借鑒生物進化理論,遺傳算法將問題模擬成一個生物進化過程,通過遺傳、交叉、突變、自然選擇等操作產生下一代的解,並逐步淘汰適應度函數值低的解,增加適應度函數高的解。這樣進化N代后就很有 可能會進化出適應度函數值很高的個體。
2.2.遺傳算法的基本術語
個體:可行解
種群:可行解集
染色體:可行解的編碼
基因:可行解的分量
基因形式:遺傳編碼
適應度:適應度函數(評價的值)
選擇:選擇操作
交叉:編碼的交叉操作
變異:可行解碼的變異
3.遺傳算法的基本操作
遺傳算法的操作即模擬生物基因操作:優選適應性強的個體的“選擇”;個體間交換基因產生新個體的“交叉”;個體間的基因突變而產生新個體的“變異”。
3.1選擇
選擇是指從群體中選擇優良個體並淘汰劣質個體的操作.它建立在適應度評估的基礎上.適應度越大的個體,被選中上的可能性就越大,他的“子孫”在下一代中的個數就越多,選擇出來的個體就被放入配對庫中.目前常用的選擇方法有輪賭盤方法、最佳個體保留法、期望值法、排序選擇法、競爭法、線性標准化法.
3.2交叉
交叉就是指把兩個父代個體的部分結構加以替換重組而生成新的個體的操作,交叉的目的是為了在下一代產生新的個體,通過交叉操作,遺傳算法的搜索能力得到了飛躍性的提高.交叉是遺傳算法獲取優良個體的重要手段.交叉操作是按照一定的交叉概率在匹配庫中隨機的選取兩個個體進行的,交叉位置也是隨機的,交叉概率一般取得很大,為0.6~0.9.
3.3變異
變異就是以很小的變異概率Pm隨機地改變種群中個體的某些基因的值,變異操作的基本過程是:產生一個[0,1]之間的隨機數rand,如果rand<Pm,則進行變異操作.變異操作本身是一種局部隨機搜索,與選擇、交叉算子結合在一起,能夠避免由於選擇和交叉算子而引起的某些信息永久性丟失,保證了遺傳算法的有效性,使遺傳算法具有了局部隨機搜索能力,同時使得遺傳算法能夠保持群體的多樣性,以防出現未成熟收斂.在變異操作中,變異概率不宜取得過大,如果Pm>0.5,遺傳算法就退化為了隨機搜索.
4.遺傳算法的操作步驟
開始循環直至找到滿意的解。
1.評估每條染色體所對應個體的適應度。
2.遵照適應度越高,選擇概率越大的原則,從種群中選擇兩個個體作為父方和母方。
3.抽取父母雙方的染色體,進行交叉,產生子代。
4.對子代的染色體進行變異。
5.重復2,3,4步驟,直到新種群的產生
結束循環
5.遺傳算法的實現
以遺傳算法解決tsp問題為例探索參數對結果的影響
流程圖
主函數
%main
clear;
clc;
%%%%%%%%%%%%%%%輸入參數%%%%%%%%
M=100; %%種群的個數
ITER=2000; %%迭代次數
%C_old=C;
m=2; %%適應值歸一化淘汰加速指數
Pc=0.8; %%交叉概率
Pmutation=0.05; %%變異概率
%%導入城市的坐標
%%pos=randn(N,2);
load citys_data.mat
%%生成城市之間距離矩陣
N = size(citys,1);
D = zeros(N,N);
for i = 1:N
for j = 1:N
if i ~= j
D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
else
D(i,j) = 1e-4;
end
end
end
%%生成初始群體
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);%隨機排列,比如[2 4 5 6 1 3]
end
%%隨機選擇一個種群
R=popm(1,:);
figure(1);
scatter(citys(:,1),citys(:,2),'rx');%畫出所有城市坐標
axis([-3 3 -3 3]);
figure(2);
plot_route(citys,R); %%畫出初始種群對應各城市之間的連線
axis([-3 3 -3 3]);
%%初始化種群及其適應函數
fitness=zeros(M,1);
len=zeros(M,1);
for i=1:M%計算每個染色體對應的總長度
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);%最大回路
minlen=min(len);%最小回路
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);%找到最小值的下標,賦值為rr
R=popm(rr(1,1),:);%提取該染色體,賦值為R
for i=1:N
fprintf('%d ',R(i));%把R順序打印出來
end
fprintf('\n');
fitness=fitness/sum(fitness);
distance_min=zeros(ITER+1,1); %%各次迭代的最小的種群的路徑總長
nn=M;
iter=0;
while iter<=ITER
fprintf('迭代第%d次\n',iter);
%%選擇操作
p=fitness./sum(fitness);
q=cumsum(p);%累加
for i=1:(M-1)
len_1(i,1)=myLength(D,popm(i,:));
r=rand;
tmp=find(r<=q);
popm_sel(i,:)=popm(tmp(1),:);
end
[fmax,indmax]=max(fitness);%求當代最佳個體
popm_sel(M,:)=popm(indmax,:);
%%交叉操作
nnper=randperm(M);
% A=popm_sel(nnper(1),:);
% B=popm_sel(nnper(2),:);
%%
for i=1:M*Pc*0.5
A=popm_sel(nnper(i),:);
B=popm_sel(nnper(i+1),:);
[A,B]=cross(A,B);
% popm_sel(nnper(1),:)=A;
% popm_sel(nnper(2),:)=B;
popm_sel(nnper(i),:)=A;
popm_sel(nnper(i+1),:)=B;
end
%%變異操作
for i=1:M
pick=rand;
while pick==0
pick=rand;
end
if pick<=Pmutation
popm_sel(i,:)=Mutation(popm_sel(i,:));
end
end
%%求適應度函數
NN=size(popm_sel,1);
len=zeros(NN,1);
for i=1:NN
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len);
minlen=min(len);
distance_min(iter+1,1)=minlen;
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
fprintf('minlen=%d\n',minlen);
R=popm_sel(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
popm=[];
popm=popm_sel;
iter=iter+1;
%pause(1);
end
%end of while
figure(3)
plot_route(citys,R);
axis([-3 3 -3 3]);
figure(4)
plot(distance_min);
運行結果:
(1) 導入的城市坐標 (2)初始種群對應各城市之間的連線 (3)適應度最高解 (4)收斂曲線圖
5.1 種群規模M對結果的影響
當M=30時,運行結果
由結果可知 結果路徑長度比原來加長,迭代次數也增加
當M=500時,運行結果
由結果可知 路徑長度和原來相差不大,但迭代次數很不穩定
5.2 迭代次數ITER對結果的影響
當ITER=200時,運行結果
由結果可知,迭代次數過小 曲線不能達到收斂
當ITER=10000時,運行結果
由結果可知 迭代次數太大 種群過早成熟 提前收斂
5.3變異概率Pmutation對結果的影響
當Pmutation=0.005時,運行結果
由結果可知 種群的多樣性下降太快, 收斂不穩定
當Pmutation=5時,運行結果
由結果可知 種群多樣性過於充足會導致結果收斂不穩定起伏幅度很大
5.4交叉概率Pc對結果的影響
當Pc=0.01時,運行結果
由結果可知 迭代900次左右曲線收斂
當Pc=2時,運行結果
由結果可知 曲線在迭代到五百次左右將趨於穩定時 又重新尋找新的最適應解
6.總結
①種群的規模:群體規模太小,很明顯會出現近親交配,產生病態基因。使得種群進化不能按照模式定理產生所預期的期望數量;群體規模太大,結果難以收斂且浪費資源,穩定性下降。
②迭代次數:進化代數太小,種群進化不成熟,不容易收斂;進化代數太大,種群進化過於早熟不可能再收斂,繼續進化沒有意義,只會增加時間開支和資源浪費。
③變異概率:變異概率太小,種群的多樣性下降太快,容易導致 收斂不穩定;變異概率太大,盡管種群的多樣性可以得到保證,但是最適應解的概率也隨之增大。
④交叉概率:交叉概率太小,種群不能有效更新,導致收斂結果不具說服性;交叉概率太大,與變異概率類似,容易破壞已有的最適應解,隨機性增大,容易錯失最優個體。
7.遺傳算法的特點
①遺傳算法是對參數的編碼進行操作,而非對參數本身。
②遺傳算法是從許多點開始並行操作,並非局限於一點,從而可有效防止搜索過程收斂於局部最優解。
③遺傳算法通過目標函數計算適值,並不需要其它推導和附加信息,因而對問題的依賴性較小。
④遺傳算法的尋優規則是由概率決定的,而非確定性的。
⑤遺傳算法在解空間進行高效啟發式搜索,而非盲目地窮舉或完全隨機搜索。
⑥遺傳算法對所求解的優化問題沒有太多的數學要求。
8.總結
遺傳算法和蟻群算法都是有效的最優化搜索算法,在解決TSP這類組合優化問題時,它們各有優缺點。蟻群算法是通過信息素的累積和更新而收斂於最優路徑,但初期信息素匱乏、導致算法速度慢。遺傳算法具有快速全局搜索能力,但沒有能夠及時利用網絡的反饋信息,故算法的搜索速度比較慢,往往導致無為的冗余迭代,存在收斂速度慢、算法運算量較大的缺點 。
本文參考:
https://blog.csdn.net/sinat_38321889/article/details/79001599?tdsourcetag=s_pctim_aiomsg