有一些库可用于计算此类图上的最短路径。他们如何做到这一点?更具体地说,他们如何加载图的必需部分以运行Dijkstra的算法?
您可以使用DB,从光盘读取的自定义文件格式和内存设置。
但是根据我的经验,与基于“简单”链接列表格式编写自己的文件格式相比,使用数据库的速度大约慢5到10倍,并且占用大量内存。
好消息是有几种使用OSM的软件框架是开源的,因此您可以直接查看代码,例如参见此处。在GraphHopper开源路由引擎中,从内存映射设置(基于磁盘)切换到内存中设置非常容易-两者都使用相同的格式。“ mmap”设置甚至允许在受内存限制的移动设备上使用,如果您在服务器上有必要的RAM,则后者的执行速度要快得多。例如,对于一张全球图(> 100mio节点),您需要大约8-10gb的RAM,如果想进一步加速一切,例如收缩层次结构,则需要更多的RAM-对于您想要的每辆车,大约需要5-8gb。
格式非常简单,基本上只存储您需要的数据,并通过一些技巧使其紧凑。在此处了解更多信息。免责声明:我是GraphHopper的作者。
关于其他答案:
Dijkstras算法在适用时被认为不是针对此问题的最佳算法
“正常”的Dijkstra可以执行非常合理的操作(对于3mio节点示例这样的全国性查询,其结果为<1s),并且在“理论意义上” 是最佳的,但需要进行一些调整才能在生产场景中快速实现。诸如收缩等级法之类的技术使用了它的双向修改,并且表现出色。
道路网络是分层且平坦的。
道路网络是仅适用于汽车的分层系统,并非平坦的(桥梁,隧道等)