1. 前言

本文将总结先前设计的五个启发式算法的求解效果,算法文章如下表:

智能优化算法类别 启发式算法求解TSP问题系列博文
进化算法 遗传算法求解TSP问题
仿人智能优化算法 禁忌搜索算法求解TSP问题
仿自然优化算法 模拟退火算法求解TSP问题
群智能优化算法 蚁群算法求解TSP问题
群智能优化算法 粒子群算法求解TSP问题

上述博文中所采用的例子是随机在(0,101)二维坐标平面上生成的20个城市数据,五种常见启发式算法在此例子上均能取得较好的表现,为了进一步对比算法求解的效果,本文将扩大城市规模进行算法测试,即随机在(0,101)二维坐标平面上生成50个城市数据。

#随机生成城市数据代码,CityNum、MinCoordinate、MaxCoordinate三个参数可调节
CityNum = 50#城市数量
MinCoordinate = 0#二维坐标最小值
MaxCoordinate = 101#二维坐标最大值
CityCoordinates = [(random.randint(MinCoordinate,MaxCoordinate),random.randint(MinCoordinate,MaxCoordinate)) for i in range(CityNum)]#20个城市数据
CityCoordinates = [(88, 16),(42, 76),(5, 76),(69, 13),(73, 56),(100, 100),(22, 92),(48, 74),(73, 46),(39, 1),(51, 75),(92, 2),(101, 44),(55, 26),(71, 27),(42, 81),(51, 91),(89, 54),(33, 18),(40, 78]#50个城市数据
CityCoordinates = [(71, 71),(68, 71),(19, 41),(9, 67),(22, 34),(15, 2),(60, 56),(36, 38),(18, 92), (96, 27),(71, 85),(24, 70),(12, 31),(77, 88),(59, 49),(27, 87),(94, 97),(37, 42),(32, 78),(65, 57), (96, 47),(95, 86),(61, 80),(55, 7),(94, 74),(39, 6),(62, 43),(34, 11),(18, 89),(79, 16),(100, 99),(76, 39),(35, 51),(74, 71),(59, 48),(98, 1),(35, 98),(82, 91),(0, 64),(56, 48),(89, 8),(69, 54),(3, 72),(79, 16),(66, 88),(80, 15),(56, 88),(30, 57),(67, 86),(75, 4)]

2. 算法求解效果分析与讨论

以下采用50个城市数据进行分析,只调节算法参数,不更改算法设计,具体设计可参考原博文。

#50个城市数据,编号分别为0,1,...,49
CityCoordinates = [(71, 71),(68, 71),(19, 41),(9, 67),(22, 34),(15, 2),(60, 56),(36, 38),(18, 92), (96, 27),(71, 85),(24, 70),(12, 31),(77, 88),(59, 49),(27, 87),(94, 97),(37, 42),(32, 78),(65, 57), (96, 47),(95, 86),(61, 80),(55, 7),(94, 74),(39, 6),(62, 43),(34, 11),(18, 89),(79, 16),(100, 99),(76, 39),(35, 51),(74, 71),(59, 48),(98, 1),(35, 98),(82, 91),(0, 64),(56, 48),(89, 8),(69, 54),(3, 72),(79, 16),(66, 88),(80, 15),(56, 88),(30, 57),(67, 86),(75, 4)]

2.1 遗传算法

#GA参数
generation = 1000  #迭代次数
popsize = 100   #种群大小
tournament_size = 5 #锦标赛小组大小
pc = 0.95   #交叉概率
pm = 0.1    #变异概率

最优解为[25, 27, 5, 12, 2, 4, 7, 17, 32, 47, 38, 42, 3, 11, 18, 36, 15, 28, 8, 46, 44, 48, 37, 10, 22, 19, 6, 39, 26, 34, 14, 41, 24, 21, 16, 30, 13, 33, 1, 0, 31, 20, 9, 35, 40, 49, 43, 29, 45, 23],其适应度值为681.3,路径图和迭代效果如下:



讨论】对比其他几个算法的求解效果,可以发现遗传算法求解表现最差,算法后期迭代收敛性较差,可能是迭代到一定程度种群多样性较低,解决该问题的一个方法是引入“灾变”,丰富种群多样性。在初始解构造上,也可以采用贪婪策略等加速求解过程。

2.2 禁忌搜索算法

'''这里采用贪婪算法构造初始解,随机构造初始解方法表现不佳。'''
#参数
iterMax = 500#迭代次数
iterI = 1#当前迭代次数
#PSO参数
birdNum = 100#粒子数量
w = 0.2#惯性因子
c1 = 0.4#自我认知因子
c2 = 0.4#社会认知因子

最优解为[38, 42, 28, 8, 15, 36, 46, 22, 44, 48, 10, 13, 37, 16, 30, 21, 24, 33, 0, 1, 41, 19, 6, 34, 14, 39, 26, 31, 20, 9, 35, 40, 45, 43, 29, 49, 23, 25, 27, 5, 12, 2, 4, 7, 17, 32, 47, 18, 11, 3],其适应度值为563.5,路径图如下:

2.3 模拟退火算法

模拟退火算法有两个实现思路。
(1)思路一

'''思路一,采用贪婪算法构造初始解'''
#SA参数
Tend = 0.1
T = 100
beta = 0.99

最优解为[8, 28, 15, 18, 11, 47, 32, 17, 7, 4, 2, 12, 5, 27, 25, 23, 49, 45, 29, 43, 40, 35, 9, 20, 31, 26, 34, 14, 39, 6, 19, 41, 1, 0, 33, 10, 48, 44, 22, 46, 13, 37, 16, 30, 21, 24, 36, 3, 42, 38],其适应度值为635.0,路径图和迭代图如下。


讨论】这里存在一个问题:在第一次迭代之后就取得最优解,之后的搜索都是无效的(多次运行结果都是这样),深入分析后发现,是直接应用Metropolis准则所导致,裂解在random.random() < math.exp(-(new_value-value)/T)中被频繁接受(即math.exp(-(new_value-value)/T)概率太大导致,也与新解new_value和当前最优解value之差有很大关系),这导致搜索不具备趋向性(不在目前最优解附近寻优),收敛较差,随机性太强。亟待寻找替他合适函数改进/替代。

(2)思路二

'''思路二'''
#SA参数
Tend = 0.01
T = 100
beta = 0.98

最优解为[42, 3, 38, 11, 18, 15, 28, 8, 36, 46, 22, 48, 44, 10, 13, 37, 16, 30, 21, 24, 33, 0, 1, 19, 41, 6, 14, 34, 39, 26, 31, 20, 9, 45, 29, 43, 49, 40, 35, 23, 25, 27, 5, 12, 4, 2, 7, 17, 32, 47],其适应度值为595.2,路径图如下:

2.4 蚁群算法

#参数
iterMax = 500#迭代次数
#ACO参数
antNum = 50#蚂蚁数量
alpha = 2#信息素重要程度因子
beta = 1#启发函数重要程度因子
rho = 0.2#信息素挥发因子
Q = 100.0#常数

最优解为[4, 2, 12, 5, 27, 25, 23, 49, 43, 45, 29, 40, 35, 9, 20, 31, 26, 39, 34, 14, 6, 19, 41, 33, 0, 1, 22, 48, 44, 10, 13, 37, 16, 30, 21, 24, 46, 28, 8, 15, 36, 18, 11, 3, 38, 42, 32, 47, 17, 7],其适应度值为 625.7,路径图和迭代图如下:



讨论】城市数量从20增加50,运算时间增加特别明显,50个数据运算时间了得有几个小时,其他的算法都是几分钟级别的。。。原因大概是算法设计导致的,原算法设计在每一次迭代中,针对每一只蚂蚁,有四个操作(如下面代码所示):轮盘赌选择后续城市、计算适应度、更新当前蚂蚁信息素增量、更新转移概率,其中轮盘赌选择后续的操作效率是比较低的,或许可以尝试采用锦标赛算子减少计算量,其次每一只蚂蚁完成城市旅行后都进行更新蚂蚁信息素和更新转移概率,计算量也是比较大的,可以调整为每一代蚂蚁都完成城市旅行后在进行更新,这可以大大减少计算量,但是可能会影响收敛效果,亟待改进测试。

for i in range(antNum):#根据转移概率选择后续途径城市,并计算适应值antCityList[i] = select(antCityList[i],antCityTabu[i],trans_p)#轮盘赌选择后续城市fitList[i] = calFitness(antCityList[i],dis_matrix)#计算适应度,即路径长度pheromone = updatePheromone(pheromone,fitList[i],antCityList[i],rho,Q)#更新当前蚂蚁信息素增量trans_p = calTrans_p(pheromone,alpha,beta,dis_matrix,Q)#更新转移概率

2.5 粒子群算法

#参数
iterMax = 1000#迭代次数
#PSO参数
birdNum = 100#粒子数量
w = 0.2#惯性因子
c1 = 0.4#自我认知因子
c2 = 0.4#社会认知因子

最优解为[6, 14, 34, 39, 26, 31, 20, 9, 35, 40, 43, 45, 29, 49, 23, 25, 27, 5, 12, 2, 4, 7, 17, 32, 47, 11, 3, 38, 42, 28, 8, 15, 18, 36, 46, 22, 44, 48, 10, 13, 37, 16, 30, 21, 24, 33, 0, 1, 41, 19],其适应度值为564.0,路径图和迭代图如下:


3. 总结

算法设计和参数的选择很大程度上影响优化算法的求解效果和效率,在比较算法效果的时候也应在特定的算法设计和参数组合下讨论。在本实验的五种算法求解中,20个城市数据基本都能取得较好的效果,当城市规模扩大到50时,求解效果最好的是禁忌搜索算法(563.5)和粒子群算法(564.0),模拟退火算法中,算法设计思路二取得不错的效果(595.2),而蚁群算法( 625.7)和遗传算法(681.3)则表现不佳。当然,如果不采用贪婪算法构造初始解,禁忌搜索算法和模拟退火算法搜索解的效果也会大打折扣,反过来想,遗传算法和蚁群算法如果引入贪婪策略进行改进,求解质量上应该会较大的提升。

TSP系列目录
智能优化算法类别 启发式算法求解TSP问题系列博文
进化算法 遗传算法求解TSP问题
仿人智能优化算法 禁忌搜索算法求解TSP问题
仿自然优化算法 模拟退火算法求解TSP问题
群智能优化算法 蚁群算法求解TSP问题
群智能优化算法 粒子群算法求解TSP问题
总结篇 五种常见启发式算法求解TSP问题
改进篇 遗传-粒子群算法&遗传-禁忌搜索算法求解TSP问题

记录学习过程,欢迎指正

五种常见启发式算法求解TSP问题-总结篇相关推荐

  1. 五种常见的PHP设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 五种常见的PHP设计模式 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm ...

  2. Ajax 和 XML: 五种常见 Ajax 模式

    Asynchronous JavaScript + XML(Ajax)无疑是 2006 年最热门的技术术语,且有望在 2007 得到进一步发展.但是对您的应用程序来说它究竟有什么意义呢?Ajax 应用 ...

  3. 小波基函数构造matlab,五种常见小波基函数及其matlab实现全解.docx

    五种常见小波基函数及其matlab实现全解 与标准的傅里叶变换相比,小波分析中使用到的小波函数具有不唯一性,即小波函数 具有多样性.小波分析在工程应用中,一个十分重要的问题就是最优小波基的选择问题,因 ...

  4. java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...

    [简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...

  5. [Android Studio]掌握Android Studio的五种常见控件和五种常见布局

    目录 一.View和ViewGroup 二.Android的五种常见控件 2.1 文本控件 2.1.1 TextView 2.1.2 EditText 2.2 按钮控件 2.2.1 Button 2. ...

  6. 成都拓嘉启远:造成拼多多异常订单的五种常见原因

    订单异常对于拼多多商家来说并不是什么好事,尤其是在活动的时候,销量大,本来就已经忙不过来了还遇到多个订单异常,就比较头大了,那么在新手的时候就需要去了解更多的异常订单的原因,避免在以后经营的过程遇到这 ...

  7. 五种常见的加密方式及常用的加解密工具

    如果你是互联网公司的信息安全从业者,那么你可能会经常需要处理撞库事件,撞库是黑客的无聊"恶作剧".黑客收集已经在互联网上泄露的用户和密码信息,生成对应的字典表,并尝试批量登录其他网 ...

  8. IoT五种常见物联网协议:TCP/IP、UDP、HTTP、MQTT、CoAP初探

    对于软件公司来说,IoT模式为其硬件设计以及所提供的服务带来决定性的改变.其中影响最大的一个方面是通信协议. 通信协议可以被认为是一种语言,即两台或两台以上的设备可以相互交流.同时无规矩不成方圆,通信 ...

  9. 五种常见的DNS攻击类型及应对方式

    随着俄乌冲突中网络战的升级,DNS安全成为业界关注的焦点. 无论是去年3月份NSA发布的保护性DNS(PDNS)推荐指南,还是俄罗斯主权互联网的核心--DNS服务在战争期间的大规模启用,都表明DNS安 ...

最新文章

  1. 算法导论chapter6 堆排序的代码
  2. MATLAB里面的filter和filtfilt的C语言源代码
  3. 关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票
  4. 学校为什么要单位接收函_签了三方,想毁约怎么办?这几点你必须要知道!
  5. MFC中CDC画线总结
  6. 领域驱动设计系列贫血模型和充血模型
  7. CVE-2019-11477漏洞详解详玩
  8. laravel 文档
  9. 蓝色主题登陆页面界面模板
  10. There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED]
  11. java求数组的平均值_Java中数组求平均值,最大值,最小值。
  12. Python模拟手机充值案例程序实现代码
  13. 笔记本linux如何降低功耗,细说如何降低笔记本电脑功耗
  14. 白话数字签名(2)——软件设备
  15. java 合并两个List并去掉重复项
  16. 段码屏中液晶相与相变的含义?
  17. 云诊所管理系统 云诊所管理软件 诊所管理软件 诊所管理系统
  18. LindedList相关介绍
  19. centos7安装PostgresSQL14+PostGIS3.2记录
  20. 关于跨线程操作GUI线程控件的疑问

热门文章

  1. matlab stats里的f值,MATLAB 回归分析regress,nlinfit,stepwise函数
  2. 看房一次就租下的90后,大概都喜欢Q房网
  3. 数据库关系代数练习题
  4. Java程序性能优化 !
  5. mysql数据库备份与恢复命令
  6. HTTP请求的过程与TCP连接的过程
  7. E22 LoRa模块透传 定点传输 WOR模式测试与MicroPython应用
  8. Ubuntu 20.04 boot repair(镜像引导目录修复)
  9. 计算机上画正比例函数,信息技术应用 用计算机画函数图象教案1
  10. php无版权图库api,哪里有无版权php源码