我想找到一个启发式或算法来解决旅行销售人员般的问题,但存在一些关键差异:
- 图表未加权。 (所以从任何一个顶点走到连接顶点的成本是1)
- 我想通过每个顶点至少一次,而不是一次。
- 图中有死角,我们将不得不回溯。
图表看起来像这样:
目前,我正沿着一条随机路线,将我的历史保存在一个堆栈中,直到我到达一个没有连接到任何未经行进的顶点的顶点 - 然后我回溯到最近未探索的分支并探索它。我重复这个,直到没有剩下要探索的顶点 - 我可以用2n步骤中的这个方法走图形,其中n是顶点的数量。我觉得必须有一个更好的方法 - 我会感谢任何帮助或指向我应该研究的材料!
答案 0 :(得分:1)
您的问题实际上是TSP的一般定义。您当前的方法可能比2n大得多,您可以通过一条长路径,然后回到一个未连接的顶点,该顶点连接到路径的第一个顶点,这会导致最优和您的方法之间的任意大差距。
如果您正在寻找一个好的启发式方法,那么nearest neighbor是一个很好的方法。首先找到每两个顶点之间的最短路径并创建一个新的图G'这样每条边的重量uv是G中这两个顶点之间最短路径的长度。然后在新创建的图中运行最近邻算法。
另一种方法是使用Christofides algorithm。查找图形的生成树,然后基于此生成树创建欧洲之旅。这个最终总是最多3/2 x,因此您可以结合使用此算法和最近邻算法来获得良好的结果。
顺便说一下,几乎所有众所周知的TSP启发式方法都适用于您的问题,我知道并且我认为您可以在网络中找到一个实现,{CookIn和Seymour令人难以置信的tour merging algorithm准确但不是非常快或易于实施。 (如果你没有找到实现,你可以要求论文的作者提出实现)。
答案 1 :(得分:0)
由于你的图表中的最佳成本将超过n,因为很明显,从最终节点你必须回去,我不会说存在更好的方式,但是,我认为你可以做一点优化当您回溯时,您应该搜索备用路由器以返回到您想要回溯的节点,因为它不是树,您可以在返回时找到更短的路径。可能还有更多这些小技巧,祝你好运