旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

  1. #!/user/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. # TSP旅行商问题:若干个城市,任意两个城市之间距离确定,要求一旅行商从某城市
  5. # 出发必须经过每一个城市且只能在每个城市逗留一次,最后回到原出发城市,试
  6. # 确定一条最短路径使旅行费用最少
  7.  
  8. # 遍历算法
  9.  
  10. # 给定某条路径,计算它的成本
  11. def distcal(path, dist):
  12. # 计算路径成本(路径,距离)
  13. sum_dist = 0 # 总成本
  14. for j in range(0, len(path) - 1):
  15. di = dist[int(path[j]) - 1][int(path[j + 1]) - 1] # 查找第j和j+1个城市之间的成本
  16. sum_dist = sum_dist + di # 累加
  17. di = dist[int(path[len(path) - 1]) - 1][path[0] - 1] # 最后一个城市回到初始城市的成本
  18. sum_dist = sum_dist + di
  19. return sum_dist # 返回路径的成本
  20.  
  21. # 递归,构造所有可能路径
  22. def perm(l): # 构造路径(城市列表)
  23. if (len(l)) <= 1: # 只有一个城市,选择这个城市
  24. return [l]
  25. r = [] # 空列表
  26. for i in range(len(l)): # 对每个城市,构建不包括这个城市的所有可能序列
  27. s = l[:i] + l[i + 1:] # 去除当前城市的列表
  28. p = perm(s) # 调用自身,构造不包含这个城市的序列
  29. for x in p:
  30. r.append(l[i:i + 1] + x) # 将序列和该城市合并,得到完整的序列
  31. return r
  32.  
  33. if __name__ == '__main__':
  34. city = [1, 2, 3, 4, 5]
  35.  
  36. dist = ((0, 1, 3, 4, 5),
  37. (1, 0, 1, 2, 3),
  38. (3, 1, 0, 1, 2),
  39. (4, 2, 1, 0, 1),
  40. (5, 3, 2, 1, 0))
  41.  
  42. for i in range(0, 5):
  43. print(dist[i][:])
  44.  
  45. print('=============')
  46.  
  47. allpath = perm(city) # 调用路径产生函数,产生所有可能的路径
  48.  
  49. optimal = 1000000 # 初始化最优路径的总成本和索引号
  50.  
  51. index = 1
  52.  
  53. for i in range(0, len(allpath)):
  54. pd = distcal(allpath[i], dist)
  55. if pd < optimal: # 比较是否总成本更低,如果是替换最优解
  56. optimal = pd
  57. index = i
  58. # print(pd)
  59.  
  60. print(optimal)
  61. print(allpath[index])
  62. ------------------------------------------------------------------------
  63. (0, 1, 3, 4, 5)
  64. (1, 0, 1, 2, 3)
  65. (3, 1, 0, 1, 2)
  66. (4, 2, 1, 0, 1)
  67. (5, 3, 2, 1, 0)
  68. =============
  69. 9
  70. [1, 2, 3, 4, 5]

遍历算法

  1. #!/user/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import random
  5.  
  6. # 给定某条路径,计算它的成本
  7. def distcal(path, dist):
  8. # 计算路径成本(路径,距离)
  9. sum_dist = 0 # 总成本
  10. for j in range(0, len(path) - 1):
  11. di = dist[int(path[j]) - 1][int(path[j + 1]) - 1] # 查找第j和j+1个城市之间的成本
  12. sum_dist = sum_dist + di # 累加
  13. di = dist[int(path[len(path) - 1]) - 1][path[0] - 1] # 最后一个城市回到初始城市的成本
  14. sum_dist = sum_dist + di
  15. return sum_dist # 返回路径的成本
  16.  
  17. # 构造随机路径
  18. def randompath(inc): # Inc城市列表
  19. allcity = inc[:] # 城市列表
  20. path = [] # 路径
  21. loop = True
  22. while loop:
  23. if 1 == len(allcity): # 如果是最后一个城市
  24. tmp = random.choice(allcity)
  25. path.append(tmp)
  26. loop = False # 结束
  27. else: # 如果不是最后一个城市
  28. tmp = random.choice(allcity) # 在城市列表中随机选择一个城市
  29. path.append(tmp) # 添加路径
  30. allcity.remove(tmp) # 在城市列表中移除该城市
  31. return path
  32.  
  33. if __name__ == '__main__':
  34. city = [1, 2, 3, 4, 5]
  35.  
  36. dist = ((0, 1, 3, 4, 5),
  37. (1, 0, 1, 2, 3),
  38. (3, 1, 0, 1, 2),
  39. (4, 2, 1, 0, 1),
  40. (5, 3, 2, 1, 0))
  41.  
  42. for i in range(0, 5):
  43. print(dist[i][:])
  44.  
  45. print('=============')
  46.  
  47. num = 10 # 随机产生10条路径
  48.  
  49. optimal = 1000000 # 初始化最优路径的总成本和索引号
  50.  
  51. for i in range(0, num):
  52. pd = distcal(randompath(city), dist)
  53. if pd < optimal: # 比较是否总成本更低,如果是替换最优解
  54. optimal = pd
  55. print(pd)
  56.  
  57. print(optimal)
  58. ------------------------------------------------------------
  59. (0, 1, 3, 4, 5)
  60. (1, 0, 1, 2, 3)
  61. (3, 1, 0, 1, 2)
  62. (4, 2, 1, 0, 1)
  63. (5, 3, 2, 1, 0)
  64. =============
  65. 9
  66. 12
  67. 11
  68. 14
  69. 12
  70. 11
  71. 14
  72. 9
  73. 14
  74. 9
  75. 最优: 9

