import math
from os import path
import numpy as np
import matplotlib.pyplot as pltclass TSPInstance:'''设计一个类,实现从文件读入一个旅行商问题的实例文件格式为:city numberbest known tour lengthlist of city position (index x y)best known tour (city index starts from 1)以文件01eil51.txt为例:第一行51为城市数第二行426为最优解的路径长度第三行开始的51行为各个城市的序号、x坐标和y坐标最后是最优解的访问城市系列(注意里面城市序号从1开始,而python的sequence是从0开始)Eil51Tour.png是最优解的城市访问顺序图'''def __init__(self, file_name):'''从文件file_name读入旅行商问题的数据'''self.file_name=file_namea= open(file_name)# 城市数量self.city_num = a.readline()# 返回坐标 51行,3列self.city = np.zeros((int(self.city_num), 3))# x坐标self.x = np.zeros(int(self.city_num))# y坐标self.y = np.zeros(int(self.city_num))# 城市IDself.id = np.zeros(int(self.city_num))b = a.readlines()for i, content in enumerate(b):if i in range(1, 52 ):# 单行赋值self.city[i-1] = content.strip('\n').split(' ')self.x[i-1] = self.city[i-1][1]self.y[i-1] = self.city[i-1][2]for i, content in enumerate(b):if i in range(53, 104):self.id[i - 53] = content.strip('\n')@propertydef citynum(self):'''返回城市数'''return self.city_num@propertydef optimalval(self):'''返回最优路径长度'''c = 0i = 1s = open(self.file_name)str = s.readlines()for content in str:if i == 2:c = contenti = i + 1return c@propertydef optimaltour(self):'''返回最优路径'''tour = np.array(self.id)return tourdef __getitem__(self, n):'''返回城市n的坐标,由x和y构成的tuple:(x,y)'''(x, y) = (self.x[n-1], self.y[n-1])return (x, y)def get_distance(self, n, m):'''返回城市n、m间的整数距离(四舍五入)'''u=int(self.x[n-1] - self.x[m-1])v=int(self.y[n-1] - self.y[m-1])dis = math.sqrt(pow(u,2) + pow(v,2))return int(dis+0.5)def evaluate(self, tour):'''返回访问系列tour所对应的路径程度'''dis = 0for i in range(50):dis += self.get_distance(int(tour[i]), int(tour[i + 1]))dis += self.get_distance(int(tour[50]), int(tour[0]))return disdef plot_tour(self, tour):'''画出访问系列tour所对应的路径路'''for i in range(51):x0,y0 = self.__getitem__(i)plt.scatter(int(x0),int(y0),s=10,c='c')#记住坐标点的画法for i in range(len(tour)-1):x1,y1 = self.__getitem__(int(tour[i]))x,y = self.__getitem__(int(tour[i+1]))plt.plot([x1,x],[y1,y],c='b')x2,y2 = self.__getitem__(int(tour[0]))x3,y3 = self.__getitem__(int(tour[len(tour)-1]))plt.plot([x2,x3],[y2,y3],c='b')plt.xlabel('x label')plt.ylabel('y label')plt.title("City access sequence diagram")plt.plot()plt.show()if __name__ == "__main__":file_name = path.dirname(__file__) + "/1.txt"instance = TSPInstance(file_name)print(instance.citynum)print(instance.evaluate(instance.optimaltour))print(instance.optimaltour)print(instance.__getitem__(2))print(instance.get_distance(0, 1))instance.plot_tour(instance.optimaltour)'''output:51426[  1.  22.   8.  26.  31.  28.   3.  36.  35.  20.   2.  29.  21.  16.  50.34.  30.   9.  49.  10.  39.  33.  45.  15.  44.  42.  40.  19.  41.  13.25.  14.  24.  43.   7.  23.  48.   6.  27.  51.  46.  12.  47.  18.   4.17.  37.   5.  38.  11.  32.](49.0, 49.0)14  '''

其实解决TSP问题有很多方法,比如模拟退火算法,贪心算法,回溯算法等等。希望各位博友可以把你们的解决方法出现在评论区。

