PSO粒子群算法解决旅行商问题的MATLAB源码.txt
《PSO粒子群算法解决旅行商问题的MATLAB源码.txt》由会员分享,可在线阅读,更多相关《PSO粒子群算法解决旅行商问题的MATLAB源码.txt(6页珍藏版)》请在冰豆网上搜索。
%����Ⱥ�㷨�������������
%BylReij
closeall;
clearall;
PopSize=500;%��Ⱥ��С
CityNum=14;%������
OldBestFitness=0;%�ɵ�������Ӧ��ֵ
Iteration=0;%��������
MaxIteration=2000;%����������
IsStop=0;%����ֹͣ��־
Num=0;%ȡ����ͬ��Ӧ��ֵ�ĵ�������
c1=0.5;%��֪ϵ��
c2=0.7;%���ѧϰϵ��
w=0.96-Iteration/MaxIteration;%����ϵ��,������������Ӷ��ݼ�
%�ڵ�����
node=[16.4796.10;16.4794.44;20.0992.54;22.3993.37;25.2397.24;...
22.0096.05;20.4797.02;17.2096.29;16.3097.38;14.0598.12;...
16.5397.38;21.5295.59;19.4197.13;20.0994.55];
%��ʼ�������ӣ�������·����Ⱥ
Group=ones(CityNum,PopSize);
fori=1:
PopSize
Group(:
i)=randperm(CityNum)';
end
Group=Arrange(Group);
%��ʼ�������ٶȣ���������
Velocity=zeros(CityNum,PopSize);
fori=1:
PopSize
Velocity(:
i)=round(rand(1,CityNum)'*CityNum);%roundȡ��
end
%����ÿ������֮��ľ���
CityBetweenDistance=zeros(CityNum,CityNum);
fori=1:
CityNum
forj=1:
CityNum
CityBetweenDistance(i,j)=sqrt((node(i,1)-node(j,1))^2+(node(i,2)-node(j,2))^2);
end
end
%����ÿ��·���ľ���
fori=1:
PopSize
EachPathDis(i)=PathDistance(Group(:
i)',CityBetweenDistance);
end
IndivdualBest=Group;%��¼�����ӵĸ��弫ֵ��λ��,�������ҵ������·��
IndivdualBestFitness=EachPathDis;%��¼�����Ӧ��ֵ,�������ҵ������·���ij���
[GlobalBestFitness,index]=min(EachPathDis);%�ҳ�ȫ������ֵ����Ӧ���
%��ʼ�����
figure;
subplot(2,2,1);
PathPlot(node,CityNum,index,IndivdualBest);
title('�����');
%Ѱ��
while(IsStop==0)&(Iteration%������������
Iteration=Iteration+1;
%����ȫ�ּ�ֵ��λ��,����ָ·��
fori=1:
PopSize
GlobalBest(:
i)=Group(:
index);
end
%��pij-xij,pgj-xij�������Ը���c1��c2�ı��������
pij_xij=GenerateChangeNums(Group,IndivdualBest);
pij_xij=HoldByOdds(pij_xij,c1);
pgj_xij=GenerateChangeNums(Group,GlobalBest);
pgj_xij=HoldByOdds(pgj_xij,c2);
%�Ը���w������һ��������
Velocity=HoldByOdds(Velocity,w);
Group=PathExchange(Group,Velocity);%���ݽ��������·������
Group=PathExchange(Group,pij_xij);
Group=PathExchange(Group,pgj_xij);
fori=1:
PopSize%���¸�·���ܾ���
EachPathDis(i)=PathDistance(Group(:
i)',CityBetweenDistance);
end
IsChange=EachPathDisIndivdualBest(:
find(IsChange))=Group(:
find(IsChange));%���¸������·��
IndivdualBestFitness=IndivdualBestFitness.*(~IsChange)+EachPathDis.*IsChange;%���¸������·������
[GlobalBestFitness,index]=min(EachPathDis);%����ȫ�����·��,��¼��Ӧ�����
ifGlobalBestFitness==OldBestFitness%�Ƚϸ���ǰ���º����Ӧ��ֵ;
Num=Num+1;%���ʱ��¼��һ;
else
OldBestFitness=GlobalBestFitness;%�����ʱ������Ӧ��ֵ������¼����;
Num=0;
end
ifNum>=20%��ε�������Ӧ��ֵ���ʱ����ֹͣ
IsStop=1;
end
BestFitness(Iteration)=GlobalBestFitness;%ÿһ����������Ӧ��
end
%���Ž�
subplot(2,2,2);
PathPlot(node,CityNum,index,IndivdualBest);
title('�Ż���');
%��������
subplot(2,2,3);
plot((1:
Iteration),BestFitness(1:
Iteration));
gridon;
title('��������');
%��С·��ֵ
GlobalBestFitness
functionGroup=Arrange(Group)
[xy]=size(Group);
[NO1,index]=min(Group',[],2);%�ҵ���Сֵ1
fori=1:
y
pop=Group(:
i);
temp1=pop([1:
index(i)-1]);
temp2=pop([index(i):
x]);
Group(:
i)=[temp2'temp1']';
end
functionChangeNums=GenerateChangeNums(Group,BestVar);
[xy]=size(Group);
ChangeNums=zeros(x,y);
fori=1:
y
pop=BestVar(:
i);%��BestVarȡ��һ��˳��
pop1=Group(:
i);%������Ⱥ��ȡ����Ӧ��˳��
forj=1:
x%��BestVar��˳����ȡ��һ�����
NoFromBestVar=pop(j);
fork=1:
x%�Ӷ�Ӧ������˳����ȡ��һ�����
NoFromGroup=pop1(k);
if(NoFromBestVar==NoFromGroup)&&(j~=k)%�����ͬ�Ҳ���ͬһλ��
ChangeNums(j,i)=k;%������
pop1(k)=pop1(j);
pop1(j)=NoFromGroup;
end
end
end
end
functionHold=HoldByOdds(Hold,Odds)
[x,y]=size(Hold);
fori=1:
x
forj=1:
y
ifrand>Odds
Hold(i,j)=0;
end
end
end
functionSumDistance=PathDistance(path,CityBetweenDistance)
L=length(path);%pathΪһ��ѭ���Ľڵ�˳��
SumDistance=0;
fori=1:
L-1
SumDistance=SumDistance+CityBetweenDistance(path(i),path(i+1));
end
SumDistance=SumDistance+CityBetweenDistance(path
(1),path(L));%������β�ڵ�ľ���
functionGroup=PathExchange(Group,Index)
[xy]=size(Group);
fori=1:
y
a=Index(:
i);%ȡ������һ�齻����
pop=Group(:
i);%ȡ����Ӧ������
forj=1:
x%ȡ������һ����������������
ifa(j)~=0
pop1=pop(j);
pop(j)=pop(a(j));
pop(a(j))=pop1;
end
end
Group(:
i)=pop;
end
functionPathPlot(node,CityNum,index,EachBest);
fori=1:
CityNum
NowBest(i,:
)=node((EachBest(i,index)),:
);
end
NowBest(CityNum+1,:
)=NowBest(1,:
);
plot(node(:
1),node(:
2),'*');
line(NowBest(:
1),NowBest(:
2));
gridon;