【问题标题】:Dijkstra algorithm for iPhoneiPhone 的 Dijkstra 算法
【发布时间】:2009-05-18 07:42:47
【问题描述】:

从 sdk 3.0 开始可以轻松使用 iPhone 中的 GPS 功能,但明确禁止使用 Google 的地图。 我认为这有两个含义:

  1. 您必须自己提供地图
  2. 您必须自己计算最短路线。

我知道计算最短路径多年来一直困扰着数学家,但是 Tom Tom 和 Google 都做得很好,所以这个问题似乎已经解决了。 在网上搜索,我自己不是数学家,我遇到了Dijkstra Algorithm。有没有人在 iPhone 的类似地图的应用程序中成功使用过这个算法? 您愿意与我/社区分享吗? 这是正确的方法,还是其他选择? 非常感谢您的考虑。

【问题讨论】:

  • 您不能改用 Google 地图的 API 并让它为您工作吗?
  • 这很有趣,我没有想到。 API 是否能够计算 Google 未定义的道路/街道上的最短路线?我的意思是,我可以向它提供自定义地图吗?我心目中的应用程序处理的是一个私人领域,这在地图中只是模糊地定义。

标签: iphone shortest-path dijkstra


【解决方案1】:

我不相信 Dijkstra 的算法对现实世界的映射有用,因为正如 Tom Leys 所说(我会评论他的帖子,但缺乏这样做的代表),它需要一个单一的起点。如果起点发生变化,则必须重新计算所有内容,我想这在 iPhone 这样的设备上对于非常大的数据集来说会很慢。

【讨论】:

  • 欢迎栈溢出mitch
  • 是的,这太慢了,并且需要相当多的内存来保存当前的打开列表(到目前为止已经访问了多少节点,以及它们离开始还有多远) .
【解决方案2】:

Dijkstra 算法用于寻找到所有节点的最短路径(从单个起始节点开始)。游戏程序员使用定向搜索,例如 A*。其中 Dijkstra 首先处理最接近起始位置的节点,A* 处理估计最接近结束位置的节点

它的工作方式是提供一个从任何给定位置到终点的廉价“估计”函数。一个很好的例子是一只鸟要飞多远才能到达那里。 A* 将此添加到每个节点到起点的当前距离,然后选择似乎在最短路径上的节点。

您的估计越好,找到一条好路径所需的时间就越短。如果这个时间仍然太长,您可以在简单地图上进行路径查找,然后在更复杂的地图上进行另一次查找,以查找您在简单地图上找到的地点之间的路线。

更新 经过大量搜索,我找到了一个article on A*供您阅读

【讨论】:

  • 感谢您的洞察力。你知道另一种方法吗?
  • 大多数其他方法将是一种混合方法,您可以缓存中间搜索数据或对 A* 等使用巧妙的启发式方法。另一种选择是让您的应用程序将搜索提交到网络上具有更多 CPU 能力和内存的服务器 - 该服务器可以预先缓存大量搜索结果
  • 这里算法很好的描述stackoverflow.com/questions/39256309/…
【解决方案3】:

Dijkstra 的算法对于 n 个节点和 m 个边(对于单个路径)是 O(m log n),并且足够高效,可用于网络路由。这意味着它的效率足以用于一次性计算。

简而言之,Dijkstra 算法的工作原理如下:

Take the start node
Assign it a depth of zero
Insert it into a priority queue at its depth key

Repeat:
    Pop the node with the lowest depth from the priority queue
    Record the node that you came from so you can track the path back
    Mark the node as having been visited
    If this node is the destination:
        Break
    For each neighbour:
        If the node has not previously been visited:
            Calculate depth as depth of current node + distance to neighbour
            Insert neighbour into the priority queue at the calculated depth.

Return the destination node and list of the nodes through which it was reached.

与流行的看法相反,Dijkstra 算法不一定是全对最短路径计算器,尽管它可以适应这一点。

您必须获得街道和十字路口的图表以及十字路口之间的距离。如果你有这些数据,你可以使用 Dijkstra 算法来计算最短路径。

【讨论】:

    【解决方案4】:

    如果您查看技术 tomtom 所称的“IQ 路线”,它们会测量一天中每个时间段的实际速度和行程时间。这使得到达时间更加准确。所以预计到达时间更符合事实http://www.tomtom.com/page/iq-routes

    【讨论】:

      【解决方案5】:

      在具有离线地图数据的 iPhone 上,使用 A* 算法计算路线已经足够快了。我有商业上做这件事的经验。我使用 Wikipedia 上记录的 A* 算法,并将道路网络保存在内存中并重新使用它;一旦加载完成,即使是在西班牙或加拿大西半部这样的大片区域内进行路由也几乎是即时的。

      我从 OpenStreetMap 或 elswhere 获取数据并将其转换为有向图,假设(根据知情人士的说法,这是正确的做法)任何两条道路共享一个具有相同 ID 的点。我根据预期速度为不同类型的道路分配权重,如果道路的一部分是单向的,我只创建一条弧线;双向道路有两条弧线,每个方向一条。除了一些防止危险转弯的临时代码和实施路由限制之外,这几乎是全部内容。

      【讨论】:

        【解决方案6】:
        【解决方案7】:

        看看CloudMade。他们为 iPhone 和 iPad 提供免费服务,允许根据您当前的位置进行导航。它建立在开放的街道地图上,并具有一些漂亮的功能,例如制作自己的地图样式。它有时会有点慢,但它完全免费。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-13
          • 2011-06-27
          • 2021-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多