旅行商算法

有一位旅行商,我们暂且称呼他为彪哥。

他需要前往5个城市,所以想要计算出旅程最短的路线。

对于每种路线组合,他都计算出总旅程,再挑选旅程最短的路线。

那么,算法效率的问题来了。

5个城市有120个不同的排列方式,因此需要执行120次操作。

6个城市有720个不同的排列方式,因此需要执行720次操作。

7个城市有5040个不同的排列方式,因此需要执行5040次操作。

20城市有2432902008176640000个不同的排列方式,因此需要执行2432902008176640000次操作。

综上所述,涉及n个城市时,需要执行n!(n的阶乘)次操作才能计算出结果。

阶乘的计算公式: n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

对于这个问题,有很多学者认为根本没有更好的算法来代替它。

小伙伴们怎么认为呢?你有更好的算法吗?

原文地址:https://www.cnblogs.com/zeussbook/p/11129728.html

时间: 2024-10-07 11:35:46

旅行商算法的相关文章

18.03.09 vijos1014旅行商简化版

背景 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家.计算机学家的著名问题.现有的算法都没有办法在确定型机器上在多项式时间内求出最优解,但是有办法在多项式时间内求出一个较优解. 为了简化问题,而且保证能在多项式时间内求出最优解,J.L.Bentley提出了一种叫做bitonic tour的哈密尔顿环游.它的要求是任意两点(a,b)之间的相互到达的代价dist(a,b)=dist(b,a)且任意两点之间可以相互到达,并且环游的路

TSP 旅行商

THUOJ 数据结构(上)TSP 旅行商 点击查看题目:TSP旅行商 实现思路 建立邻接表 每读入一条边u->v,将其插入u中(后面将实现的tspNode中的边,是以其为出发点的边),并将v的入度+1 拓扑排序过程中计算最长道路经过的村庄数 算法:零入度拓扑排序,p166 of 数据结构(c++语言版)_邓俊辉 扫描所有节点,入度为0的入栈 从栈顶开始,每读一个节点a,扫描其边,相连节点b入度-1,ind变为0的入栈: 更新b'路径长度=max(a's+1,b'):更新max路径: 边界情况处理

旅行商(n<15)

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=420 #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <ma

hdoj 3001 Travelling 【3进制+旅行商】

题目:hdoj 3001 Travelling 题意:标准的旅行商加一句话,每个点最多走两次. 分析:状态转移方程一模一样,只是要三进制,因为每个点有三种状态 0 ,1 2 定义状态:dp[st][i] :在状态为 st 时 当前在 i 点的最小花费 转移方程:dp[now][j] = min(dp[now][j],dp[st][i]+mp[i][j]):now是st可以一次转移得到的状态 注意初始化. 分析: #include <cstdio> #include <algorithm&

POJ 2677 Tour 双调旅行商 dp, double+费用流

题目链接:点击打开链接 题意:给定二维平面上的n个点 从最左端点到最右端点(只能向右移动) 再返回到到最右端点(只能向左移动,且走过的点不能再走) 问最短路. 费用流: 为了达到遍历每个点的效果 把i点拆成 i && i+n 在i ->i+n 建一条费用为 -inf 的边,流量为1 这样跑最短路时必然会经过这条边,以此达到遍历的效果. dp :点击打开链接 对于i点 :只能跟一个点相连 -- 1.跟 i-1点相连 2.不跟i-1相连 用dp[i][j] 表示两个线头为 i 和 j 的

美国13509个城镇的经纬度和TSP旅行商回路

美国13509个城镇的经纬度和TSP旅行商回路         在网上下载了美国美国13509个城镇的经纬度和TSP旅行商回路(下载网址:http://www.verysource.com/code/3731091_1/usa13509.opt.tour.html),按照网上的结果,13509个城市的回路结果是:19982859.         我认为,下面这个表里面标示的经纬度,第一个城镇经度为81.7827778,纬度为24.552.778:第二个城镇经度为81.0905556,纬度为24

dtoi2797 旅行商

题意: camp国有n座城市,由1,2,...,n编号.城市由n–1条双向道路相连.任意两个城市之间存在唯一的道路连通.有m个旅行商,第i个旅行商会从城市ai旅行到城市bi,贩卖ci件商品.已知第i个城市的居民最多购买wi件商品,bobo想知道旅行商们能够卖出商品数量的最大值. n,m<=20000. 题解:      考虑暴力,对于每一个旅行商,将其路径上的所有点都连边,然后跑最大流就可以了.不过边数太多了,会TLE. 那么这没有什么关系,我们可以树剖+线段树,将每个旅行商连向他们所对应的节点

群蚁算法理论与实践全攻略旅行商等路径优化问题的新方法

http://www.zfs.cn/home.php?mod=space&uid=674782&do=profile&from=spacehttp://www.zfs.cn/home.php?mod=space&uid=674783&do=profile&from=spacehttp://www.zfs.cn/home.php?mod=space&uid=674784&do=profile&from=spacehttp://www.z

遗传算法的简单应用-巡回旅行商(TSP)问题的求解

上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次的TSP问题的题目是: 随机产生10~30个城市,每个城市之间的距离也是随机产生,距离的范围是[1,50],求最优的路径 ========================================================== 下面就是具体的求解,由于我的策略是基于知网上的<一种改进的遗