遺傳算法算法
一、基本思想函數
二、算法原理性能
三、代碼實現優化
四、結果截圖spa
五、總結3d
1·基本思想code
吸收兩個算法的優勢,優缺互補,克服兩個算法的缺點,利用了遺傳算法的快速時間效率,優於螞蟻算法的時間效率。而且求解精度效率優於遺傳算法。這樣就提升了兩個算法結合的算法時間效率和求解精度。blog
二、算法原理it
這個算法的原理是先利用遺傳算法的快速性、全局收斂性和隨機性求出結果,結果產生有關問題的初始信息素分佈,遺傳算法執行完在運用蟻羣算法,在必定初始信息素分佈的狀況下,充分利用蟻羣算法並行性、正反饋性、求解精度效率高的特色。io
三、代碼實現
%main clear; clc; %%%%%%%%%%%%%%%輸入參數%%%%%%%% N=50; %%城市的個數 M=100; %%種羣的個數 ITER=500; %%迭代次數 %C_old=C; m=2; %%適應值歸一化淘汰加速指數 Pc=0.8; %%交叉機率 Pmutation=0.05; %%變異機率 %%生成城市的座標 pos=randn(N,2); %%生成城市之間距離矩陣 D=zeros(N,N); for i=1:N for j=i+1:N dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2; D(i,j)=dis^(0.5); D(j,i)=D(i,j); 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(pos(:,1),pos(:,2),'rx');%畫出全部城市座標 axis([-3 3 -3 3]); figure(2); plot_route(pos,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(pos,R); axis([-3 3 -3 3]); figure(4) plot(distance_min); %交叉操做函數 cross.m function [A,B]=cross(A,B) L=length(A); if L<10 W=L; elseif ((L/10)-floor(L/10))>=rand&&L>10 W=ceil(L/10)+8; else W=floor(L/10)+8; end %%W爲須要交叉的位數 p=unidrnd(L-W+1);%隨機產生一個交叉位置 %fprintf('p=%d ',p);%交叉位置 for i=1:W x=find(A==B(1,p+i-1)); y=find(B==A(1,p+i-1)); [A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1)); [A(1,x),B(1,y)]=exchange(A(1,x),B(1,y)); end end %連點畫圖函數 plot_route.m function plot_route(a,R) scatter(a(:,1),a(:,2),'rx'); hold on; plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]); hold on; for i=2:length(R) x0=a(R(i-1),1); y0=a(R(i-1),2); x1=a(R(i),1); y1=a(R(i),2); xx=[x0,x1]; yy=[y0,y1]; plot(xx,yy); hold on; end end %染色體的路程代價函數 mylength.m function len=myLength(D,p)%p是一個排列 [N,NN]=size(D); len=D(p(1,N),p(1,1)); for i=1:(N-1) len=len+D(p(1,i),p(1,i+1)); end end %變異函數 Mutation.m function a=Mutation(A) index1=0;index2=0; nnper=randperm(size(A,2)); index1=nnper(1); index2=nnper(2); %fprintf('index1=%d ',index1); %fprintf('index2=%d ',index2); temp=0; temp=A(index1); A(index1)=A(index2); A(index2)=temp; a=A; end %適應度函數fit.m,每次迭代都要計算每一個染色體在本種羣內部的優先級別,相似歸一化參數。越大約好! function fitness=fit(len,m,maxlen,minlen) fitness=len; for i=1:length(len) fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m; end %對調函數 exchange.m function [x,y]=exchange(x,y) temp=x; x=y; y=temp; end
四、結果截圖
圖1 圖2
圖3 圖4
圖5 圖6
圖7 圖8
圖9 圖10
下標是基數的圖是迭代200次的,分別是城市的座標圖,初始種羣對應各城市之間的連線圖,最佳路徑圖,路徑長度圖。下標是偶數的是迭代500次的,我定義的城市個數是25個,種羣的個數是100個,交查機率爲0.8.迭代200次的最佳路徑是17 19 1 21 18 4 16 11 8 6 3 5 14 20 2 23 22 24 15 9 10 13 7 25 12 ,路徑長度是1.858666e+01,迭代500次的最佳路徑是11 6 15 20 8 7 12 5 24 25 22 18 19 23 2 1 21 14 10 13 16 3 17 9 4 ,最短路徑是1.733842e+01。有上述可看出,當塵世個數、種羣個數、交叉機率相等時,迭代的次數越多,則算出來的路徑長度越短,路徑也不相同。
圖11 圖12
圖13 圖14
迭代第500次
minlen=3.422104e+01
43 47 33 30 5 49 27 42 9 28 32 16 11 40 31 3 39 20 44 13 4 38 1 14 23 8 29 22 6 10 24 19 18 45 7 15 48 37 12 26 41 17 25 21 2 34 50 46 36 35
對比上面的,改變城市數量,路徑變大。
圖15 圖16
圖17 圖18
minlen=3.923642e+01
35 10 48 9 20 19 16 23 24 8 7 12 28 30 44 38 13 33 2 1 14 26 47 34 41 18 39 22 3 27 5 40 6 25 45 11 49 15 21 17 32 29 4 37 36 43 50 42 46 31
以上的圖,我改變的是變異機率,改成了0.12,原來的是0.05,對比圖11 12 13 14發現最小路徑變大,最終造成的最短路徑圖很不清晰,由此看出,變異機率會影響最短路徑的長度和最終路徑。
我根據以上的實驗,改變參數交叉機率,原來是0.8改成了0.5,發現最小路徑在變大。由此看出交叉機率會影響最短路徑的長度和最終路徑。
五、總結
5.1這兩個算法的結合提升了算法的時間性能和優化性能,能夠快速明顯的看出實驗的區別。
5.2兩個算法結合起來,減小了參數的調整,避免了大量盲目的去迭代次數。
5.3在遺傳算法中產生種羣,加快了螞蟻算法的速度避免了求精確解階段陷入局部最優。