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

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问题

记录学习过程,欢迎指正

求解旅行商问题 (Traveling Salesman Problem, TSP) 的启发式算法有以下几种常见的方法: 1. 最邻近插入法(Nearest Neighbor Insertion):从一个起始节点开始,每次选择距离最近的未访问节点作为下一步的目标节点,直到所有节点都被访问为止。这种方法简单易实现,但可能导致得到的解偏离最优解。 2. 最近插入法(Cheapest Insertion):从一个起始节点开始,每次选择一个距离最短的边,并将新节点插入到该边上的合适位置,重复此过程直到所有节点都被访问。这种方法能够得到较优的解,但仍有可能偏离最优解。 3. 2-Opt和3-Opt算法:这两种算法通过不断优化当前解来逼近最优解。2-Opt算法每次选择两条边交换位置,如果得到的新解更优,则接受交换;3-Opt算法则在2-Opt的基础上进一步增加一条边的交换。这些算法通过局部搜索的方式改进当前解,但需要较长的计算时间。 4. 遗传算法(Genetic Algorithm, GA):通过模拟生物的进化过程来寻找最优解。在遗传算法中,每个解是一个染色体的表达形式,通过交叉、变异等操作产生新的解,并根据适应度评估选择下一代解。遗传算法具有全局搜索的能力,但也比较耗时。 5. 蚁群算法(Ant Colony Optimization, ACO):通过模拟蚂蚁寻找食物的行为来求解TSP。蚂蚁在搜索路径时按照信息素浓度选择下一个节点,并在路径上释放信息素。信息素浓度和路径长度成反比,越短的路径上的信息素浓度越高。蚁群算法能够并行搜索多个解,并且借助信息素的更新可以趋近于最优解。 以上是求解TSP问题常见启发式算法,每种算法都有其特点和适用场景,选择合适的算法求解TSP需要考虑问题规模、求解时间和解的质量等因素。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值