【计算智能实验】基于遗传算法的TSP算法的实现

一、实验目的

了解TSP问题,理解利用遗传算法解决TSP问题的算法流程并能够利用matlab实现该算法。

二、实验内容:

1、请描述TSP问题。

2、利用遗传算法求解下述TSP问题。

河北省主要旅游景点的坐标为:
在这里插入图片描述

三、实验结果

TSP问题:已知n个城市之间的距离,某一旅行商从某个城市出发访问每个城市一次仅一次,最后回到出发城市,如何安排才使其所走路线最短。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验代码

clear
clc
close all
X=[119.400118,39.896162
    115.996445,38.942194
    117.941207,41.001475
    113.952393,38.342717
    119.805383,39.976263
    117.690626,40.180984
    115.396635,39.665472
    114.709195,39.222931
    113.623572,36.647151
    114.736727,36.707347
    114.773535,41.293246
    114.12354,37.540537
    114.613672,38.044542
    116.392496,37.647955
    113.756113,38.266157
    114.178316,37.840268
    115.547685,39.818167
    119.803341,39.975309
    114.585748,38.154386
    113.987807,38.255855
    114.445732,37.472423
    114.588754,38.150796
    114.775507,37.72822
    116.656859,39.548504
    114.790993,37.75462
    113.881628,36.938712
    113.957512,36.908142
    114.283595,38.094246
    113.852442,38.222625
    117.25213,40.692657]%各城市的坐标位置
