求解TSP问题神器——elkai(简单好用)
elkai是python的第三方库,专门用于解决TSP问题,目前已知能够在规模达到315个节点的问题中求解出最优方案。elkai本身的实现基于大名鼎鼎的LKH算法,该算法被认为是目前解决TSP问题最有效的算法之一。
elkai的调用过程很简单,只需要构建好并传入各节点的距离矩阵,就能返回最优解决方案
下载方式:
cmd中输入:pip install elkai
本文利用规模为101个点的TSP问题做例子进行介绍
点的数据如下:
id | x_coord | y_coord |
1 | 40 | 50 |
2 | 25 | 85 |
…… | …… | …… |
101 | 31 | 67 |
各点示意图如下:
编写函数计算各点间的距离矩阵:
# 计算距离矩阵,此处用坐标直接计算距离,实际交通规划中可能会有现成的距离矩阵def genDistanceMat(x, y):X = np.array([x, y])distMat = ssp.distance.pdist(X.T)distMat = ssp.distance.squareform(distMat)return distMat
编写函数计算整个路线的总长度:
# 计算所得方案的线路总长度def cal_fitness(sol):tot_len = np.sum(distance[sol[:-1], sol[1:len(sol)]])return tot_len
主程序如下:
def main(city_condition):# 计算距离矩阵,此处用坐标直接计算最短距离,实际交通规划中可能会有现成的最短距离矩阵def genDistanceMat(x, y):X = np.array([x, y])distMat = ssp.distance.pdist(X.T)distMat = ssp.distance.squareform(distMat)return distMatx, y = city_condition[:, 0], city_condition[:, 1]distance = genDistanceMat(x, y)# 计算所得方案的线路总长度def cal_fitness(sol):tot_len = np.sum(distance[sol[:-1], sol[1:len(sol)]])return tot_lensol = elkai.solve_int_matrix(distance)# sol = elkai.solve_float_matrix(distance,runs=10)#允许浮点距离sol.append(0)'''这个函数计算出的是有回路的TSP问题,但返回的解方案sol没有给出完整解方案(少一个终点0),故我们在代码中在解方案最末尾加上了编号0'''print("最优解方案:", sol)print("最优解总长度:", cal_fitness(sol))return sol,cal_fitness(sol)
主程序输入城市的x,y坐标,输出即为TSP问题的解方案和总长度,输入无误则可直接跑,使用十分方便。调用elkai解TSP不仅能够得到非常好的解方案,同样用时也很少(其中一个原因是该库用的C语言编译封装实现的)。
求解结果如下图:
所有程序代码:
'利用elkai求解TSP问题'
'2022.6.22 北京交通大学 韬会'import numpy as np
import elkai
import math
import matplotlib.pyplot as plt
import scipy as sp
import scipy.spatial as ssp
import pandas as pddata = pd.read_excel('cvrp.xlsx')
num_node = len(data.id)
loc=[[data.x_coord[i],data.y_coord[i]] for i in range(num_node)]
loc=np.array(loc)
print(loc)
x,y = loc[:,0],loc[:,1]
plt.scatter(list(x),list(y))def main(city_condition):# 计算距离矩阵,此处用坐标直接计算最短距离,实际交通规划中可能会有现成的最短距离矩阵def genDistanceMat(x, y):X = np.array([x, y])distMat = ssp.distance.pdist(X.T)distMat = ssp.distance.squareform(distMat)return distMatx, y = city_condition[:, 0], city_condition[:, 1]distance = genDistanceMat(x, y)# 计算所得方案的线路总长度def cal_fitness(sol):tot_len = np.sum(distance[sol[:-1], sol[1:len(sol)]])return tot_lensol = elkai.solve_int_matrix(distance)# sol = elkai.solve_float_matrix(distance,runs=10)#允许浮点距离sol.append(0)'''这个函数计算出的是有回路的TSP问题,但返回的解方案sol没有给出完整解方案(少一个终点0),故在解方案最末尾加上了编号0'''print("最优解方案:", sol)print("最优解总长度:", cal_fitness(sol))return sol,cal_fitness(sol)sol,lenth=main(loc)# 绘图部分
plt.scatter(x,y)
for i in range(len(x)):plt.annotate(sol[i], xy = (x[i], y[i]), xytext = (x[i]+0.3, y[i]+0.3)) # 这里xy是需要标记的坐标,xytext是对应的标签坐标
plt.plot(x,y)
plt.show()
参考文献:
https://mp.weixin.qq.com/s/BWJV_-mtmBK0_Tn4Kznapw
求解TSP问题神器——elkai(简单好用)相关推荐
- 基于贪心算法求解TSP问题(JAVA)
前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.demod ...
- tsp java_基于贪心算法求解TSP问题(JAVA)
前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TPS问题 TSP问题(Travelling ...
- 【运筹优化】Python调用OR-Tools求解TSP问题
文章目录 一.安装or-tools 二.旅行商问题简介 三.调用or-tools求解TSP问题 1.引入相关包 2.定义数据Model 3.创建路由模型 4.创建距离回调 5.设置旅行费用 6.设置搜 ...
- 局部搜索、模拟退火和遗传算法求解TSP问题
模拟退火和遗传算法求解TSP问题 源代码传送门:GITHUB 数据传送门:TSPLIB 文章目录 模拟退火和遗传算法求解TSP问题 摘要 1 导言 1.1 问题重述 1.2 TSP问题选择 1.3 思 ...
- 基于遗传算法求解TSP问题(旅游路径规划,Python实现,超详细,可视化,结果分析)
ps:作者是很用心写的,如果觉得不错,请给作者一点鼓励噢!(点赞收藏评论噢) 基于遗传算法求解TSP问题 摘要 巡回旅行商问题(TSP)是组合优化中的经典问题.常见的TSP问题求解算法例如穷举法.贪心 ...
- 求解TSP的改进模拟退火算法研究
文章目录 一.理论基础 1.传统模拟退火算法 (1)模拟退火算法基本原理 (2)模拟退火算法模型流程 <1> 编码方式 <2> 目标函数 <3> 冷却进度表 < ...
- matlab 动态邻域粒子群,求解TSP问题的动态邻域粒子群优化算法
1引言粒子群优化(ParticleSwarmOptimization,PSO)算法于1995年由Eberhart博士和Kennedy博士提出,它是一类新兴的基于群智能优化算法[1],同其它的进化算法相 ...
- 粒子群算法java_基于粒子群算法求解求解TSP问题(JAVA)
一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...
- 用动态规划法求解TSP问题
一.求解TSP问题 1.问题描述 TSP问题(担货郎问题,旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短 各个城市间的距离可以用代价矩阵来表示 ...
最新文章
- SqlServer按照指定顺序对字段进行排序
- Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
- java 在线电影_java电影在线影评管理系统
- Mocha and Hiking 模拟
- C++,Java编程空指针的一个小细节
- tensorflow--forword(前向传播)
- 中科大计算机竞赛夺冠,中科大斩获全国唯一特等奖,力压清华捧得华为毕昇杯...
- MATLAB三维散点图的绘制(scatter3、plot3)
- 割裂的前端工程师--- 2017年前端生态窥探
- 深度学习之语义分割(SegNet)
- 如何学计算机课程,零基础应该如何学习电脑知识
- [CF505E] Mr.Kitayutavs.Bamboos
- 关于微信小程序的开发
- 一个男朋友写给女朋友的信!爆笑(真勇敢)
- 《北京DRGs系统的研究与应用》学习笔记
- 服务器连接数据库mysql
- Spring Boot缓存实战 默认Cache(ConcurrentMapCacheManager)
- 内蒙古联通云计算机,中国联通西北(呼和浩特)云计算基地
- uva12627 Erratic Expansion
- 黑马程序员 日记(七)