通过 PSO实现TSP问题优化
clc;
clear;
close all;
warning off;
data=load('Oliver30.txt');
a=data(:,2);
b=data(:,3);
C=[a b]; ? ? ? ? ? ? ? ?%城市坐標(biāo)矩陣
n=size(C,1); ? ? ? ? ? ?%城市數(shù)目
D=zeros(n,n); ? ? ? ? ? %城市距離矩陣
%L_best=ones(Nmax,1);
for i=1:n
? ? for j=1:n
? ? ? ? if i~=j
? ? ? ? ? ? D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; ? ? ? ? ? ? ? ? ? ?
? ? ? ? end
? ? ? ? D(j,i)=D(i,j);?
? ? ?end
end
Nmax=200;
m=10;
%% 初始化所有粒子
for i=1:m
? ? x(i,:)=randperm(n); ?%粒子位置
end
F=fitness(x,C,D); ? ? ? ? %計(jì)算種群適應(yīng)度?
%xuhao=xulie(F) ? ? ? ? ? %最小適應(yīng)度種群序號
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; ? ? ? ? ? ?%當(dāng)前個體最優(yōu)
Tour_gbest=x(xuhao,:) ; ?%當(dāng)前全局最優(yōu)路徑
Pb=inf*ones(1,m); ? ? ? ?%個體最優(yōu)記錄
Gb=F(a2); ? ? ? ? %群體最優(yōu)記錄
xnew1=x;
N=1;
while N<=Nmax
? ? %計(jì)算適應(yīng)度?
? ? F=fitness(x,C,D);
? ? for i=1:m
? ? ? ? if F(i)<Pb(i)
? ? ? ? ? ? Pb(i)=F(i); ? ? ?%將當(dāng)前值賦給新的最佳值
? ? ? ? ? ? Tour_pbest(i,:)=x(i,:);%將當(dāng)前路徑賦給個體最優(yōu)路徑
? ? ? ? end
? ? ? ? if F(i)<Gb
? ? ? ? ? ? Gb=F(i);
? ? ? ? ? ? Tour_gbest=x(i,:);
? ? ? ? end
? ? end
% ?nummin=xulie(Pb) ? ? ? ? ? %最小適應(yīng)度種群序號
? ? 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); ? ? ? ? ?%當(dāng)前群體最優(yōu)長度
? ? for i=1:m
? ? ? %% 與個體最優(yōu)進(jìn)行交叉
? ? ? c1=round(rand*(n-2))+1; ?%在[1,n-1]范圍內(nèi)隨機(jī)產(chǎn)生一個交叉位
? ? ? c2=round(rand*(n-2))+1;
? ? ? while c1==c2
? ? ? ? ? c1=round(rand*(n-2))+1; ?%在[1,n-1]范圍內(nèi)隨機(jī)產(chǎn)生一個交叉位
? ? ? ? ? c2=round(rand*(n-2))+1;
? ? ? end ??
? ? ? chb1=min(c1,c2);
? ? ? chb2=max(c1,c2);
? ? ? cros=Tour_pbest(i,chb1:chb2); %交叉區(qū)域矩陣
? ? ? ncros=size(cros,2); ? ? ? %交叉區(qū)域元素個數(shù)
? ? ? %刪除與交叉區(qū)域相同元素
? ? ? 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;
? ? ? %插入交叉區(qū)域
? ? ? for j=1:ncros
? ? ? ? ? xnew1(i,n-ncros+j)=cros(j);
? ? ? end
? ? ? %判斷產(chǎn)生新路徑長度是否變短
? ? ? 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
? ? ? %% 與全體最優(yōu)進(jìn)行交叉
? ? ? c1=round(rand*(n-2))+1; ?%在[1,n-1]范圍內(nèi)隨機(jī)產(chǎn)生一個交叉位
? ? ? c2=round(rand*(n-2))+1;
? ? ? while c1==c2
? ? ? ? ? c1=round(rand*(n-2))+1; ?%在[1,n-1]范圍內(nèi)隨機(jī)產(chǎn)生一個交叉位
? ? ? ? ? c2=round(rand*(n-2))+1;
? ? ? end ??
? ? ? chb1=min(c1,c2);
? ? ? chb2=max(c1,c2);
? ? ? cros=Tour_gbest(chb1:chb2); %交叉區(qū)域矩陣
? ? ? ncros=size(cros,2); ? ? ? %交叉區(qū)域元素個數(shù)
? ? ? %刪除與交叉區(qū)域相同元素
? ? ? 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;
? ? ? %插入交叉區(qū)域
? ? ? for j=1:ncros
? ? ? ? ? xnew1(i,n-ncros+j)=cros(j);
? ? ? end
? ? ? %判斷產(chǎn)生新路徑長度是否變短
? ? ? 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
? ? ? %% 進(jìn)行變異操作
? ? ? c1=round(rand*(n-1))+1; ? %在[1,n]范圍內(nèi)隨機(jī)產(chǎn)生一個變異位
? ? ? c2=round(rand*(n-1))+1;
? ? ? temp=xnew1(i,c1);
? ? ? xnew1(i,c1)=xnew1(i,c2);
? ? ? xnew1(i,c2)=temp;
? ? ? ?%判斷產(chǎn)生新路徑長度是否變短
? ? ? 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) ? ? ? ? %計(jì)算種群適應(yīng)度?
? ? %xuhao=xulie(F) ? ? ? ? ? %最小適應(yīng)度種群序號
? ? 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,:); ? ? %當(dāng)前全局最優(yōu)路徑
? ? 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));%當(dāng)前迭代次數(shù)
% ? ? set(findobj('tag','tour'),'string',num2str(Tour_gbest));%當(dāng)前最優(yōu)路徑
% ? ? set(findobj('tag','L'),'string',num2str(min(L_best)));%當(dāng)前最優(yōu)路徑長度 ? ? ? %%%這里的L_best是當(dāng)前最優(yōu)路徑???
? ??
end
for j=1:Nmax
? ? ? ? ? if j==1
? ? ? ? ? ? ? Nbest=1;
? ? ? ? ? elseif L_best(j)<L_best(j-1)
? ? ? ? ? ? ? Nbest=j;
? ? ? ? ? end
end?
D134
總結(jié)
以上是生活随笔為你收集整理的通过 PSO实现TSP问题优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PSO求解梯级水库优化调度
- 下一篇: 7.MATLAB变量——矩阵操作二