以X-Y坐标给出的点之间的最短路径距离

时间:2013-01-05 15:28:21

标签: c++ shortest-path dijkstra cartesian

我目前正在开发一个项目,该项目的矢量包含大约800点的X和Y坐标。这些点代表线路的电网络。 我的目标是计算点A和点B之间的最短距离路径,该路径可以是或者不能沿着包含电线的X-Y坐标的矢量给出的路径定位。

我已经阅读过有关Dijkstra算法的内容,但由于我对它并不熟悉,我不确定是否应该朝那个方向前进。如果我能得到你的任何反馈或评论,我会非常感激,可以指导我解决这个问题。

3 个答案:

答案 0 :(得分:0)

任何寻路算法都取决于路径,点只是毫无意义。你现在拥有的是“航路点”列表。但是你还没有解释这些点是如何连接的。例如,如果任何和每个点彼此连接点,则最短距离将仅仅是A& A之间的腹腔距离。 B. - 我也不确定你的电线的X-Y坐标是什么意思,这样的“线”总是有一个开始&结束位置?

因此,第一步是不仅向x,y坐标添加每个点,还添加可连接点列表。

一旦你这样做,你就可以开始使用寻路算法(在这种情况下,A *看起来比Dijkstra更好)。它只是一个标准实现,每个“成本”是一个点之间的实际距离。 (对于A *,启发式将是到终点的毕达哥拉斯距离)。

有关A *(和其他算法)的优秀教程,您应该检查Amit's pages

编辑,回复评论。

似乎第一步是将一组线段转换为“点”。我将通过这个方式:

collection AllPoints {containing Location & LinksToOtherPoints}
for each Segment
    get start/end Point of Segment
    if Point.Location is not in allPoints
        add Point to AllPoints
    add the other Point of Segment to LinksToOtherPoints

然后你只需要一个包含所有积分的列表。他们之间的联系。因为你必须经常搜索allPoints集合,我建议将它存储在二叉树结构中(设置?)。

答案 1 :(得分:0)

为了计算最短的路径Dijakstra会很好。

使用A*可以获得更快的结果,memoization使用距离的最佳猜测,以便将搜索重点放在正确的方向,从而更快地到达目的地。

如果您反复查询相同的数据集,那么Floyd-Warshall algorithm就可以了。

那些推荐使用暴力算法的人是傻瓜 - 值得花些时间学习如何编写有效的解决方案。但您可以使用{{3}}计算所有点之间的最短路径。不幸的是,这不会告诉你 的最短路径 它是多长时间

答案 2 :(得分:-1)

只计算所有可能路径的距离并选择最短路径。 现代PC没有800条路径。你甚至都不会注意到它。