700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 基于PSO粒子群优化算法的TSP问题最短路径求解matlab仿真

基于PSO粒子群优化算法的TSP问题最短路径求解matlab仿真

时间:2021-08-19 04:08:24

相关推荐

基于PSO粒子群优化算法的TSP问题最短路径求解matlab仿真

up目录

一、理论基础

二、核心程序

三、测试结果

一、理论基础

在PSO中,群中的每个粒子表示为向量。在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本。矢量转换为多维搜索空间中的位置。每个粒子也会记住它最好的历史位置。对于PSO的每次迭代,找到全局最优位置。这是群体中最好的最优位置。一旦找到全局最优位置,每个粒子都会更接近其局部最优位置和全局最优位置。当在多次迭代中执行时,该过程产生一个解决该问题的良好解决方案,因为粒子会聚在近似最优解上。

Ray等人通过将PSO算法和Pareto排序机制想结合起来。采用Pareto排序法来选择一组精英解,全局最优粒子的选择则是采用轮盘赌方式从中选择。实际运行时,只有少量的个体选择概率大,种群多样性保持不好。Coello等在PSO算法中选择群体最佳位置则是通过引入Pareto竞争机制和微粒知识库。该知识库用于存储微粒在每次飞行循环后的飞行经验,知识库的更新是通过考虑一个基于地理学的系统,该系统是就每个微粒的目标函数值而言来定义的。这个知识库被微粒用来确定一个指导搜索的领导者。同时非劣解的确定是通过将候选个体与从种群中随机选出的比较集进行比较,因此比较集的参数对算法成功与否有着至关重要的影响。若参数过大,则容易发生早熟收敛的现象,而参数过小,则种群中选出的非劣解的数量可能过少。

PSO模拟的是鸟群的捕食行为。设想场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有鸟都不知道食物在哪里。但是他们知道当前的位置距离食物还有多远。那么找到食物的最优策略是什么?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

鸟群在整个搜寻过程中,通过相互传递各自的信息,让其他鸟知道自己当前的位置,通过这样的协作来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终整个鸟群都能聚集在食物源的周围,即找到了最优解。

PSO中,每个优化问题的解都是搜索空间的一只鸟,我们称之为“粒子”。所有的粒子都有一个被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解,在每一次迭代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值。另一个极值是整个种群目前找到的最优解,这个极值是全局机制。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个“极值(pbest和gbest)”来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

二、核心程序

clc;clear;close all;warning off;addpath(genpath(pwd));data=load('Oliver30.txt');a=data(:,2);b=data(:,3);C=[a b];%城市坐标矩阵n=size(C,1); %城市数目D=zeros(n,n); %城市距离矩阵%L_best=ones(Nmax,1);for i=1:nfor j=1:nif i~=jD(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;endD(j,i)=D(i,j); endendNmax=200;m=10;%% 初始化所有粒子for i=1:mx(i,:)=randperm(n); %粒子位置endF=fitness(x,C,D); %计算种群适应度 %xuhao=xulie(F) %最小适应度种群序号a1=F(1);a2=1;for i=1:mif a1>=F(i)a1=F(i);a2=i;endendxuhao=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:mif F(i)<Pb(i)Pb(i)=F(i);%将当前值赋给新的最佳值Tour_pbest(i,:)=x(i,:);%将当前路径赋给个体最优路径endif F(i)<GbGb=F(i);Tour_gbest=x(i,:);endend% nummin=xulie(Pb) %最小适应度种群序号a1=Pb(1);a2=1;for i=1:mif a1>=Pb(i)a1=Pb(i);a2=i;endendnummin=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==c2c1=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:ncrosfor k=1:nif xnew1(i,k)==cros(j)xnew1(i,k)=0;for t=1:n-ktemp=xnew1(i,k+t-1);xnew1(i,k+t-1)=xnew1(i,k+t);xnew1(i,k+t)=temp;end endendendxnew=xnew1;%插入交叉区域for j=1:ncrosxnew1(i,n-ncros+j)=cros(j);end%判断产生新路径长度是否变短dist=0;for j=1:n-1dist=dist+D(xnew1(i,j),xnew1(i,j+1));enddist=dist+D(xnew1(i,1),xnew1(i,n));if F(i)>distx(i,:)=xnew1(i,:);end%% 与全体最优进行交叉c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位c2=round(rand*(n-2))+1;while c1==c2c1=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:ncrosfor k=1:nif xnew1(i,k)==cros(j)xnew1(i,k)=0;for t=1:n-ktemp=xnew1(i,k+t-1);xnew1(i,k+t-1)=xnew1(i,k+t);xnew1(i,k+t)=temp;end endendendxnew=xnew1;%插入交叉区域for j=1:ncrosxnew1(i,n-ncros+j)=cros(j);end%判断产生新路径长度是否变短dist=0;for j=1:n-1dist=dist+D(xnew1(i,j),xnew1(i,j+1));enddist=dist+D(xnew1(i,1),xnew1(i,n));if F(i)>distx(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-1dist=dist+D(xnew1(i,j),xnew1(i,j+1));enddist=dist+D(xnew1(i,1),xnew1(i,n));%dist=dist(xnew1(i,:),D);if F(i)>distx(i,:)=xnew1(i,:);endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F=(x,C,D) %计算种群适应度 %xuhao=xulie(F) %最小适应度种群序号a1=F(1);a2=1;for i=1:mif a1>=F(i)a1=F(i);a2=i;endendxuhao=a2;L_best(N)=min(F);Tour_gbest=x(xuhao,:);%当前全局最优路径N=N+1;figure(1)scatter(C(:,1),C(:,2));hold onplot([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:nplot([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')endhold offfigure(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是当前最优路径???endfor j=1:Nmaxif j==1Nbest=1;elseif L_best(j)<L_best(j-1)Nbest=j;endend

三、测试结果

使用matlaba仿真测试结果如下所示:

up0010

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。