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

 #!/user/bin/env python
# -*- coding:utf-8 -*- # TSP旅行商问题:若干个城市,任意两个城市之间距离确定,要求一旅行商从某城市
# 出发必须经过每一个城市且只能在每个城市逗留一次,最后回到原出发城市,试
# 确定一条最短路径使旅行费用最少 # 遍历算法 # 给定某条路径,计算它的成本
def distcal(path, dist):
# 计算路径成本(路径,距离)
sum_dist = 0 # 总成本
for j in range(0, len(path) - 1):
di = dist[int(path[j]) - 1][int(path[j + 1]) - 1] # 查找第j和j+1个城市之间的成本
sum_dist = sum_dist + di # 累加
di = dist[int(path[len(path) - 1]) - 1][path[0] - 1] # 最后一个城市回到初始城市的成本
sum_dist = sum_dist + di
return sum_dist # 返回路径的成本 # 递归,构造所有可能路径
def perm(l): # 构造路径(城市列表)
if (len(l)) <= 1: # 只有一个城市,选择这个城市
return [l]
r = [] # 空列表
for i in range(len(l)): # 对每个城市,构建不包括这个城市的所有可能序列
s = l[:i] + l[i + 1:] # 去除当前城市的列表
p = perm(s) # 调用自身,构造不包含这个城市的序列
for x in p:
r.append(l[i:i + 1] + x) # 将序列和该城市合并,得到完整的序列
return r if __name__ == '__main__':
city = [1, 2, 3, 4, 5] dist = ((0, 1, 3, 4, 5),
(1, 0, 1, 2, 3),
(3, 1, 0, 1, 2),
(4, 2, 1, 0, 1),
(5, 3, 2, 1, 0)) for i in range(0, 5):
print(dist[i][:]) print('=============') allpath = perm(city) # 调用路径产生函数,产生所有可能的路径 optimal = 1000000 # 初始化最优路径的总成本和索引号 index = 1 for i in range(0, len(allpath)):
pd = distcal(allpath[i], dist)
if pd < optimal: # 比较是否总成本更低,如果是替换最优解
optimal = pd
index = i
# print(pd) print(optimal)
print(allpath[index])
------------------------------------------------------------------------
(0, 1, 3, 4, 5)
(1, 0, 1, 2, 3)
(3, 1, 0, 1, 2)
(4, 2, 1, 0, 1)
(5, 3, 2, 1, 0)
=============
9
[1, 2, 3, 4, 5]

遍历算法

 #!/user/bin/env python
# -*- coding:utf-8 -*- import random # 给定某条路径,计算它的成本
def distcal(path, dist):
# 计算路径成本(路径,距离)
sum_dist = 0 # 总成本
for j in range(0, len(path) - 1):
di = dist[int(path[j]) - 1][int(path[j + 1]) - 1] # 查找第j和j+1个城市之间的成本
sum_dist = sum_dist + di # 累加
di = dist[int(path[len(path) - 1]) - 1][path[0] - 1] # 最后一个城市回到初始城市的成本
sum_dist = sum_dist + di
return sum_dist # 返回路径的成本 # 构造随机路径
def randompath(inc): # Inc城市列表
allcity = inc[:] # 城市列表
path = [] # 路径
loop = True
while loop:
if 1 == len(allcity): # 如果是最后一个城市
tmp = random.choice(allcity)
path.append(tmp)
loop = False # 结束
else: # 如果不是最后一个城市
tmp = random.choice(allcity) # 在城市列表中随机选择一个城市
path.append(tmp) # 添加路径
allcity.remove(tmp) # 在城市列表中移除该城市
return path if __name__ == '__main__':
city = [1, 2, 3, 4, 5] dist = ((0, 1, 3, 4, 5),
(1, 0, 1, 2, 3),
(3, 1, 0, 1, 2),
(4, 2, 1, 0, 1),
(5, 3, 2, 1, 0)) for i in range(0, 5):
print(dist[i][:]) print('=============') num = 10 # 随机产生10条路径 optimal = 1000000 # 初始化最优路径的总成本和索引号 for i in range(0, num):
pd = distcal(randompath(city), dist)
if pd < optimal: # 比较是否总成本更低,如果是替换最优解
optimal = pd
print(pd) print(optimal)
------------------------------------------------------------
(0, 1, 3, 4, 5)
(1, 0, 1, 2, 3)
(3, 1, 0, 1, 2)
(4, 2, 1, 0, 1)
(5, 3, 2, 1, 0)
=============
9
12
11
14
12
11
14
9
14
9
最优: 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. 从源码角度解析Netty的React模式是如何工作的

    Netty 支持多种实现方式,比如nio,epoll 等,本文以nio的实现方式进行讲解. 1.EventLoop : 事件循环看,简单来说就是一个死循环监听事件,如果事件来了,处理掉.通常做法就是开 ...

  2. tomcat 是如何做到不同webapp 类隔离的

    这个问题的核心是classloader 上图中 启动类加载器,扩展类加载器,应用程序类加载器是 jvm 自带的类加载器. comm  catalina  shared webapp 是tomcat 扩 ...

  3. MOQ中CallBase的作用

    当使用Moq来Mock一个具体的类,类里的方法为virtual时,Moq会将当前类,所有的virtual方法默认重写成空实现. 如果我们想要访问真实的代码,有两种方法 1.在创建Mock时,设置Cal ...

  4. nginx目录学习

    目录 一. Nginx 基础知识 二. Nginx 安装及调试 三. Nginx Rewrite 四. Nginx Redirect 五. Nginx 目录自动加斜线: 六. Nginx Locati ...

  5. iOS-AES算法总结

    AESCipher.h #import <Foundation/Foundation.h> @interface AESCipher : NSObject /** 加密算法 @param ...

  6. 通过 Spring Session 实现新一代的 Session 管理

    长期以来,session 管理就是企业级 Java 中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原 ...

  7. StarUML3.1.0版(2019.3.6)生成Java代码

    下载官网 StarUML3.1.0(2019.3.6) 步骤 打开StarUML: 点击菜单栏的Tools: 列表中如果有Java,说明已经有这个生成Java代码的扩展了: 列表里如果没有Java: ...

  8. 选择排序——C语言

    选择排序 1.算法描述 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕(放 ...

  9. S03_CH11_基于TCP的QSPI Flash bin文件网络烧写

    S03_CH11_基于TCP的QSPI Flash bin文件网络烧写 11.1概述 针对ZYNQ中使用QSPI BOOT的应用,将BOOT.bin文件烧写至QSPI Flash基本都是通过USB C ...

  10. 深度剖析Kubernetes API Server三部曲 - part 2

    欢迎来到深入学习Kubernetes API Server的系列文章的第二部分.在上一部分中我们对APIserver总体,相关术语及request请求流进行探讨说明.在本部分文章中,我们主要聚焦于探究 ...