Algorithm 如何确定旅行推销员问题的起点和终点?

Algorithm 如何确定旅行推销员问题的起点和终点?,algorithm,traveling-salesman,Algorithm,Traveling Salesman,我有一个解算器,可以解决正常的对称TSP问题。该解决方案意味着通过所有节点的最短路径,不限制路径中的第一个和最后一个节点 是否有一种方法可以转换问题,从而确保某个特定节点作为开始节点,另一个节点作为结束节点 一种方法是向这些开始/结束节点和所有其他节点之间的所有距离添加一个I(非常大的距离)(向开始和结束节点之间的距离添加两次I),因此解算器尝试只访问它们一次(从而使它们成为路径的开始和结束) 这种方法有什么大的缺点,或者有更好的方法吗?您可以添加一个虚拟节点,它连接到具有权重为0的边的开始和结

我有一个解算器,可以解决正常的对称TSP问题。该解决方案意味着通过所有节点的最短路径,不限制路径中的第一个和最后一个节点

是否有一种方法可以转换问题,从而确保某个特定节点作为开始节点,另一个节点作为结束节点

一种方法是向这些开始/结束节点和所有其他节点之间的所有距离添加一个I(非常大的距离)(向开始和结束节点之间的距离添加两次I),因此解算器尝试只访问它们一次(从而使它们成为路径的开始和结束)


这种方法有什么大的缺点,或者有更好的方法吗?

您可以添加一个虚拟节点,它连接到具有权重为0的边的开始和结束节点。由于TSP必须包含虚拟节点,因此最终结果必须包含序列start-dummy node-end(没有其他方法可以到达虚拟节点)。因此,可以使用指定的开始和结束节点获得最短的Hamilton路径。即使图形中的边为负数,此解决方案也应有效。

下面是“虚拟节点”概念的可视化。左边是一个正常的TSP,具有相同的起点和终点节点a,以及最优解[a,B,E,D,C,a]。右边是相同的TSP,但起始节点是A,结束节点是E。其最优解[A、B、C、D、E]显然与正常情况下的解无关。我们找到解决方案的方法是“破解”TSP图的距离矩阵。在距离矩阵的底部插入虚拟节点,其到节点A和E的距离设置为0,其到所有其他节点的距离设置为inf。当解算器尝试搜索距离矩阵以找到节点A的最佳序列时,虚拟节点E将保持在一起,例如[A、B、C、D、E、虚拟节点A]然后,这个可以被清除,得到[A,B,C,D,E]


请注意,这种类型的黑客可能会对精确解算器的性能产生严重影响。精确的TSP解算器是用各种几何启发法建立起来的,而把零距离和inf距离放进去显然会弄糟这一点。例如,协和式飞机曾尝试过这种方法,但它对此不太满意,有时需要更多的时间来找到最佳解决方案。没有找到任何文档来处理此特定情况,但可能还有其他精确解算器能够处理此特定情况。

您是说您不希望解决方案返回到起点(即,您希望正常TSP解决方案减去起点和终点之间的边)?@nhahtdh您的意思是更改解算器,以便它解决比现在更多的其他类型的问题吗?不幸的是,我做不到。该解算器求解一个普通TSP,其中节点是路由中的第一个或最后一个取决于最短路由是什么。如果指定了第一个或最后一个节点,则找到的路径将不是最短的,因此这是另一种类型的问题。选择较大距离的问题在于,您必须确保其足够大,以便在所有良好的解决方案中强制连接起始和结束节点。JANIS:考虑4个节点图,有0个负边:S 1 E 2,还有1个2的另一个负边,大于边1。在开始和结束之间的距离0在这里不做任何事情。@ JANIS:如果给原始图的所有边加上一些值,最短路径保持不变。(因为所有的Hamilton路径都有相同数量的边,你可以加/减任何数量,结果不会改变)@nmfzone:不是真的,它更多的是将“找到具有特定起点和终点节点的TSP问题的解决方案”简化为“找到TSP问题的解决方案”。感谢您的输入!因此,您提供的基本上与NHAHDH相同,只是添加了“没有其他方法可以通过将其他距离设置为无穷大来达到虚拟节点”(这是很久以前的事了,我不记得了,也许我在具体实现中就是这么做的。)告诉我这里是否遗漏了什么。(左边的图像正是我通常会得到的,右边的图像是我所需要的。如果添加虚拟节点就可以得到它,这就是我所需要的。)是的,这是相似的,但@nhahdh的回答没有指定假人应该添加到数据或代码中的哪个位置。我展示了一种方法,通过更改距离矩阵。如果下载一些以距离矩阵为输入的解算器,并且您不想或无法更改其中的代码,这是很好的。这样,您只需将输入更改为t解算器,但你必须确保矩阵仍然符合规范,即每个节点都需要在其自身和虚拟对象之间有一个距离。也许有时候不使用0和inf更好,但需要有一些东西。