如何获得近似解决方案以获得通过所有节点的最短路径

时间:2012-11-24 12:04:17

标签: java algorithm path shortest-path

有人知道算法或其他事情吗

所以我有节点与arc连接,我必须找到一个解决方案来找到覆盖所有节点的近似最短路径。 (我只能访问一次)

它必须是近似路径,因为它需要很长时间才能获得最短路径

感谢您的回答:)

(我必须在java中这样做)

4 个答案:

答案 0 :(得分:5)

这被称为Travelling Salesman Problem,合理且快速的近似是始终访问最近的未访问节点,然后使用其他几个起始位置重试相同的节点。通常,这会使您非常接近最佳解决方案。

另一种算法是首先构造图的最小生成树,然后删除重复的节点。这保证了次优的一定上限(在欧几里德的情况下不超过两倍,(wikipedia))

另一种算法是从前三个节点开始,然后按照某种顺序添加下一个节点(初始,按x坐标排序,按中心距离排序......)通过拆分现有边(或添加新边)最后,在最短路径的情况下),同时保持路径尽可能短。

一旦你有了解决方案(即使是坏的解决方案),你可以通过K-opt改进它:反复选择K个随机边缘,完全删除它们并找到重新连接新端点的最佳方法。 K-opt的变体是Lin-Kerningham启发式,它将2-opt步骤与3-opt步骤(按某种顺序)交替,其中三个边缘中的两个始终是相邻的。

如果大多数边缘丢失或很长(两个节点之间的距离不形成度量标准),那么您就遇到了问题。让我们说它的NP-complete确定如果缺少边缘,这条路径是否存在。

答案 1 :(得分:1)

非常快速的近似是沿着空间填充曲线对顶点进行排序。空间填充曲线减小了尺寸并且还保留了一些空间信息。尝试旅行商问题的摩尔曲线,因为它是4个希尔伯特曲线的副本,使得起点和终点彼此相邻。但绘制起来要贵一些。

enter image description here

enter image description here

答案 2 :(得分:0)

是的,有。该方法称为“遗传优化”,如下所述 1.找到一个解决方案,即访问每个节点一次的路径。 2.随机选择k个相邻节点:N1,N2..Nk:X-> N1-> ... Nk-> Y 3.使用节点N1..Nk检查从X到Y的路径是否较短 4.替换路径X - *> Y由较短的解决方案 5.转到2

k必须小(5或更小)才能轻松找到更短的组合

关于它的好处是你可以随时停止并使用现有的解决方案。一个改进是随机选择一个更大的k。

答案 3 :(得分:0)

如果您不需要自己实施算法,可能需要查看JGraphT。它有一个算法的实现来查找Hamiltonian Cycles