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(简单好用)相关推荐

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

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

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

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

  3. 【运筹优化】Python调用OR-Tools求解TSP问题

    文章目录 一.安装or-tools 二.旅行商问题简介 三.调用or-tools求解TSP问题 1.引入相关包 2.定义数据Model 3.创建路由模型 4.创建距离回调 5.设置旅行费用 6.设置搜 ...

  4. 局部搜索、模拟退火和遗传算法求解TSP问题

    模拟退火和遗传算法求解TSP问题 源代码传送门:GITHUB 数据传送门:TSPLIB 文章目录 模拟退火和遗传算法求解TSP问题 摘要 1 导言 1.1 问题重述 1.2 TSP问题选择 1.3 思 ...

  5. 基于遗传算法求解TSP问题(旅游路径规划,Python实现,超详细,可视化,结果分析)

    ps:作者是很用心写的,如果觉得不错,请给作者一点鼓励噢!(点赞收藏评论噢) 基于遗传算法求解TSP问题 摘要 巡回旅行商问题(TSP)是组合优化中的经典问题.常见的TSP问题求解算法例如穷举法.贪心 ...

  6. 求解TSP的改进模拟退火算法研究

    文章目录 一.理论基础 1.传统模拟退火算法 (1)模拟退火算法基本原理 (2)模拟退火算法模型流程 <1> 编码方式 <2> 目标函数 <3> 冷却进度表 < ...

  7. matlab 动态邻域粒子群,求解TSP问题的动态邻域粒子群优化算法

    1引言粒子群优化(ParticleSwarmOptimization,PSO)算法于1995年由Eberhart博士和Kennedy博士提出,它是一类新兴的基于群智能优化算法[1],同其它的进化算法相 ...

  8. 粒子群算法java_基于粒子群算法求解求解TSP问题(JAVA)

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

  9. 用动态规划法求解TSP问题

    一.求解TSP问题 1.问题描述 TSP问题(担货郎问题,旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短 各个城市间的距离可以用代价矩阵来表示 ...

最新文章

  1. SqlServer按照指定顺序对字段进行排序
  2. Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
  3. java 在线电影_java电影在线影评管理系统
  4. Mocha and Hiking 模拟
  5. C++,Java编程空指针的一个小细节
  6. tensorflow--forword(前向传播)
  7. 中科大计算机竞赛夺冠,中科大斩获全国唯一特等奖,力压清华捧得华为毕昇杯...
  8. MATLAB三维散点图的绘制(scatter3、plot3)
  9. 割裂的前端工程师--- 2017年前端生态窥探
  10. 深度学习之语义分割(SegNet)
  11. 如何学计算机课程,零基础应该如何学习电脑知识
  12. [CF505E] Mr.Kitayutavs.Bamboos
  13. 关于微信小程序的开发
  14. 一个男朋友写给女朋友的信!爆笑(真勇敢)
  15. 《北京DRGs系统的研究与应用》学习笔记
  16. 服务器连接数据库mysql
  17. Spring Boot缓存实战 默认Cache(ConcurrentMapCacheManager)
  18. 内蒙古联通云计算机,中国联通西北(呼和浩特)云计算基地
  19. uva12627 Erratic Expansion
  20. 黑马程序员 日记(七)

热门文章

  1. 学生论坛管理系统的设计与实现
  2. 入门 Teams Toolkit
  3. ROS 多机器人导航salm中的问题
  4. oracle创建索引指定用户,循序渐进学Oracle之索引、权限、角色
  5. php编程里的push,【编程词典】php array_push()函数
  6. 键盘的基本使用(包含各种快捷键的使用)
  7. ManualResetEvent,AutoResetEvent 学习
  8. 毕业论文中的“自动生成目录”设置(经验四)
  9. cxfreeze 打包exe
  10. 控制window系统应用程序定时关闭和开启