简介

PSO(粒子群算法)是群智能算法的一种,其他的群智能算法还有蚁群算法,遗传算法等。其他的智能算法还有模拟退火。之前看过一段时间的PSO,商务智能课程最后的大作业便想用一下,刚好在github上看到有人用模拟退火解决TSP问题,而且效果不错,于是便萌生了利用PSO求解TSP问题的想法。

TSP问题想必大家再熟悉不过了,它是一个NP-hard问题,难以用暴力枚举的算法进行计算。针对NP-hard问题,有许多方法可以求得其近似解,而且效果不错,进化计算算法和群智能算法便是其中之一。

之前也在博客上看过其他人用PSO求解TSP问题,主要有一下几个问题

  1. TSP问题的规模相对较小
  2. 对于规模较大的问题,结果并不算太好。

一般而言,如果不考虑对TSP问题的额外的处理方式,直接用PSO算法,对于一些规模较小的问题(节点数量一般不超过20),PSO算法的效果还行,但是,当问题的规模变得比较大时(50及以上),PSO算法就无能为力。一个重要的原因在于当节点数量增加时,问题的复杂度会变得很大,PSO算法会陷入局部最优,而且这个局部最优往往离最优解很远。这个时候,有两种选择,一是改进PSO算法本身,这个基本很难,我尝试过,效果并不太好,PSO算法的模式基本都是固定的,如果只改变速度中的权重或是简单的调参,收效甚微;二是改变对TSP问题的编码以及粒子速度与位置的定义,使问题本身相对更加容易处理。我用的是第二种方法。

方法与过程

1.粒子的定义

1.位置

对于TSP问题,我们一般将粒子的位置定义为一个位置点的序列。比如{1,2,3,4,5},它表示的是一条路径,即1->2, 2->3, 3->4, 4->5, 5->1(我选的TSP问题是一个环路,所以最后的路径会成环),路径的长度可以计算每一条边的长度并求和得到,边的距离是两点之间的欧氏距离(问题中的点都是二维的)。

2.速度

TSP问题中粒子的速度是粒子在当前解空间的运动速度,一般是与粒子当前位置和粒子群体的历史最好位置的差成正比(有时还要考虑粒子当前位置与粒子的历史最好位置的差)。

在此问题中,粒子的速度被定义为一个二元组合,表示当前路径(即粒子的位置)的一个交换操作。比如(2,3),表示对当前粒子位置中节点2和3进行一次交换操作。粒子的速度可以与位置进行求和,例如,{1,2,3,4,5}+{(2,3)}={1,3,2,4,5}。{(1,2)}和{(2,1)}是两个相同的速度,交换不会考虑粒子的先后顺序。速度的长度定义为元组的个数。

3.运算规则

 a. 位置-位置=速度

               位置相减会得到一个速度,即一个元组序列。例如,{1,2,3,4,5}-{1,2,4,3,5}={(3,4)},我们可以这样看,两个速度的差别在于3,4两个节点的位置不同,只需将第二个速度进行一次节点的交换便可得到第一个速度。

           b. 速度+速度=速度

               两个速度相加会得到一个新的速度。比如{(1,2)}+{(3,4)}={(1,2),(3,4)}。如果有重复的元组,则会去掉相应的重复项(因为两个相同的交换操作会相互抵消)。{(1,2)}+{(2,1)}={(1,2)}。

           c. 速度*常数=速度

              速度乘以常数会得到一个速度,只不过这个速度的长度和新的速度长度不同。

speed_1*c=speed_2, 则{length(speed_1)*c]=length(speed_2), 左边是向下取整。例如,{(1,2),(4,5)}*0.5={(1,2)}。

           d. 位置+速度=位置

位置和速度相加会得到一个新的位置。比如,{1,2,3,4,5}+{(1,2)}={2,1,3,4,5}。按照速度中的元组对位置进行相应变换即可。

 e.滑动运算

              滑动操作是对粒子的位置进行操作。假定速度X={x1,x2,x3,...xm}, SL(X,k)={x(1+k)%m, x(2+k)%m,....,x(m+k)%m}。这里定义这个运算的原因在于粒子速度的等价性。比如,{1,2,3,4,5}与{5,4,3,2,1},它们是两个相同的速度,但是表示不同,如果直接对其做差,相当于做了一次冒泡排序,但是事实上他们的差值应该为0。所以,我们在对速度进行做差时,会用速度的n-1个等义(相当于n-1次滑动运算的结果)表示进行做差,取其中长度最小的速度作为最后的结果。

f.交叉消除

这个运算可以说是这个问题的核心。我在用一般的PSO算法进行求解的时候,发现了一个问题,就是结果中的路径会有大量的交叉。