NIND=100;              %种群大小
MAXGEN=200;
Pc=0.9;
Pm=0.05;
GGAP=0.9;
D=Distance(X);
N=size(D,1);
%%初始化种群
Chrom=InitPop(NIND,N);
%%在二维图上画出所有坐标点
%figure
%plot(X£¨£º£¬1),X(:,2),'o');
%%画出随机解的线路图
DrawPath(Chrom(1,:),X)
pause(0.0001)
%%输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
OutputPath(Chrom(1,:));
Rlength=PathLength(D,Chrom(1,:));
disp(['总距离',num2str(Rlength)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~')
%%ÓÅ»¯
gen=0;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程 ')
xlabel('代数')
ylabel('最优值 ')
ObjV=PathLength(D,Chrom);
preObjV=min(ObjV);
while gen<MAXGEN
    %%计算适应度
    ObjV=PathLength(D,Chrom);
    %fprintf('%d  %1.10f\n',gen,min(ObjV))
    line([gen-1],[preObjV,min(ObjV)]);pause(0.0001)
    perObjV=min(ObjV);
    FitnV=Fitness(ObjV);
    %%选择
    SelCh=Select(Chrom,FitnV,GGAP);
    %%交叉操作
    SelCh=Recombin(SelCh,Pc);
    %%变异
    SelCh=Mutate(SelCh,Pm);
    %%逆转操作
    SelCh=Reverse(SelCh,D);
    %%重插入子代的新种群
    Chrom=Reins(Chrom,SelCh,ObjV);
    %%更新迭代次数
    gen=gen+1;
end
%%画出最优解的路线图
ObjV=PathLength(D,Chrom);
[minObjV,minInd]=min(ObjV);
DrawPath(Chrom(minInd(1),:),X)
%%输出最优解的路线和总距离
disp('最优解:’)
p=OutputPath(Chrom(minInd(1),:));
disp(['总距离:',num2str(ObjV(minInd(1)))]);
disp('--------------------------------------------')

函数代码

1、

function D=Distance(a)
row=size(a,1);
D=zeros(row,row);
for i=1:row
    for j=i+1:row
        D(i,j)=((a(i,1)-a(j,1))^2+(a(i,2)-a(j,2))^2)^0.5;
        D(i,j)=D(i,j);
    end
end

2、

function DrawPath(Chrom,X)
R=[Chrom(1,:) Chrom(1,1)];
figure
hold on
plot(X(:,1),X(:,2),'o','color',[0.5,0.5,0.5])
plot(X(Chrom(1,1),1),X(Chrom(1,1),2),'rv','MarkerSize',20)
for i =1:size(X,1)
    text(X(i,1)+0.05,X(i,2)+0.05,num2str(i),'color',[1,0,0]);
end
A=X(R,:);
row=size(A,1);
for i =2:row
    [arrowx,arrowy]=dsxy2figxy(gca,A(i-1:i,1),A(i-1:i,2));
    annotation('textarrow',arrowx,arrowy,'HeadWidth',8,'color',[0,0,1]);
end
hold off
xlabel('ºá×ø±ê')
ylabel('×Ý×ø±ê')
title('¹ì¼£Í¼')
box on

3、

function FitnV=Fitness(len)
FitnV=1./len

4、

function Chrom=InitPop(NIND,N)
Chrom=zeros(NIND,N);
for i=1:NIND
    Chrom(i,:)=randperm(N);
end

5、

function[a,b]=intercross(a,b)
L=length(a);
r1=randsrc(1,1,[1:L]);
r2=randsrc(1,1,[1:L]);
if r1~=r2
    a0=a,b0=b;
    s=min([r1,r2]);
    e=max([r1,r2]);
    for i=s:e
        a1=a;b1=b;
        a(i)=b0(i);
        b(i)=a0(i);
        x=find(a==a(i));
        y=find(b==b(i));
        i1=x(x~=i);
        i2=y(y~=i);
        if~isempty(i1)
            a(i1)=a1(i);
        end
        if~isempty(i2)
            b(i2)=b1(i);
        end
    end
end

6、

function SelCh=Mutate(SelCh,Pm)
[NSel,L]=size(SelCh);
for i=1:NSel
    if Pm>=rand
        R=randperm(L);
        SelCh(i,R(1:2))=SelCh(i,R(2:-1:1));
    end
end

7、

function p=OutputPath(R)
R=[R,R(1)];
N=length(R);
p=num2str(R(1));
for i=2:N
    p=[p,'->',num2str(R(i))];
end
disp(p)

8、

function len=PathLength(D,Chrom)
[row,col]=size(D);
NIND=size(Chrom,1);
len=zeros(NIND,1);
for i=1:NIND
    p=[Chrom(i,:) Chrom(i,1)];
    i1=p(1:end-1);
    i2=p(2:end);
    len(i,1)=sum(D((i1-1)*col+i2));
end

9、

function SelCh=Recombin(SelCh,Pc)
NSel=size(SelCh,1);
for i=1:2:NSel-mod(NSel,2)
    if Pc>=rand
        [SelCh(i,:),SelCh(i+1,:)]=intercross(SelCh(i,:),SelCh(i+1,:));
    end
end

10、

function Chrom=Reins(Chrom,SelCh,ObjV)
NIND=size(Chrom,1);
NSel=size(SelCh,1);
[TobjV,index]=sort(ObjV);
Chrom=[Chrom(index(1:NIND-NSel),:);SelCh];

11、

function SelCh=Reverse(SelCh,D)
[row,col]=size(SelCh);
ObjV=PathLength(D,SelCh);
SelCh1=SelCh;
for i=1:row
    r1=randsrc(1,1,[1:col]);
    r2=randsrc(1,1,[1:col]);
    mininverse=min([r1 r2]);
    maxinverse=max([r1 r2]);
    SelCh(i,mininverse:maxinverse)=SelCh(i,maxinverse:-1:mininverse);
end
ObjV1=PathLength(D,SelCh1);
index=ObjV1<ObjV;
SelCh(index,:)=SelCh1(index,:)

12、

function SelCh=Select(Chrom,FitnV,GGAP)
NIND=size(Chrom,1);
NSel=max(floor(NIND*GGAP+.5),2);
ChrIx=Sus(FitnV,NSel);
SelCh=Chrom(ChrIx,:);

猜你喜欢

转载自blog.csdn.net/qq_44762986/article/details/112673588
今日推荐