Matlab遗传算法TSP求解

遗传算法简介

遗传算法包括初始种群生成,适应度的计算,种群选择,交叉和变异这几项内容

TSP问题

TSP问题是旅行商经过一系列城市使得旅行商经过的总路程最短的问题

遗传算法内容

生成初始种群

// An highlighted block
for i=1:NP
    f(i,:)=randperm(N);   %初始种群
end

计算个体适应度

// An highlighted block
    for i=1:NP
        len(i,1)=D(f(i,N),f(i,1));
        for j=1:N-1
            len(i,1)=len(i,1)+D(f(i,j),f(i,j+1));
        end
    end
    maxlen=max(len);
    minlen=min(len
    %计算归一化适应值
    for i=1:NP
        fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.001));
    end

轮盘赌选择

// An highlighted block
    sumFit=sum(fitness);
    fitvalue=fitness./sumFit;
    fitvalue=cumsum(fitvalue);
    ms=sort(rand(NP,1));
    fiti=1;
    newi=1;
    while newi <= NP
       if (ms(newi)) < fitvalue(fiti)
           nf(newi,:)=f(fiti,:);  %种群重新生成
           newi=newi+1;
       else
           fiti=fiti+1;
       end 
    end

交叉操作

交叉操作是单点交叉的方式,例如12345678和87654321,假如第一个点交叉则变成8234571和17654328

// An highlighted block
    for i=1:2:NP
        for j=1:N
            if rand<pc
                %同一种群变化
                A=find(nf(i,:)==nf(i+1,j));
                nf(i,A)=nf(i,j);
                B=find(nf(i+1,:)==nf(i,j));
                nf(i+1,B)=nf(i+1,j);
                %交换位置
                temp1=nf(i+1,j);
                nf(i+1,j)=nf(i,j);
                nf(i,j)=temp1;
            end
        end
    end

变异操作

变异是采用单点变异的方式,比如12345678第5个位置变异,则在随机生成一个值比如1赋给第5个位置,则生成的个体是52341678

// An highlighted block
    for i=1:NP
        for j=1:N
            if rand<pm
                temp2=nf(i,j);
                temp3=randi([1,N],1,1);
                A=find(nf(i,:)==temp3);
                nf(i,j)=temp3;
                nf(i,A)=temp2; 
            end
        end
    end

图像输出

figure
for i=1:N-1
    plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-')
    hold on;
end
plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-')
title(['优化最短距离:',num2str(minlen)])

完整代码

close all 
clear all
clc

%读入初始数据
FP1=fopen('shuju.txt','rt');
N=fscanf(FP1,'%d',1);  %初始个体数
C=fscanf(FP1,'%f',[2,N]);   %个体坐标
C=C';
D=zeros(N);   %两两距离
for i=1:N
    for j=1:N
        D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;%求任意两个城市的间距
    end
end
NP=200;   %种群规模
G=500;   %迭代次数
f=zeros(NP,N);   %种群
nf=zeros(NP,N);   %子种群
pc=0.4; %交叉概率
pm=0.2; %变异概率
F=[];
for i=1:NP
    f(i,:)=randperm(N);   %初始种群
end
R=f(1,:);   %最优种群
len=zeros(NP,1);   %存储路径长度
fitness=zeros(NP,1);   %存储归一化值
gen=0;

%计算各种群的适应度值,即种群的长度
while gen<G
    for i=1:NP
        len(i,1)=D(f(i,N),f(i,1));
        for j=1:N-1
            len(i,1)=len(i,1)+D(f(i,j),f(i,j+1));
        end
    end
    maxlen=max(len);
    minlen=min(len);
    rr=find(len==minlen);   %找到最小值种群所在的位置
    R=f(rr(1,1),:);   %最小值种群的基因
    
    %计算归一化适应值
    for i=1:NP
        fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.001));
    end
    
    %基于轮盘赌的复制操作
    sumFit=sum(fitness);
    fitvalue=fitness./sumFit;
    fitvalue=cumsum(fitvalue);
    ms=sort(rand(NP,1));
    fiti=1;
    newi=1;
    while newi <= NP
       if (ms(newi)) < fitvalue(fiti)
           nf(newi,:)=f(fiti,:);  %种群重新生成
           newi=newi+1;
       else
           fiti=fiti+1;
       end 
    end
    
    %交叉操作
    for i=1:2:NP
        for j=1:N
            if rand<pc
                %同一种群变化
                A=find(nf(i,:)==nf(i+1,j));
                nf(i,A)=nf(i,j);
                B=find(nf(i+1,:)==nf(i,j));
                nf(i+1,B)=nf(i+1,j);
                %交换位置
                temp1=nf(i+1,j);
                nf(i+1,j)=nf(i,j);
                nf(i,j)=temp1;
            end
        end
    end
    %变异操作
    for i=1:NP
        for j=1:N
            if rand<pm
                temp2=nf(i,j);
                temp3=randi([1,N],1,1);
                A=find(nf(i,:)==temp3);
                nf(i,j)=temp3;
                nf(i,A)=temp2; 
            end
        end
    end
   f=nf;
   f(1,:)=R;
   clear F
   gen=gen+1;
   Rlength(gen)=minlen;
end
figure
for i=1:N-1
    plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-')
    hold on;
end
plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-')
title(['优化最短距离:',num2str(minlen)])
figure
plot(Rlength)
xlabel('迭代次数')
ylabel('目标函数')
title('适应度进化曲线')
disp('最短路径路程是:')
disp(R)

运行结果

在这里插入图片描述
在这里插入图片描述

总结

利用遗传算法可以解决TSP问题,结果较准确,但是迭代收敛的慢,易陷入局部最优

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值