用python来编写TSP问题相关推荐

  1. python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库

    python如何编写数据库 MySQL, PostgreSQL, Oracle, Redis, and many more, you just name it - databases are a re ...

  2. Python代码编写过程中有哪些重要技巧?

    近几年,转行做Python技术岗的人越来越多,大家对于Python的关注越来越高,尤其是工作后,很多人都想知道Python代码编写过程中有哪些重要技巧?小编告诉大家,在编写Python代码过程中,除了 ...

  3. anaconda 升级jupyter notebook_搭建 Python 轻量级编写环境(WSL2+Jupyter 自动开启本地浏览器)

    Windows 下的 Python 环境经常会给人带来一系列的困扰,如,时隐时现的各种因为环境变量导致的奇怪报错,Conda 库更新不到最新的版本,还有诸如 xgboost 等库压根儿就不提供 Win ...

  4. python中编写函数素数_如何用Python编写素数程序?

    成为一个认证的专业素数是一个大于1的自然数,它没有除1以外的任何除数.你可以用Python编写一个代码来帮助你找到所有的素数.在本文中,我们将按照以下顺序在Python中编写一个素数程序:什么是素数? ...

  5. python开发安卓程序-python可以编写android程序吗?

    python可以编写android程序吗?答案是肯定的.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid.CLE以及Wrapandroid ...

  6. python是用c写的吗-Python是编写人工智能最佳的编程语言吗?

    2017年浙江省教育局对其信息技术课程进行了改革,将原Visual Basic语言从教材中移除,更换为Python语言教学内容,甚至还将Python语言纳入了浙江省信息技术高考内容. 或许知道的人并不 ...

  7. 记事本写python怎么运行-从头学Python之编写可执行的.py文件

    Python可是真强大.但他具体是怎么强大的,让我们一点一点来了解吧(小编每天晚上下班回家会抽时间看看教程,多充实下自己也是好的). 废话不多说,就讲一下这个背景吧: 事情是这个样子的~本着好学的精神 ...

  8. Python 内编写类的各种技巧和方法

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

  9. linux python开发环境sql数据迁移到mysql_运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库...

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 一.实验环境: Python2.7.10.pycharm.VM虚拟机.CentOS6.3.mys ...

最新文章

  1. SQL中返回一个字符串在另一个中存在的次数
  2. 神策数据面向互联网金融企业提供行业解决方案
  3. Linux虚拟机安装及与宿主机相互通信
  4. GateOne Web SSH 环境搭建
  5. 趣谈设计模式 | 单例模式(Singleton) :独一无二的对象
  6. 轩逸车联网功能怎么用_手机上面的NFC功能怎么用的
  7. SQL之 UNION ALL 和UNION
  8. MemoryInjector 无痕注入
  9. python语言的单行注释以井号开头_python-注释
  10. 使用displsy:flex + overflow:hidden时子元素被压缩
  11. easyui的datebox控件如何只要年月不要日谢谢知道的说一下
  12. 数据库提示日志文件不可用
  13. 总结G1垃圾收集器面试题
  14. 基于stc15f2k60s2芯片单片机编程(按键的长短按)
  15. rtl8821cs wifi驱动调试 imx6
  16. PySide2将控制台内容打印到textEdit控件
  17. 安装新版的winetricks_20170506-最新WineQQ8.9.1安装教程和常见问题解决方法
  18. 小团队管理核心(一)
  19. PLC无线通讯方案详解GRM110
  20. 基础数学(八)——期末考试复习

热门文章

  1. nodejs中解决发出响应数据正常但是浏览器没有正确显示的问题
  2. 【C#】CurrentCulture和CurrentUICulture的区别及winform多语言版本设置
  3. oracle监控pga,oracle pga使用情况常用脚本:
  4. OpenCV 数组存储图片像素值,便于后期图像处理
  5. Android相机开发和遇到的坑
  6. 数字图像处理实验目录
  7. 我的Hadoop安装流程
  8. 【叔小生】JavaScript进阶篇
  9. 如何检测时间序列中的异方差(Heteroskedasticity)
  10. C语言试题十之将两个两位数的正整数a b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c的十位和千位上,b数的十位和个位数依次放在c数的个位和百位上。