我有一系列图形坐标,我需要找到最短的单向路径。我没有预定的开始/结束但是每个点只能触摸一次并且不需要返回到最佳原点。
我尝试了几种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用于可见性)
多做好措施#1 = TSP,#2 =期望
基本上我想要连接n个点的最短链,使用最有效的起点和终点
答案 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算法。