通过多个节点的最短单向路径

时间:2011-01-24 08:50:39

标签: php algorithm shortest-path

我有一系列图形坐标,我需要找到最短的单向路径。我没有预定的开始/结束但是每个点只能触摸一次并且不需要返回到最佳原点。

我尝试了几种TSP方法,但它们似乎都是基于最终返回原点,在这种情况下会产生非常低效的结果。

实施例

1,13
3,0 3,7 2,21
2,11
3,12 1,91 3,6,

会解决

3,0 3,6 3,7 3,12 2,11
1,13
1,91 2,21

注意:

是的我试过搜索功能,有一个基本相同的问题 Algorithm: shortest path between all points 然而唯一真正的答案是TSP,再一次,闭合电路效率低下。

它不需要100%准确,我已经有一个排列方法,但它太慢了,我需要处理至少~25-30点,用一个很好的近似解决对我有用

提前致谢。

编辑澄清,TSP倾向于像img#1那样解决,我想要的结果是img#2
img 3是通过TSP解决的上述样品,img#4是所需的(x coords向后移动-.5用于可见性)
enter image description here enter image description here enter image description here enter image description here
多做好措施#1 = TSP,#2 =期望
enter image description here enter image description here
基本上我想要连接n个点的最短链,使用最有效的起点和终点

3 个答案:

答案 0 :(得分:3)

这是all-pairs shortest path problem的一个实例,所有边都有权重= 1。您可以在链接页面上找到Dijkstra或A-star算法等常用解决方案 一种天真的方法是遍历节点并找到到每个其他节点的最短路径。

$paths = array();
foreach ($nodes as $start) {
    foreach ($nodes as $end) {
        if ($start !== $end) {
            $path[$start][$end] = findShortestPath($graph, $start, $end);
        }
    }
}

更复杂的方法findShortestPath会记住以前运行的子路径(或为此目的使用$paths)以获得更好的性能。

答案 1 :(得分:3)

由于您不关心找到闭环 - 您只需要一条路径 - 您可以对要点进行小幅修改,以避免闭环成本。要执行此操作,请添加一个新点,将其命名为v,您将其定义为距离所有其他点的距离为0。现在,找到该图的TSP解决方案。在某些时候,你将进入然后离开v。如果你采取循环,然后将边缘移入和移出v,那么你将有一条路径,它可以完全访问每个节点一次,没有任何循环。

这仍然需要您解决或接近TSP,但它消除了返回起点的巨大开销。

答案 2 :(得分:0)

有许多算法可以搜索图中最短的闭合路径。我认为根据你的需要调整解决这个问题的算法(a.k.a为travelling salesman problem)并不太难(路径应该是哈密尔顿方式而不是哈密顿循环)。推销员问题的一些众所周知的解决方案是Dijkstra算法和Prim算法。