遗传算法 matlab ---以tsp为例

23 篇文章 10 订阅
5 篇文章 0 订阅

美赛的时候准备的代码,没用上,不过现代优化算法挺有意思的,之后再发些其他的。

close all 
clear all
clc

%读入初始数据
N=20;
border=100;
%C=[rand(N,1)*border,rand(N,1)*border];
C=[9.442061706065957e+01     5.554527461175734e+01
     7.033585927645424e+01     8.210485000479132e+01
     8.513885160801584e+01     2.875386430880210e+01
     7.639317665257967e+01     9.899454527886692e+01
     4.124371269556116e+01     3.075543952877445e+01
     5.845739036088576e+01     6.394249385784040e+01
     2.047038459263265e+01     3.416955672791446e+01
     9.556319529767441e+01     5.075386755815181e+01
     6.864343351256032e+01     9.524654717191730e+01
     9.348728571015130e+01     4.280562205659413e+01
     3.436836073417421e+01     7.104795575132123e+01
     9.817321649623470e+01     2.501489907029606e+01
     7.820931971241255e+01     7.332155697803887e+01
     8.988323696914080e+01     4.302811953719409e+01
     3.575739586131570e+01     9.099463432988888e+01
     8.563041161898965e+00     4.548622350697822e+01
     6.563114202893138e+01     2.278268090861504e+01
     9.477447526974635e+01     9.126965924351660e+01
     4.261772603974462e+01     2.400688433476272e+01
     4.447512148263895e+01     6.468043451289284e+01];
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)


在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值