美赛的时候准备的代码,没用上,不过现代优化算法挺有意思的,之后再发些其他的。
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)