我目前正在研究一个项目,该项目包含大约800个点的X和Y坐标向量。这些点代表一个电力网。我的目标是计算a点和B点之间的最短距离路径,这个路径可以沿着包含电力线的X-Y坐标的向量给出的路径找到,也可以不找到。
我读过关于Dijkstra算法,但因为我不太熟悉它,我不确定我是否应该朝那个方向走。如果我能得到您的任何反馈或意见,可以指导我解决这个问题,我将非常感谢。
任何寻路算法都依赖于路径,点是没有意义的。你现在拥有的是一个"航路点"列表。但是你没有解释这些点是如何联系在一起的。例如,如果任何点和每个点都相互连接,那么最短距离就是A和A之间的毕达哥拉斯距离。B. -我也不确定你所说的电线的X-Y坐标是什么意思,这样的"线"总是有一个起点& &;结束位置?
所以第一步不仅要给每个点加上x,y坐标,还要加上一个可连通点的列表
一旦你这样做了,你就可以开始使用寻径算法(在这种情况下,a *似乎比Dijkstra的更好)。它只是一个标准的实现,每个"成本"是点之间的实际距离。(对于A*,启发式将是到终点的毕达哥拉斯距离)。
关于a *(和其他算法)的好教程,你应该查看Amit的页面
编辑,回复评论
似乎第一步是将一组线段转换为"点"。我的方法是:
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集合,我建议将其存储在二叉树结构(集?)中。
对于计算最短路径,Dijakstra是可以的。
使用A*可能会得到更快的结果,它使用距离的最佳猜测,以便将搜索集中在正确的方向上,从而更快地到达那里。
如果你重复查询相同的数据集,那么记忆法是很好的。
那些推荐强力算法的人是傻瓜——花一点时间学习如何编写一个有效的解决方案是值得的。但你可以用Floyd-Warshall算法计算所有点之间的最短路径。不幸的是,这不会告诉你最短路径是什么只是有多长
只需计算所有可能路径的距离并选择最短的路径。800条路径对于现代PC来说根本不算什么。你甚至不会注意到它