【问题标题】:Algorithm Optimization - Shortest Route Between Multiple Points算法优化 - 多点之间的最短路径
【发布时间】:2010-12-03 10:51:31
【问题描述】:

问题:我有大量积分。这些点中的每一个都有一个列表,其中包含对其他点的引用,它们之间的距离已经计算和存储。我需要确定从起点开始并经过特定数量的点到达任何目的地的最短路线。

例如:我正在度假,我住在一个特定的城市。我正在做一次单程旅行,去参观任何四个城市,我想尽可能地走最短的距离。我不能多次访问同一个城市。

当前解决方案:现在我只是手动迭代所有可能性并存储最短路径。这有效,但感觉效率低下。另外,这个问题最终会扩展到包括从多个起点到多个目的地的搜索,所以我认为这可能会爆炸搜索空间。

寻找最短路径的更好方法是什么?

【问题讨论】:

  • 这是有向图还是双向图?我说不出来。
  • 这里的一些答案(TSP、Floyd-Warshall、Breadth-First、Branch and Bound)来自对这个问题的极度不一致和矛盾的解释,所以我倾向于认为这个问题这里的措辞不是很好。
  • 让我简单地改述一下:一个例子是我正在度假,我住在一个城市。我想从我的出发去参观任何四个城市,并且我想尽可能地走最短的距离。我不能多次访问同一个城市。
  • 你最近的编辑完全改变了我解释你问题的方式。
  • 天哪。这使得基于 Floyd-Warshall 的解决方案无效,以至于它们甚至看起来很荒谬:)

标签: algorithm search routes mathematical-optimization


【解决方案1】:

回答更新后的帖子,您检查每种可能性的解决方案是最佳的(至少,到目前为止,没有人发现更好的算法)。是的,这就是一个旅行推销员,他的本质不是触动每个城市,而是触动每个城市一次。如果您不想寻找可能的最佳解决方案,您可能会发现使用工作速度更快但允许与理想解决方案存在有限差异的启发式算法很有用。


对于未来的回答者:Floyd-Warshall algorithm 和所有类似弗洛伊德的变体在这里都不适用。

【讨论】:

  • 有趣的事实:O(N^5) > O(N!) 最多 N = 8 :)
  • 谢谢。我已经通过找到直接的解决方案来优化它,找到最短的个人路线一直向下,然后向上移动一个级别并搜索,然后向上移动另一个级别(等等)我猜这是深度优先搜索?跨度>
  • 这可以称为深度优先遍历,而不是搜索搜索旨在访问每个节点,而您的算法旨在访问每个路径,因此成本更高。
  • 没有已知的多项式时间算法。然而,这并不意味着检查每一种可能性都是最优的。对于旅行商问题和相关问题,有相当复杂的算法可以解决诸如数千个城市的大问题
  • Pavel 使用术语最佳的意思是它会在任何数据集上找到最佳解决方案(无论运行时复杂性如何)。
【解决方案2】:

通常您应该严格控制不良变体... 我认为您应该使用 Branch_and_bound 方法的一些变体 http://en.wikipedia.org/wiki/Branch_and_bound

【讨论】:

  • ++ 是的。这是一个树搜索优化问题,所以分支定界适用于它。它可以是广度优先或深度优先。
【解决方案3】:

norheim.se 所说的 bredth first search 或 Dijkstra's algorithm 也是我的建议。

【讨论】:

    【解决方案4】:

    这听起来像旅行推销员?一种解决方案是使用优化技术,例如进化算法。目前你正在做一个详尽的搜索,它会很快变得非常慢。但我认为这几乎是一个旅行推销员问题,它已经解决了几十年甚至几个世纪,因此有几种可能的攻击方式。 Google 是您的朋友。

    【讨论】:

    • 它不是 TSP,因为您可以多次通过同一点。
    • 我认为 TSP 涉及了解需要触及的每个点?在我的情况下,不需要包含任何特定点,只需包含从原点出发的最短路径的任何点。
    • @Shay:TSP 有很多种风格,包括允许用户多次访问同一个顶点的那些。
    【解决方案5】:

    也许这就是原始海报通过“手动迭代每种可能性并存储最短路径”的意思,但我想我想明确说明什么似乎是基线解决方案。

    假设您已经有一个两点最短路径算法——它具有适用于各种图形的经典解决方案。假设所有距离都是非负的并且 d(A->B->C) = d(A->B) + d(B->C)。

    要旨是路径从 S 开始经过中间城市“abcd”之一并以 E 结束:

    例如SabcdE、SacbdE 等...

    只有 4 个中间城市,您可以枚举所有 24 个排列。对于每个排列,使用最短的两点算法来计算从头到尾的路径及其总距离。

    然后给定起点和终点,有 12 种可能性附加到 abcd 之一,并且每两个可能性用于内部。您已经计算了这些距离,因此您添加了从 S 到头部的距离和从尾部到 E 的距离。选择最小值。因此,一旦您预先计算了一组固定的内陆城市的中间距离,您就需要为任何一对起点和终点做 12 个两点最短路径问题。

    随着中间城市数量的增加,这显然无法扩展。我不清楚它是否可以做得更好,除非您对图结构施加更大的限制(这是在物理欧几里得空间中吗?三角不等式?)。

    我的想法示例:假设城市之间的所有中间距离都是 O(1)。对图没有限制,那么从 S 到任何中间城市的距离可能是 1000,除了一个是 1。尾巴也是如此。所以你可以强制第一个被访问的城市是任何东西。现在,往下一层,以第一个城市为“起点”。应用相同的论点:您可以通过操纵图中的距离使最佳路径前往以下任何城市。

    因此,如果没有额外的假设,似乎无法解决复杂性问题。

    【讨论】:

      【解决方案6】:

      这是任何人都可能陷入的非常常见和实时的情况。Google 地图用户界面以相同的顺序为您提供路径,您添加到目的地列表中。尽管他们自己的 Google 地图 API 提供了解决方案,但它并没有为您提供最佳路径。

      Google maps API 提供了解决方案。在查找路径的请求中,您必须提供标志“optimizeWaypoints:true”。请求将如下所示。

      var request = {
                  origin: start,
                  destination: end,
                  waypoints: waypts,
                  optimizeWaypoints: true,
                  travelMode: google.maps.TravelMode.DRIVING
              };
      

      您可以在查看源代码中看到该实用程序的完整代码,因为完整的实用程序是用 javascript 和 HTML 开发的。

      我希望它会有所帮助。

      【讨论】:

      • 您的网站已关闭,链接也已关闭
      【解决方案7】:

      您的图表的边缘似乎是双向的。在这种情况下,您要查找的算法是 Dijkstra's algorithm

      【讨论】:

        猜你喜欢
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        相关资源
        最近更新 更多