基于粒子群算法的TSP问题研究 - 图文(9)

2019-08-31 09:00

西安工业大学毕业设计(论文)

%------进入主要循环,按照公式依次迭代------------

for t=1:M

for i=1:N

v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));

x(i,:)=x(i,:)+v(i,:);

if fitness(x(i,:))

p(i)=fitness(x(i,:));

y(i,:)=x(i,:);

end

if p(i)

pg=y(i,:);

end

end

Pbest(t)=fitness(pg); end

xm = pg';

fv = fitness(pg); 函数2:

function F= fitness(x) F=0;

for i=1:30

F=F+x(i)^2; end 程序2

城市的位置输入到计算机中用下面的函数: function [DLn,cityn]=tsp(n)

if n==10

35

西安工业大学毕业设计(论文)

city10=[0.4 0.4439;0.2439 0.1463;0.1707 0.2293;0.2293 0.761;0.5171 0.9414; 0.8732 0.6536;0.6878 0.5219;0.8488 0.3609;0.6683 0.2536;0.6195 0.2634]; cities d'=2.691 for i=1:10

for j=1:10

DL10(i,j)=((city10(i,1)-city10(j,1))^2+(city10(i,2)-city10(j,2))^2)^0.5; end end

DLn=DL10; cityn=city10; end

适应度函数:

function F=SumDistance(dislist,s)

DistanV=0; n=size(s,2); for i=1:(n-1)

DistanV=DistanV+dislist(s(i),s(i+1));%此函数用来计算总路程 end

DistanV=DistanV+dislist(s(n),s(1));

F=DistanV; 绘图:

function m=plotTSP10(Clist,BSF,bsf,p,f)

CityNum=size(Clist,1);

for i=1:CityNum-1 axis([0,1,0,1]); %绘制点的连线图

plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'rs-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');

hold on;%'rs-','LineWidth',3,'MarkerEdgeColor','','MarkerFaceColor','g'-表示线为红色实线线宽为2,点为方形绿点边缘为黑色 end

axis([0,1,0,1]);

%绘制最后一个点和起始点的连线

plot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNum),2),Clist(BSF(1),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');

36

西安工业大学毕业设计(论文)

%'ms-','LineWidth',3,'MarkerEdgeColor','','MarkerFaceColor','g'-表示线为洋红色实线线宽为2,点为方形绿点边缘为黑色 title([num2str(CityNum),'TSP']); if f==0

text(0.1,0.1,['迭代次数 ',int2str(p),' 最短距离 ',num2str(bsf)]); end hold off;

pause(0.05); 初始化和变换:

function BasePSOforTSP %初始化

w1=0.5; %个体经验保留概率 w2=0.5; %全局经验保留概率 M=200; %最大迭代次数 m=30; %微粒数

CityNum=10; %问题的规模(城市个数)

[dislist,Clist]=tsp(CityNum);%返回dislist可以求出两城市间的距离,Clist表示城市的列表

NC=1;%迭代计数器

R_best=zeros(M,CityNum); %各代最佳路线 L_best=inf.*ones(M,1);%各代最佳路线的长度 L_ave=zeros(M,1);%各代路线的平均长度

%产生微粒的初始位置 for i=1:m

x(i,:)=randperm(CityNum);%产生30个微粒要走的30各城市的列表

L(i)=SumDistance(dislist,x(i,:));%产生这30个微粒各自按上边路径走的总路程 end

p=x; %p为个体最好解

pL=L;%用数组表示每个个体目前的最短路径,也是由于这也是初始化,以后这个距离也要不断更新

[L_best(1,1), n_best]=min(L);%L_best(1,1)表示初始化中30个粒子中最优总距离,n_best表示第几个粒子是最优解

R_best(1,:)=x(n_best,:);%R_best(1,:)表示当前最优微粒所走城市的路径 L_ave(1,1)=mean(L);%L_ave(1,1),30个微粒走的总路程的平均值

%初始交换序

v=ones(CityNum-1,2,m);

figure(1);

while NC<=M %停止条件之一:达到最大迭代次数 for i=1:m

xnew(i,:)=changeFun(x(i,:),v(:,:,i));%初始化交换后返回的矩阵类型

37

西安工业大学毕业设计(论文)

A=changeNum(x(i,:),p(i,:));%产生与个体相比较的交换序 Arand=randFun(A,w1);%用来对个体经验进行保留

xnew(i,:)=changeFun(xnew(i,:),Arand);%对经验已经保留的进行更新其新的位置。

B=changeNum(x(i,:),R_best(NC,:));%产生与全局最优相比较的交换序 Brand=randFun(B,w2);%用来对全局经验进行保留

xnew(i,:)=changeFun(xnew(i,:),Brand);%对经验已经保留的进行更新其新的位置

v(:,:,i)=changeNum(x(i,:),xnew(i,:));%记录实际交换序

L(i)=SumDistance(dislist,xnew(i,:));%产生这30个微粒各自按上边路径走的总路程

if L(i)

pL(i)=L(i);%调整局部最优解 end end

[L_bestnew, n_best]=min(L);%L_bestnew用来表示当前更新的全局最短路径长度,n_best表示是第n_best个达到最优

R_bestnew=xnew(n_best,:);%R_bestnew用来得到当前最优路径的线路 L_ave(NC+1,1)=mean(L);%此次更新30个粒子的所走路程的平均值

if L_bestnew

R_best(NC+1,:)=R_bestnew;%找到更优解,把以前的替换掉,迭代次数加1

else

L_best(NC+1,1)=L_best(NC,1);

R_best(NC+1,:)=R_best(NC,:);%表示此次更新没有比以前更优,保持以前的,迭代次数加1 end

x=xnew;

plotTSP10(Clist,R_best(NC,:),L_best(NC,1),NC,0);%clist是关于城市位置的一个矩阵,并绘制此次路径图 %pause; NC=NC+1; end

%输出结果

Pos=find(L_best==min(L_best));%在迭代完成后找出最终的最短路径的粒子 Shortest_Route=R_best(Pos(1),:);%返回所找到最短路径的粒子所走的路径 Shortest_Length=L_best(Pos(1));%返回最终的最短路径的长度 figure(2);

plot([L_best L_ave]);%绘制每次迭代,最短路径和平均路径的变化,使大家更容易看到次算法的效率

text(85,4.5,['结果:本次搜索最短距离为 ',num2str(Shortest_Length)]);

38

西安工业大学毕业设计(论文)

legend('最短距离','平均距离');%%用来区分最短路径和平均路径 end

function xnew=changeFun(x,C)

changeLen=size(C,1);%返回矩阵c的行数 xnew=x;

for i=1:changeLen a=xnew(C(i,1));

xnew(C(i,1))=xnew(C(i,2));%通过c这个交换序对当前粒子进行更新 xnew(C(i,2))=a;%逐个交换位置 end end

function C=changeNum(x,y)

CityNum=size(x,2);%返回矩阵x的列数

C=ones(CityNum-1,2);%初始化一个交换序 for i=1:CityNum-1

pos=find(x==y(i));%找到x中第i个元素和y中元素相同的位置形成一个交换子 C(i,:)=[i pos];%交换子的产生 %x=changeFun(x,C(i,:)); end end

function v=randFun(v,w)

randLen=size(v,1);%返回矩阵v的行数

for i=1:randLen if rand>w

v(i,2)=v(i,1);%保留经验1-w end end end

39


基于粒子群算法的TSP问题研究 - 图文(9).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:多媒体技术与应用教程(雷运发)课后习题答案(1-4)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: