遺傳算法解決TSP問題

一、TSP問題

TSP問題:給定一組n個城市和倆倆之間的直達距離,尋找一條閉合的旅程,使得每個城市剛好經過一次且總的旅行距離最短。TSP是一個具有廣泛的應用背景和重要理論價值的組合優化問題。 近年來,有很多解決該問題的較爲有效的算法不斷被推出,例如Hopfield神經網絡方法,模擬退火方法以及遺傳算法方法等。TSP的搜索空間隨着城市數量的增加而增大,在龐大的搜索空間裏求最優解,是個很大的難題,本實驗用遺傳算法方法來解決TSP問題。

二、遺傳算法原理

算法設計的基本概念

  • 種羣:種羣是指用遺傳算法求解問題是,初始給定的多個解的集合。遺傳算法的求解過程是從這個子集開始的。
  • 個體:個體是指種羣中的單個元素,它通常由一個用於描述其基本遺傳結構的數據結構來表示。
  • 染色體:染色體是指對個體進行編碼後所得到的編碼串。
  • 適應度函數:適應度函數是一種用來對種羣中各個個體的環境適應性進行度量的函數。其函數值是遺傳算法實現優勝劣汰的主要依據
  • 遺傳操作:遺傳操作是指作用於種羣而產生新的種羣的操作。標準的遺傳操作有選擇、雜交、變異。

算法步驟:

(1)對遺傳算法的運行參數進行賦值。參數包括種羣規模、變量個數、交叉概率、變異概
         率以及遺傳運算的終止進化代數。
(2)建立區域描述器。根據軌道交通與常規公交運營協調模型的求解變量的約束條件,設置變量的取值範圍。
(3)在(2)的變量取值範圍內,隨機產生初始羣體,代入適應度函數計算其適應度值。
(4)執行比例選擇算子進行選擇操作。
(5)按交叉概率對交叉算子執行交叉操作。
(6)按變異概率執行離散變異操作。
(7)計算(6)得到局部最優解中每個個體的適應值,並執行最優個體保存策略。
(8)判斷是否滿足遺傳運算的終止進化代數,不滿足則返回(4),滿足則輸出運算結果。

三、代碼實現

main.m

主程序

%main
clear;
clc;
%%%%%%%%%%%%%%%輸入參數%%%%%%%%
N=25;               %%城市的個數
M=100;               %%種羣的個數
ITER=2000;               %%迭代次數
%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

%交叉操作函數  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

 exchange.m

%對調函數 exchange.m

function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
 
end

fit.m

%適應度函數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

Mutation.m

%變異函數 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

myLength.m

%染色體的路程代價函數  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

plot_route.m

%連點畫圖函數 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

 

四、參數對比分析

基本可變參數如下:

N:城市個數(25)

M:種羣個數(100)

Pc:交叉概率(0.8)

Pmutation:變異概率(0.05)

當四個參數都固定時,不同的城市序列對比:

  序號      總時間         minlen                                             城市序列
1      16.676s 1.836447e+01 15 21 10 3 22 25 24 6 1 7 18 5 19 2 12 4 23 13 9 16 17 8 14 11 20 
2     16.335 s 1.880064e+01 21 7 12 19 16 20 24 3 23 11 22 8 13 10 4 2 5 18 25 14 17 6 1 15 9 
3     16.454 s 1.754988e+01 4 14 23 24 22 7 10 12 6 19 2 13 5 17 8 15 20 21 25 11 9 1 18 16 3 
4     15.261 s 2.062626e+01 9 3 24 12 6 11 15 19 4 7 25 18 23 21 17 22 5 2 16 8 14 1 13 20 10
5     14.260 s 1.643078e+01 17 9 12 21 25 13 6 16 15 14 3 24 10 5 20 8 2 18 23 22 19 11 1 4 7 
6    14.314 s 1.817458e+01 5 20 10 7 23 19 17 2 25 24 13 3 1 9 16 18 11 4 22 8 15 6 12 21 14 

 

城市序列固定,四個參數變化對比

保存的城市序列:

  • N變化對比

當N=10時

當N=25時

當N=50時

當N=80時

 

 

 

  • M變化對比

當M=50

當M=80

當M=100

當M=130

總結:M設置較大時可以提高算法的搜索能力,但是降低算法的運行效率。

 

  • Pc變化對比

Pc=0.3

Pc=0.4

Pc=0.6

Pc=0.8

Pc=0.99

  • Pmutation變化對比:

Pmutation=0.001

Pmutation=0.01

Pmutation=0.05

Pmutation=0.1

 

五、實驗總結

實驗中隨機產生城市序列,對於不同的城市序列,種羣數量的不同對最終的結果有一定的影響,還有相同的城市序列下,不同的種羣數量影響算法的搜索能力及運行效率,不同的變異概率決定進行過程中發生變異的數量。

實驗難點是交叉算法的設計,由於TSP問題和一般的NP問題不一樣,每個個體的每個維度具有唯一性,因此在交叉的時候要注意不能有重複的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章