小伙伴们有没有这样的经验:在上课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~):

  1. 令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为节点集合)
  2. 令UUU为一个n维方阵,对 ∀i,j∈N\forall i, j \in N∀i,j∈N 令 uij=∞u_{i j}=\inftyuij​=∞
  3. 令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~=[UC​CTU​]

得到的矩阵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问题转对称的研究。或许是因为本文提到的方法已经相当经典,比较难有改进了吧。

参考文献:

  1. Jonker, R., & Volgenant, T. (1986). Transforming asymmetric into symmetric traveling salesman problems: erratum. Operations Research Letters, 5(4), 215-216.
  2. 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问题的转换相关推荐

  1. PAT甲级1150 Travelling Salesman Problem:[C++题解]旅行商问题、图论

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 旅行商问题:访问每个城市并回到原城市的最短路. 思路: 1)判断相邻两点有无距离(NA):2)每个点是否都能到:3)是否是回路:4) ...

  2. cf1504. Travelling Salesman Problem

    cf1504. Travelling Salesman Problem 题意: n个城市,编号1~n,每个城市有美丽值a[i],现在要从城市1出发,其他所有城市走一遍,最后回到城市1,城市i到j的花费 ...

  3. PAT 1150 Travelling Salesman Problem(25 分)- 甲级

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  4. 单目标应用:求解单仓库多旅行商问题(Single-Depot Multiple Travelling Salesman Problem, SD-MTSP)的人工兔优化算法ARO

    一.算法简介 人工兔优化算法(Artificial Rabbits Optimization ,ARO)由Liying Wang等人于2022年提出,该算法模拟了兔子的生存策略,包括绕道觅食和随机躲藏 ...

  5. 旅行商问题(travelling salesman problem, TSP) 解题报告

    旅行商问题是个熟知的问题.这次是因为coursera上面选的算法课而写代码实现.这里做个简单总结. 测试程序: 25 20833.3333 17100.0000 20900.0000 17066.66 ...

  6. 旅行商问题(Travelling salesman problem, TSP)

    旅行商问题建模与证明 – 个人学习记录

  7. 【HDU 5402】Travelling Salesman Problem(构造)

    被某题卡SB了,结果这题也没读好...以为每一个格子能够有负数就当搜索做了.怎么想也搜只是去,后来发现每一个格子是非负数,那么肯定就是构造题. 题解例如以下: 首先假设nn为奇数或者mm为奇数,那么显 ...

  8. 1150 Travelling Salesman Problem (25 分)【难度: 难 / 知识点: 图 模拟 未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384

  9. 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开始经过每个点再 ...

  10. 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用

    知识点 旅行商问题的线性规划模型 旅行商问题的+Leapms模型及CPLEX求解 C++调用+Leapms 旅行商问题 旅行商问题是一个重要的NP-难问题.一个旅行商人目前在城市1,他必须对其余n-1 ...

最新文章

  1. Python 进程之间共享数据(全局变量)
  2. HDB3的matlab编译码
  3. python 比较运算符放在列表中_在Python3中将运算符放在列表中
  4. 计组之概述:计算机系统
  5. gson将JSON字符串转成Java对象
  6. 面试题:Elasticsearch和solr的区别
  7. 怎么换c语言程序窗口背景图,vc++如何给窗体添加背景图片
  8. 计算机检索word文档检索式,完整word版)中国知网等文献检索的一般方法
  9. matlab求函数在区间内最大值与最小值
  10. 前端常见的浏览器兼容性问题及解决方案
  11. python获取图片长宽高,Python获取图片的大小/尺寸
  12. Python字符串内建函数
  13. vue FullCalendar使用案例及详解
  14. 有关第四章css的介绍
  15. Go语言实现获取有道网页结果
  16. lr背景虚化_【教程】人像后期LR+PS超详细流程+思路分析
  17. java年轻代和年老代默认比值_JAVA中的GC以及年轻代,年老代,持久代的认识
  18. 【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测
  19. 慕司板V1注意事项及问题汇总
  20. k8s1.19.5单master平滑改造多master

热门文章

  1. ecshop 添加会员头像功能
  2. VS Code环境下编辑、编译、下载Keil工程代码
  3. idea中javaweb的jsp页面图片加载不出来的解决办法
  4. Local time zone must be set-see zic manual page
  5. 使用结构方程模型需要知道的那些事(理论篇)
  6. vuex存储什么数据_Redis除了存储数据以外还能做什么?
  7. Java小游戏之《大鱼吃小鱼》
  8. mysql strtolower_自己写的mysql类_PHP教程 - strtolower
  9. 2021年R2移动式压力容器充装报名考试及R2移动式压力容器充装操作证考试
  10. Python快速读取超大文件