【TSP问题】基于混合粒子群算法求解旅行商问题matlab源码含GUI

一、简介

1 粒子群算法的概念\ 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.\ PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

2 粒子群算法分析\ 2.1基本思想\ 粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:\ 在这里插入图片描述\ 2 更新规则\ PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。\ 在这里插入图片描述\ 公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。\ 在这里插入图片描述\ 公式(2)和 公式(3)被视为标准PSO算法。\ 3 PSO算法的流程和伪代码\ 在这里插入图片描述

二、源代码

``` function varargout = PSO(varargin) % PSO M-file for PSO.fig % PSO, by itself, creates a new PSO or raises the existing % singleton. % % H = PSO returns the handle to a new PSO or the handle to % the existing singleton. % % PSO('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in PSO.M with the given input arguments. % % PSO('Property','Value',...) creates a new PSO or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before PSOOpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to PSOOpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help PSO

% Last Modified by GUIDE v2.5 12-Jun-2020 22:11:08

% Begin initialization code - DO NOT EDIT guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @PSOOpeningFcn, ... 'guiOutputFcn', @PSOOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin && ischar(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end

if nargout [varargout{1:nargout}] = guimainfcn(guiState, varargin{:}); else guimainfcn(guiState, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before PSO is made visible. function PSO_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to PSO (see VARARGIN)

% Choose default command line output for PSO handles.output = hObject;

% Update handles structure guidata(hObject, handles);

% UIWAIT makes PSO wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = PSO_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in run. function runCallback(hObject, eventdata, handles) % hObject handle to run (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) TSPtype = get(findobj('tag','tsp'),'Value'); switch TSPtype case 1 data=load('burma14.txt'); case 2 data=load('ulysses22.txt'); case 3 data=load('bayg29.txt'); case 4 data=load('Oliver30.txt'); case 5 data=load('eil51.txt'); case 6 data=load('st70.txt'); case 7 data=load('pr76.txt'); case 8 data=load('gr96.txt'); case 9 data=load('ch130.txt'); case 10 data=load('ch150.txt'); case 11 data=load('pr226.txt');
end 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: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=str2double(get(findobj('tag','N_max'),'string')); m=str2double(get(findobj('tag','m'),'string'));

algo_type = get(findobj('tag','algo'),'Value');

switch algotype case 1 %% 初始化所有粒子 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; Tourpbest=x; %当前个体最优 Tourgbest=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) 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 ```

三、运行结果

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab科研辅导帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值