一、TSP简介

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP的数学模型

二、粒子群算法简介

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 PSO_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to PSO_OpeningFcn 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
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @PSO_OpeningFcn, ...'gui_OutputFcn',  @PSO_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, 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 run_Callback(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)
TSP_type = get(findobj('tag','tsp'),'Value');switch TSP_typecase 1data=load('burma14.txt');case 2data=load('ulysses22.txt');case 3data=load('bayg29.txt');case 4data=load('Oliver30.txt');case 5data=load('eil51.txt');case 6data=load('st70.txt');case 7data=load('pr76.txt');case 8data=load('gr96.txt');case 9data=load('ch130.txt');case 10data=load('ch150.txt');case 11data=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: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); 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 algo_typecase 1
%% 初始化所有粒子
for i=1:mx(i,:)=randperm(n);  %粒子位置
end
F=fitness(x,C,D);         %计算种群适应度
%xuhao=xulie(F)           %最小适应度种群序号
a1=F(1);
a2=1;
for i=1:mif 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: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

四、运行结果

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【TSP】基于matlab GUI混合粒子群算法求解旅行商问题【含Matlab源码 925期】相关推荐

  1. 粒子群算法求解带约束优化问题 源码实现

    算法原理 之前求解的无约束的问题. 粒子群算法求解无约束优化问题 源码实现 算法原理如下 今天讲解下求解约束优化的问题.该问题常用的方法是罚函数法.即如果一个解x不满足约束条件,就对适应度值设置一个惩 ...

  2. 粒子群算法求解无约束优化问题 源码实现

    算法原理 粒子群算法思想来源于实际生活中鸟捕食的过程.假设在一个n维的空间中,有一群鸟(m只)在捕食,食物位于n维空间的某个点上,对于第i只鸟某一时刻来说,有两个向量描述,一个是鸟的位置向量,第二个是 ...

  3. 【路径规划-TSP问题】基于蚁群算法求解旅行商问题含Matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  4. 粒子群算法求解旅行商问题

    算法原理 旅行商问题是一个经典的NP问题,假设有N个城市,需要确定一个访问顺序,使得每个城市都访问一面,最后回到起点城市,且保证行走的总距离最短.        假设随机生成10个城市坐标,城市之间的 ...

  5. 【路径规划-TSP问题】基于粒子群结合蚁群算法求解旅行商问题附matlab代码

    1 内容介绍 一种基于粒子群优化的蚁群算法求解TSP问题的方法.该方法在求解TSP问题时,利用粒子群优化的思想,对蚁群算法的参数取值进行优化并选择.在粒子群算法中,将蚁群算法的5个参数(q,α,β,ρ ...

  6. 粒子群算法求解旅行商问题TSP (JAVA实现)

    粒子群算法求解旅行商问题TSP 写在开头: 最近师妹的结课作业问我,关于使用粒子群求解TSP问题的思路.我想了想,自己去年的作业用的是遗传算法,貌似有些关联,索性给看了看代码.重新学习了一遍粒子群算法 ...

  7. 【PSO TSP】基于matlab GUI粒子群算法求解旅行商问题【含Matlab源码 1334期】

    ⛄一.TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  8. 【三维装箱】基于粒子群算法求解三维装箱问题matlab源码

    1 简介 针对约束条件下三维装箱问题复杂性,为提高装箱利用率,本文提出 了混合粒子群算法,该算法采用BF启发式算法配合改进的自适应权重粒子群算法实现.通过仿真试验,结果表明该混合粒子群算法对解决部分约 ...

  9. 【ACO TSP】基于matlab改进的蚁群算法求解旅行商问题【含Matlab源码 242期】

    ⛄一.TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  10. 【MATLAB】混合粒子群算法原理、代码及详解

    目录 1.算法 1.1.原理 1.2.性能比较 1.3.步骤 2.代码 2.1.源码及注释 2.2.执行与效果 1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群 ...

最新文章

  1. centos6.7 64位环境下部署MySQL-5.7.13
  2. BAT集体告别中台上半场!接下来,中台怎么玩?
  3. seaborn+画图+EDA
  4. Android开发环境的搭建
  5. oracle 的float(b)转
  6. python可以不用主函数吗_python自定义函数可以向前引用不用声明
  7. Android自定义view之基础知识
  8. 正则表达式:基础知识学习
  9. terrasolid时间设置
  10. 杰里之. 输出 3 路 PMW【篇】
  11. pico-ctf-2013 overflow-2
  12. SAP MM 事务代码MI31之思考
  13. js 中断函数执行_javascript 终止函数执行操作
  14. 原来我是水瓶座。。。
  15. 实现app直播商城源码,先从简单的直播系统开始
  16. 手把手教你打造全宇宙最强 Firefox 浏览器
  17. 苹果快捷键怎么调出来_ps常用10大快捷键
  18. 三星 linux手机系统版本,三星手机将支持完整版 Linux
  19. 一行代码“黑”掉任意网站
  20. 明华读卡器 java_Java调用明华RF读写器DLL文件过程解析

热门文章

  1. EDU 61 F. Clear the String 区间dp
  2. CentOS7防火墙之firewalld
  3. Perceptron实践
  4. LoadRunner Vuser测试脚本添加前置条件举例
  5. zngnqfxtuubuosmo
  6. 字符串的一般性和特殊性
  7. [转]cocos2d-x场景切换时内存过高导致crash解决方法
  8. 关闭SqlConnection的方法
  9. 第11章 支撑向量机 SVM 学习笔记 下 SVM思路解决回归问题
  10. tinyxml读xml文件,转化字节,c#解析