随机算法

tsp问题-遍历算法/随机算法的更多相关文章

  1. random array & shuffle 洗牌算法 / 随机算法

    random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...

  2. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  3. 权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  4. python的random模块及加权随机算法的python实现

    random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. ...

  5. ACO 蚁群算法(算法流程,TSP例子解析)

    算法 计算机 超级计算 高性能 科学探索 1. 算法背景——蚁群的自组织行为特征 高度结构化的组织——虽然蚂蚁的个体行为极其简单,但由个体组成的蚁群却构成高度结构化的社会组织,蚂蚁社会的成员有分工,有 ...

  6. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...

  7. 微信红包中使用的技术:AA收款+随机算法

    除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...

  8. POJ 3318 Matrix Multiplication(随机算法)

    题目链接 随机算法使劲水...srand((unsigned)time(0))比srand(NULL)靠谱很多,可能是更加随机. #include <cstdio> #include &l ...

  9. 抽奖随机算法的技术探讨与C#实现

    一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...

随机推荐

  1. (CVE-2017-7269 ) IIS6.0实现远程控制

    简介 IIS 6.0默认不开启WebDAV,一旦开启了WebDAV,安装了IIS6.0的服务器将可能受到该漏洞的威胁 利用条件 Windows 2003 R2开启WebDAV服务的IIS6.0 环境搭 ...

  2. 轮播图CSS

    css3中的animation:动画名 持续时间 动画的速度曲线 动画开始之前的延迟 动画播放的次数 是否应该轮流反向播放动画 动画播放次数:n(定义应该播放多少次动画) : infinite(无限循 ...

  3. Python 日志文件处理

    今天想把 Python 项目中的日志 保存到文件中. 找到了方法.非常简单 https://www.cnblogs.com/nancyzhu/p/8551506.html 1. logging.bas ...

  4. 《ucore lab1 exercise1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...

  5. final关键字、多态 (札记)

    目录 protected fianl 子父类中同名的 private 方法 java中的前期绑定 免疫多态 谁先被执行,构造器 还是 初始化? 协变返回类型 <Thinking in java& ...

  6. Can you answer these queries III

    Can you answer these queries III 题目:洛谷 SPOJ [题目描述] 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“0 x y”,把A[x]改 ...

  7. 20191030-Python实现闭包

    打算在过年前每天总结一个知识点,所以把自己总结的知识点分享出来,中间参考了网络上很多大神的总结,但是发布时候因为时间太久可能没有找到原文链接,如果侵权请联系我删除 20191030:闭包 首先一个函数 ...

  8. Python之对象持久化笔记

    pickle 序列化为字符串 .dumps(obj): 将对象序列为字符串 .loads(s): 从字符串反序列化对象 例如 import pickle person = {'name': 'Tom' ...

  9. ASP.NET Core分布式项目-2.oauth密码模式identity server4实现

    源码下载 这里根据<ASP.NET Core分布式项目-1.IdentityServer4登录中心>的代码来继续更新oauth密码模式,这里的密码模式比上次的客户端模式更安全 在WebAp ...

  10. 如何知道外围器件的器件地址PHY_ADDR

    由于 S5P6818 现有的uboot没有网卡的初始化代码实现,在尝试移植网卡驱动而跟踪有关的源码的时候,不止一次地看到了类似下面的需要修改器件地址的有关写法. 根据原理图的有关硬件连接,找到对应的元 ...