非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
小伙伴们有没有这样的经验:在上课10分钟前从寝室骑车飞奔向教学楼时,寝室到教学楼的路非常挤;而这个时候,如果有东西落在寝室,从教学楼往寝室飞奔时的车道却很空。换句话说,在一些场合,从点iii到点jjj的行驶时间和从点jjj到点iii的行驶时间是不同的。这个现象当然不会被学者们忽视。这就是我们今天要介绍的非对称类问题(asymmetric)。
非对称TSP与对称TSP
在我们以往介绍的TSP问题和VRP问题中,算例给出的通常是客户点的二维坐标,两点之间的距离通过欧拉距离(平方和开根号)计算,因此两点间不同向的边距离是相同的。因此,我们在设计算子时可以对一些边进行“翻转”,例如“1→2→3→4→5”翻转为“1→4→3→2→5”,这个时候由于距离的对称性,“2→3→4”与“4→3→2”两段路径的距离是相同的,不需要重新计算。但在我们今天介绍的非对称TSP问题中,由于反向后距离发生变化,这两段路径的距离将发生改变,这种去重优化的方法就失效了。
1983年学者Roy Jonker 和 Ton Volgenant 提出了一种将非对称TSP问题转换为对称TSP问题的方法。通过这种方法,我们可以将非对称TSP问题转化为对称TSP问题,然后使用适合对称问题的算法求解该问题,而不是重新设计算法。
转化方法
Roy和Ton通过扩充原问题graph的规模的方式,在新的graph上求解对称TSP问题,然后将新解转化为旧问题的解。
通过以下操作,将一个非对称TSP问题的距离矩阵CCC转化为对称TSP问题的距离矩阵C~\tilde{C}C~(C~T=C~\tilde{C}^T = \tilde{C}C~T=C~):
- 令Cˉ=C\bar{C} = CCˉ=C,其中cˉii=−M(i∈N)\bar{c}_{i i}=-M(i \in N)cˉii=−M(i∈N)。(M是一个很大的数,N为节点集合)
- 令UUU为一个n维方阵,对 ∀i,j∈N\forall i, j \in N∀i,j∈N 令 uij=∞u_{i j}=\inftyuij=∞
- 令C~=[UC‾TC‾U]\tilde{\boldsymbol{C}}=\left[\begin{array}{ll}U & \overline{\boldsymbol{C}}^T \\ \overline{\boldsymbol{C}} & \boldsymbol{U}\end{array}\right]C~=[UCCTU]
得到的矩阵C\boldsymbol{C}C就是新的对称TSP问题的距离矩阵。可以看出,这个矩阵是一个2n*2n规模的方阵,新的节点集为{1,2,…,n,n+1,…,2n}\{1,2, \ldots, n, n+1, \ldots, 2 n\}{1,2,…,n,n+1,…,2n}。
求解这个新的TSP问题得到的最优解必定是以下形式(或其对称形式):
i1→(i1+n)→i2→(i2+n)→⋯→in→(in+n)→i1i_{1} \rightarrow\left(i_{1}+n\right) \rightarrow i_{2} \rightarrow\left(i_{2}+n\right) \rightarrow \cdots \rightarrow i_{n} \rightarrow\left(i_{n}+n\right) \rightarrow i_{1}i1→(i1+n)→i2→(i2+n)→⋯→in→(in+n)→i1
其中ik∈Ni_{k} \in Nik∈N。
也就是说,新问题的最优解中,每一个节点必定指向到它对应的拓展出的节点,而每一个新的节点必定指向原先图中的某个节点。该解对应的原问题的最优解即为:
i1→i2→⋯→in→i1i_{1} \rightarrow i_{2} \rightarrow \cdots \rightarrow i_{n} \rightarrow i_{1}i1→i2→⋯→in→i1
深入理解
看了前文的转化方法,是不是感觉特别简单呢?只需要通过一些简单的矩阵操作得到新的距离矩阵,路径的转化也非常简单,只需要取奇数位的节点编号即可。
在原论文中作者提出一个定理:新问题的最优解必定对应一个原问题的最优解,并没有给出完整证明。事实上转化的思维也很简单,这里小编给大家文字证明一下。
在矩阵操作的第一步得到Cˉ=C\bar{C} = CCˉ=C的过程中,cˉii=−M\bar{c}_{i i}=-Mcˉii=−M在新矩阵C\boldsymbol{C}C中实际上对应了节点iki_{k}ik和ik+ni_{k} +nik+n。所以在新问题的最优解中,必须尽可能多的包含ik→(ik+n)i_{k} \rightarrow\left(i_{k}+n\right)ik→(ik+n)这类边。由于一个节点只能访问一次,所以这类边最多存在n条。由于矩阵UUU的每一个数都是无穷大,因此不存在(ik1+n)→(ik2+n)\left(i_{k1}+n\right) \rightarrow\left(i_{k2}+n\right)(ik1+n)→(ik2+n)以及ik1→ik2i_{k1} \rightarrow i_{k2}ik1→ik2这两种边,因此新解中剩下的边只能是(ik1+n)→ik2\left(i_{k1}+n\right) \rightarrow i_{k2}(ik1+n)→ik2的形式了。
由于(ik1+n)→ik2\left(i_{k1}+n\right) \rightarrow i_{k2}(ik1+n)→ik2的距离与ik1→ik2i_{k1} \rightarrow i_{k2}ik1→ik2的距离相等,并且每个新问题最优解中必定存在n条距离为-M的边,因此新的目标函数相当于原问题的目标函数减去一个常数(n*M),因此原问题与新问题等价。
小编解释的可能有点绕,不过原理并不复杂,相信同学们能够思考清楚。
代码分享
为了验证方法的准确性,小编基于干货 | JAVA调用cplex求解一个TSP模型详解中的TSP模型代码编写了将非对称TSP问题转化对称TSP问题进行求解的代码。(代码下载见文末)事实上,上述文章提到的模型不需要改动也可以作为非对称TSP问题的模型,只需要修改输入为矩阵形式,一样可以求解。小编简单测试了“直接通过模型求解”和“转化为对称问题通过模型求解”两种形式,验证转化方法的正确性:
直接求解模型结果:
转化为对称问题求解模型结果:
可以看到,对于测试算例(9个节点的小算例),两种方法得到的路径是一模一样的。下图中可以看到,新模型的目标值是-88398.0,正好等于9*(-10000)+1602.0 (M=10000),这与我们之前的推理也吻合。由于转化后问题的节点规模为原来的两倍,相应的算法时间消耗也扩大了很多(0.183s到1.203s)。
先提醒一下,如果问题存在不止一个最优解,可能两次得到的路径会不一样哦,小伙伴们自己测试时遇到了可别骂小编弄错了。
结语
自此,非对称TSP问题转化为对称TSP问题的方法已经介绍完了。值得一提的是,原作者1983年的论文还提出了一种针对局部非对称TSP问题(也就是部分节点距离不对称,部分对称)的转化方法,不需要增大节点规模到2n。可惜的是,该方法后来被证明有误,新解的结果只能作为原问题最优解的下界,作者在1986年的论文中承认了自己的错误。看来学术研究即使暂时被承认,也一样要经受时间的考验啊!
小编在查阅文献也时发现,较新的关于非对称问题的研究更多是直接设计对应算法,很少关于非对称TSP问题转对称的研究。或许是因为本文提到的方法已经相当经典,比较难有改进了吧。
参考文献:
- Jonker, R., & Volgenant, T. (1986). Transforming asymmetric into symmetric traveling salesman problems: erratum. Operations Research Letters, 5(4), 215-216.
- Jonker, R., & Volgenant, T. (1983). Transforming asymmetric into symmetric traveling salesman problems. Operations Research Letters, 2(4), 161-163.
代码下载:
关注公众号【数据魔术师】,在公众号内输入【ATSP】
或访问github:https://github.com/zll-hust/ATSP
即可获得本文代码文献!
非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换相关推荐
- PAT甲级1150 Travelling Salesman Problem:[C++题解]旅行商问题、图论
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 旅行商问题:访问每个城市并回到原城市的最短路. 思路: 1)判断相邻两点有无距离(NA):2)每个点是否都能到:3)是否是回路:4) ...
- cf1504. Travelling Salesman Problem
cf1504. Travelling Salesman Problem 题意: n个城市,编号1~n,每个城市有美丽值a[i],现在要从城市1出发,其他所有城市走一遍,最后回到城市1,城市i到j的花费 ...
- PAT 1150 Travelling Salesman Problem(25 分)- 甲级
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- 单目标应用:求解单仓库多旅行商问题(Single-Depot Multiple Travelling Salesman Problem, SD-MTSP)的人工兔优化算法ARO
一.算法简介 人工兔优化算法(Artificial Rabbits Optimization ,ARO)由Liying Wang等人于2022年提出,该算法模拟了兔子的生存策略,包括绕道觅食和随机躲藏 ...
- 旅行商问题(travelling salesman problem, TSP) 解题报告
旅行商问题是个熟知的问题.这次是因为coursera上面选的算法课而写代码实现.这里做个简单总结. 测试程序: 25 20833.3333 17100.0000 20900.0000 17066.66 ...
- 旅行商问题(Travelling salesman problem, TSP)
旅行商问题建模与证明 – 个人学习记录
- 【HDU 5402】Travelling Salesman Problem(构造)
被某题卡SB了,结果这题也没读好...以为每一个格子能够有负数就当搜索做了.怎么想也搜只是去,后来发现每一个格子是非负数,那么肯定就是构造题. 题解例如以下: 首先假设nn为奇数或者mm为奇数,那么显 ...
- 1150 Travelling Salesman Problem (25 分)【难度: 难 / 知识点: 图 模拟 未完成】
https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384
- Codeforces Round #712 (Div. 2) E. Travelling Salesman Problem 思维转换
传送门 文章目录 题意: 思路: 题意: 给你nnn个点,从iii到jjj的花费是max(ci,aj−ai)max(c_i,a_j-a_i)max(ci,aj−ai),求从111开始经过每个点再 ...
- 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用
知识点 旅行商问题的线性规划模型 旅行商问题的+Leapms模型及CPLEX求解 C++调用+Leapms 旅行商问题 旅行商问题是一个重要的NP-难问题.一个旅行商人目前在城市1,他必须对其余n-1 ...
最新文章
- Python 进程之间共享数据(全局变量)
- HDB3的matlab编译码
- python 比较运算符放在列表中_在Python3中将运算符放在列表中
- 计组之概述:计算机系统
- gson将JSON字符串转成Java对象
- 面试题:Elasticsearch和solr的区别
- 怎么换c语言程序窗口背景图,vc++如何给窗体添加背景图片
- 计算机检索word文档检索式,完整word版)中国知网等文献检索的一般方法
- matlab求函数在区间内最大值与最小值
- 前端常见的浏览器兼容性问题及解决方案
- python获取图片长宽高,Python获取图片的大小/尺寸
- Python字符串内建函数
- vue FullCalendar使用案例及详解
- 有关第四章css的介绍
- Go语言实现获取有道网页结果
- lr背景虚化_【教程】人像后期LR+PS超详细流程+思路分析
- java年轻代和年老代默认比值_JAVA中的GC以及年轻代,年老代,持久代的认识
- 【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测
- 慕司板V1注意事项及问题汇总
- k8s1.19.5单master平滑改造多master
热门文章
- ecshop 添加会员头像功能
- VS Code环境下编辑、编译、下载Keil工程代码
- idea中javaweb的jsp页面图片加载不出来的解决办法
- Local time zone must be set-see zic manual page
- 使用结构方程模型需要知道的那些事(理论篇)
- vuex存储什么数据_Redis除了存储数据以外还能做什么?
- Java小游戏之《大鱼吃小鱼》
- mysql strtolower_自己写的mysql类_PHP教程 - strtolower
- 2021年R2移动式压力容器充装报名考试及R2移动式压力容器充装操作证考试
- Python快速读取超大文件