如上图所示,而且我在博客上看很多人利用PSO算法求解TSP问题的时候也有同样的问题。这是一个很重要的原因,因为大多数的解空间都会有大量的不好的解,这些不好的解的原因在于它们存在大量的边的交叉。于是,我们定义了消除交叉的操作。具体请看下图

这个算法不是简单的将两条边进行交换就完事了,我尝试过这种操作,效果很不好。它会将后面的边也进行交换。只改变了交叉的边的那一部分,对后面的操作没有影响。

结果分析

最后的结果如下图:

可以看到,与之前相比好了很多,而且与最优解非常接近,除了一些小的瑕疵。

下面是我参考的一些资料。

1.测试数据

2.参考论文

利用PSO求解TSP问题相关推荐

  1. 人工智能导论——遗传算法求解TSP问题实验

    一.实验目的: 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传算法求解组合优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响. 二.实验原理: 旅行商问题,即TSP问题(Traveli ...

  2. 求解TSP问题神器——elkai(简单好用)

    elkai是python的第三方库,专门用于解决TSP问题,目前已知能够在规模达到315个节点的问题中求解出最优方案.elkai本身的实现基于大名鼎鼎的LKH算法,该算法被认为是目前解决TSP问题最有 ...

  3. MAT之PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度

    MAT之PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度 目录 输出结果 实现代码 输出结果 实现代码 x = 1:0.01:2; y ...

  4. MAT之PSO:利用PSO实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度

    MAT之PSO:利用PSO实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度 目录 输出结果 代码设计 输出结果 代码设计 x = 1:0.01:2; y = s ...

  5. python用动态规划求删除路径_Python | 动态规划求解TSP

    解题思路主要有两部分: i为当前节点(城市),S为还没有遍历的节点(城市集合),表示从第i个节点起,经历S集合中所有的点,到达终点的最短路径长度. 回溯找到最优的路径,需要将S集合一一对应一个数字(类 ...

  6. 基于贪心算法求解TSP问题(JAVA)

    前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.demod ...

  7. 人工蜂群算法求解TSP问题

    人工蜂群算法求解TSP问题 [标签] ABC TSP Matlab data:2018-10-19 author:怡宝2号 [总起]利用人工蜂群算法(Artificial Bee Colony Alg ...

  8. 人工蜂群算法求解TSP旅行商问题C++(2020.11.13)

    ABC算法求解TSP问题的C++实现 1.输入数据文件:bayg29.tsp 2.头文件 3.所需的类 3.1 城市类City 3.2 包含城市的地图类Graph 3.3 蜜蜂类Bee 3.4 人工蜂 ...

  9. tsp java_基于贪心算法求解TSP问题(JAVA)

    前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TPS问题 TSP问题(Travelling ...

最新文章

  1. SAP QM QAC1事务代码不能修改含有HU的检验批里的数量
  2. GET与POST可传递的最大值到底是多少?
  3. 关于mbzuai的offer的三点思考
  4. mysql 连接池的作用,数据库连接池介绍、主要参数设置、作用
  5. C++确定一个字符串是否是另一个字符串的排列的算法(附完整源码)
  6. spring的各种注解的作用-持续更新中
  7. LeetCode 1291. 顺次数(模拟)
  8. android root截图软件下载,截屏软件(无需ROOT)
  9. java8种定位_python基础教程:8种selenium元素定位的实现
  10. 使用Eclipse-Maven-git做Java开发(9)--eclipse新建maven结构工程
  11. 追加画面文言时注意【×硬换行】与【○软换行】
  12. java jxl label_jxl.write.label
  13. 前端 docker + gitlab CI 的持续集成(二)
  14. Unity Module Manager 模块管理器
  15. Android 将签名布局旋转90度,Android签名生成和互转(示例代码)
  16. 图神经网络和强化学习
  17. PDF、Word、Excel文件前端预览实操干货都在这!
  18. Charles抓包遇到Not allowed POST https://xxxxxxxxxxx/xxxxxxxxxx connection dropped
  19. 怎么用白光干涉仪的拼接测量功能
  20. 判断当前是否是移动端H5打开

热门文章

  1. 山东大学软件学院网络攻击与防范21年往年题回忆版+答案整理
  2. Matlab中readtable用法
  3. 计算机编程方式有哪些,如何自学编程?有什么方法
  4. 计算机现在那个专业更好
  5. ::细细品味ASP.NET (二):: 1
  6. 北京首席技术官架构师高端培训10月开班,约吗?
  7. LeetCode_589
  8. 计算机网络技术英语简历范文,计算机网络技术英文简历范文
  9. 【C++OJ_静态与友元】电视机与遥控器(友元类)
  10. Unity中网格合并