规划路径100规划路径90807060 km5040302010 1020304050km60708090 图4 PSO算法求解的10城市TSP问题的结果 最后的结果编码为(1 4 5 6 7 8 9 10 2 3),解为A-D-E-F-G-H-I-J-B-C,距离为269.0671。
从计算结果可以看出,算法迭代到200步时已经收敛到了局部的最优值。这个局部最优解也是全局最优解。从收敛的速度的平均意义上而言,PSO算法与GA算法比收敛的更快。
附录
% GA算法的代码 % GA算法程序.
data = load('pos10.txt'); a=[data(:,2) data(:,3)]; n=50; % 种群数目 C=1000; % 迭代次数 Pc=0.9; % 交叉概率 Pm=0.2; % 变异概率
% GA算法初始化. [N,NN]=size(D); farm=zeros(n,N); for i=1:n
farm(i,:)=randperm(N);
end
R=farm(1,:);
len=zeros(n,1); fitness=zeros(n,1); counter=0;
% GA算法迭代
while counter len(i,1)=myLength(D,farm(i,:)); end maxlen=max(len); minlen=min(len); fitness=len; for i=1:length(len) fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.0001))).^2; end; rr=find(len==minlen); R=farm(rr(1,1),:); FARM=farm; %计算适应度函数 nn=0; for i=1:n if fitness(i,1)>=rand nn=nn+1; FARM(nn,:)=farm(i,:); end end FARM=FARM(1:nn,:); % FARM (nn*N) [aa,bb]=size(FARM);%(aa=nn) % 交叉 FARM2=FARM; for i=1:2:aa if Pc>rand&&i if L<=10 %确定交叉宽度 W=9; elseif ((L/10)-floor(L/10))>=rand&&L>10 W=ceil(L/10)+8; else W=floor(L/10)+8; end p=unidrnd(L-W+1);%随机选择交叉范围 for i=1:W x=find(a==b(1,p+i-1)); y=find(b==a(1,p+i-1)); [a(1,p+i-1),b(1,p+i-1)]=exchange(a(1,p+i-1),b(1,p+i-1)); [a(1,x),b(1,y)]=exchange(a(1,x),b(1,y)); end FARM(i,:)=A; FARM(i+1,:)=B; end end % 变异 FARM2=FARM; for i=1:aa if Pm>=rand FARM(i,:)=mutate(FARM(i,:)); end end % 群体更新 FARM2=zeros(n-aa+1,N); if n-aa>=1 for i=1:n-aa FARM2(i,:)=randperm(N); end end FARM=[R;FARM;FARM2]; [aa,bb]=size(FARM); if aa>n FARM=FARM(1:n,:); end farm=FARM; clear FARM RR(counter+1)=myLength(D,R) % 统计迭代次数。 counter=counter+1 ; end % 结果图形显示 figure hold on plot([a(R(1),1),a(R(10),1)],[a(R(1),2),a(R(10),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g'); scatter(a(:,1),a(:,2),'ms') grid on hold on for i=2:length(R) x0=a(R(i-1),1); y0=a(R(i-1),2); x1=a(R(i),1); y1=a(R(i),2); xx=[x0,x1]; yy=[y0,y1]; plot(xx,yy,'LineWidth',4,'MarkerEdgeColor','k','MarkerFaceColor','g') hold on end % 结果输出 R Rlength % 其他函数 function a=mutate(a) L=length(a); rray=randperm(L); [a(rray(1)),a(rray(2))]=exchange(a(rray(1)),a(rray(2))); function [x,y]=exchange(x,y) temp=x; x=y; y=temp; function len=myLength(D,p) [N,NN]=size(D); len=D(p(1,N),p(1,1)); for i=1:(N-1) len=len+D(p(1,i),p(1,i+1)); end % PSO算法代码 %% PSO算法代码 data=load('pos10.txt') cityCoor=[data(:,2) data(:,3)]; n=size(cityCoor,1); cityDist=zeros(n,n); for i=1:n for j=1:n if i~=j cityDist(i,j)=((cityCoor(i,1)-cityCoor(j,1))^2+... (cityCoor(i,2)-cityCoor(j,2))^2)^0.5; end cityDist(j,i)=cityDist(i,j); end end individual=zeros(indiNumber,n); % 初始化 nMax=1000; % 迭代次数 indiNumber=50; % 粒子个数 %% 初始化个体和群体最优值 indiFit=fitness(individual,cityCoor,cityDist); [value,index]=min(indiFit); tourPbest=individual; tourGbest=individual(index,:) ; recordPbest=inf*ones(1,indiNumber); recordGbest=indiFit(index); xnew1=individual; %% 循环寻找最优路径 L_best=zeros(1,nMax); for N=1:nMax % 更新最优值 indiFit=fitness(individual,cityCoor,cityDist); for i=1:indiNumber if indiFit(i) if indiFit(i) [value,index]=min(recordPbest); recordGbest(N)=recordPbest(index);