1.算法描述
粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。
在求解TSP这种整数规划问题的时候, PSO显然与ACO不同, PSO需要对算法本身进行一定的修改, 毕竟PSO刚开始是应用在求解连续优化问题上的.
在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的个数,每 个点(染色体)又有两个维度(x,y),在代码中用 posx 和 posy 表示一个种群。 通过每一代的演化,对粒子群进行演化操作,选择合适个体(最优路径)。
最终算法伪代码如下:
初始化: 每个粒子获得一个随机解和一个随机的SS (命名为速度)
For 在位置 X_{id} 的所有粒子, 计算新的位置 X_{id}':
计算 P_{id} 与 X_{id} 之间的差 A = P_{id} - X_{id}, 其中 A 为 BSS
计算 B = P_{gd} - X_{id}, 其中 B 为 BSS
根据速度更新公式计算新的速度 V_{id}', 并将 V_{id}' 转换为一个 BSS
计算新的解 X_{id}' = X_{id} + V_{id} (也就是 V_{id} 作用在 X_{id} 上)
更新 P_{id} 如果新的解更好
更新 P_{gd} 若出现新的全局最好的解
2.matlab算法仿真效果
matlab2017b仿真结果如下:
3.MATLAB核心程序
%% 初始化所有粒子 for i=1:m x(i,:)=randperm(n); %粒子位置 end F=fitness(x,C,D); %计算种群适应度 %xuhao=xulie(F) %最小适应度种群序号 a1=F(1); a2=1; for i=1:m if a1>=F(i) a1=F(i); a2=i; end end xuhao=a2; Tour_pbest=x; %当前个体最优 Tour_gbest=x(xuhao,:) ; %当前全局最优路径 Pb=inf*ones(1,m); %个体最优记录 Gb=F(a2); %群体最优记录 xnew1=x; N=1; while N<=Nmax %计算适应度 F=fitness(x,C,D); for i=1:m if F(i)<Pb(i) Pb(i)=F(i); %将当前值赋给新的最佳值 Tour_pbest(i,:)=x(i,:);%将当前路径赋给个体最优路径 end if F(i)<Gb Gb=F(i); Tour_gbest=x(i,:); end end % nummin=xulie(Pb) %最小适应度种群序号 a1=Pb(1); a2=1; for i=1:m if a1>=Pb(i) a1=Pb(i); a2=i; end end nummin=a2; Gb(N)=Pb(nummin); %当前群体最优长度 for i=1:m %% 与个体最优进行交叉 c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位 c2=round(rand*(n-2))+1; while c1==c2 c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位 c2=round(rand*(n-2))+1; end chb1=min(c1,c2); chb2=max(c1,c2); cros=Tour_pbest(i,chb1:chb2); %交叉区域矩阵 ncros=size(cros,2); %交叉区域元素个数 %删除与交叉区域相同元素 for j=1:ncros for k=1:n if xnew1(i,k)==cros(j) xnew1(i,k)=0; for t=1:n-k temp=xnew1(i,k+t-1); xnew1(i,k+t-1)=xnew1(i,k+t); xnew1(i,k+t)=temp; end end end end xnew=xnew1; %插入交叉区域 for j=1:ncros xnew1(i,n-ncros+j)=cros(j); end %判断产生新路径长度是否变短 dist=0; for j=1:n-1 dist=dist+D(xnew1(i,j),xnew1(i,j+1)); end dist=dist+D(xnew1(i,1),xnew1(i,n)); if F(i)>dist x(i,:)=xnew1(i,:); end %% 与全体最优进行交叉 c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位 c2=round(rand*(n-2))+1; while c1==c2 c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位 c2=round(rand*(n-2))+1; end chb1=min(c1,c2); chb2=max(c1,c2); cros=Tour_gbest(chb1:chb2); %交叉区域矩阵 ncros=size(cros,2); %交叉区域元素个数 %删除与交叉区域相同元素 for j=1:ncros for k=1:n if xnew1(i,k)==cros(j) xnew1(i,k)=0; for t=1:n-k temp=xnew1(i,k+t-1); xnew1(i,k+t-1)=xnew1(i,k+t); xnew1(i,k+t)=temp; end end end end xnew=xnew1; %插入交叉区域 for j=1:ncros xnew1(i,n-ncros+j)=cros(j); end %判断产生新路径长度是否变短 dist=0; for j=1:n-1 dist=dist+D(xnew1(i,j),xnew1(i,j+1)); end dist=dist+D(xnew1(i,1),xnew1(i,n)); if F(i)>dist x(i,:)=xnew1(i,:); end %% 进行变异操作 c1=round(rand*(n-1))+1; %在[1,n]范围内随机产生一个变异位 c2=round(rand*(n-1))+1; temp=xnew1(i,c1); xnew1(i,c1)=xnew1(i,c2); xnew1(i,c2)=temp; %判断产生新路径长度是否变短 dist=0; for j=1:n-1 dist=dist+D(xnew1(i,j),xnew1(i,j+1)); end dist=dist+D(xnew1(i,1),xnew1(i,n)); %dist=dist(xnew1(i,:),D); if F(i)>dist x(i,:)=xnew1(i,:); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % F=(x,C,D) %计算种群适应度 %xuhao=xulie(F) %最小适应度种群序号 a1=F(1); a2=1; for i=1:m if a1>=F(i) a1=F(i); a2=i; end end xuhao=a2; L_best(N)=min(F); Tour_gbest=x(xuhao,:); %当前全局最优路径 N=N+1; figure(1) scatter(C(:,1),C(:,2)); hold on plot([C(Tour_gbest(1),1),C(Tour_gbest(n),1)],[C(Tour_gbest(1),2),C(Tour_gbest(n),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g') for ii=2:n plot([C(Tour_gbest(ii-1),1),C(Tour_gbest(ii),1)],[C(Tour_gbest(ii-1),2),C(Tour_gbest(ii),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g') end hold off figure(2) plot(L_best); % set(findobj('tag','N'),'string',num2str(N-1));%当前迭代次数 % set(findobj('tag','tour'),'string',num2str(Tour_gbest));%当前最优路径 % set(findobj('tag','L'),'string',num2str(min(L_best)));%当前最优路径长度 %%%这里的L_best是当前最优路径??? end for j=1:Nmax if j==1 Nbest=1; elseif L_best(j)<L_best(j-1) Nbest=j; end end
标签:xnew1,dist,PSO,Tour,matlab,c2,end,id,TSP From: https://www.cnblogs.com/51matlab/p/17070555.html