遺傳算法與蟻羣算法結合

 

遺傳算法算法

一、基本思想函數

二、算法原理性能

三、代碼實現優化

四、結果截圖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在遺傳算法中產生種羣,加快了螞蟻算法的速度避免了求精確解階段陷入局部最優。

相關文章
相關標籤/搜索