【问题标题】:Shortest One-Way Path Through Multiple Nodes通过多个节点的最短单向路径
【发布时间】:2011-01-24 08:50:38
【问题描述】:

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

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

例子

1、13
3, 0
3、7
2、21
2、11
3、12
1、19
3、6

会解决

3, 0
3、6
3、7
3、12
2、11
1、13
1、19
2、21

注意事项:

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

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

提前致谢。

编辑澄清,TSP 倾向于解决 img #1,我想要的结果是 img #2
img 3 是通过 TSP 解决的上述示例,而 img #4 是所需的(x 坐标向后移 -.5 以提高可见性)

为更好的措施加上更多 #1 = TSP,#2 = 期望

基本上我想要连接 n 个点的最短链,使用最有效的起点和终点

【问题讨论】:

  • 这与 PHP 有什么关系?您是否有要显示的代码,例如表示节点和图的结构?
  • 好吧,我想它与 php 没有直接关系,除了我更喜欢 php 解决方案,因为那是我希望它结束​​的语言(假设 php 可以在合理的时间内处理处理),但是一个算法或一些用主要语言(c++、java、ruby 等)写的不错的注释代码就足够了
  • 图形中的模式表明您不希望路径改变方向。如何使 (x2,y2)
  • @Apalala 你能澄清一点吗?上面的图像确实偶尔会改变方向,例如在 img #2 中。通常它往往是从上到下和一个角到另一个,但并非总是如此。最后一张图片是从中上开始到左下结束,也有可能是从左上开始到左下结束。
  • 调整链接权重的建议不会排除从下到左的解决方案,它只会使从上到右的解决方案看起来更便宜。这是一种可以应用于标准解决方案之上的启发式方法。

标签: php algorithm shortest-path


【解决方案1】:

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

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

【讨论】:

  • 嗯,有点道理,我会在早上试一试,这里是凌晨 4 点哈哈。
【解决方案2】:

这是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)以获得更好的性能。

【讨论】:

  • 我很确定全对最短路径行不通;这会告诉您与图表中所有内容的距离,但不会告诉您以什么顺序访问它们以最大程度地降低旅行成本。
  • @templatetypedef:“全对最短路径问题,我们必须在图中找到每对顶点 v、v' 之间的最短路径”(来自 Wikipedia)为您提供 路径不仅是它们的长度。
  • @rik- 正确,但我认为这不是被问到的问题。即使你有所有点之间的最短路径,你应该以什么顺序访问这些点,以便它们只被访问一次并且总路径成本最小化?我看不到如何从 APSP 答案中获取该信息。
  • @rik:我很欣赏这个建议,但是我已经简要地研究了这些,我倾向于同意 templatetypedef。他们确实找到了从 A 到 N 的最短路径,但他们不能确保它通过每个点。这是正确的理解还是我遗漏了什么?
  • 对不起,没把握好每次行程都想访问每个节点。我会看看我是否能想出一个解决方案并更新我的答案。给我一些时间……
【解决方案3】:

有许多算法可以搜索图中的最短闭合路径。我认为根据您的需要调整解决该问题的算法之一(又名travelling salesman problem)并不难(路径应该是哈密尔顿方式而不是哈密尔顿循环)。一些著名的推销员问题解决方案是 Dijkstra 算法和 Prim 算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多