【发布时间】:2015-06-21 19:26:01
【问题描述】:
我正在 OpenStreetMap 地图上编写快递/物流模拟,并意识到如下图所示的基本 A* 算法对于大型地图(如大伦敦)来说不够快。
绿色节点对应于放入开放集/优先队列中的节点,由于数量庞大(整个地图约为 1-2 百万),需要 5 秒左右才能找到图中所示的路线。不幸的是,每条路由 100 毫秒是我的绝对限制。
目前,节点既存储在邻接列表中,也存储在空间 100x100 2D 数组中。
我正在寻找可以权衡预处理时间、空间以及(如果需要)路线的最优性以实现更快查询的方法。根据分析器,启发式成本的直线 Haversine 公式是最昂贵的函数 - 我已经尽可能优化了我的基本 A*。
例如,我在想如果我从二维数组的每个象限中选择一个任意节点 X 并在每个象限之间运行 A*,我可以将路线存储到磁盘以供后续模拟。查询时,我只能在象限中运行 A* 搜索,以在预先计算的路线和 X 之间进行搜索。
我上面描述的内容是否有更完善的版本,或者我应该采用不同的方法。非常感谢!
作为记录,以下是一些基准结果,用于任意加权启发式成本并计算 10 对随机选取的节点之间的路径:
Weight // AvgDist% // Time (ms)
1 1 1461.2
1.05 1 1327.2
1.1 1 900.7
1.2 1.019658848 196.4
1.3 1.027619169 53.6
1.4 1.044714394 33.6
1.5 1.063963413 25.5
1.6 1.071694171 24.1
1.7 1.084093229 24.3
1.8 1.092208509 22
1.9 1.109188175 22.5
2 1.122856792 18.2
2.2 1.131574742 16.9
2.4 1.139104895 15.4
2.6 1.140021962 16
2.8 1.14088128 15.5
3 1.156303676 16
4 1.20256964 13
5 1.19610861 12.9
令人惊讶的是,将系数增加到 1.1 几乎将执行时间减半,同时保持相同的路线。
【问题讨论】:
-
我觉得你应该去那里问问:cs.stackexchange.com
-
对算法的修改,允许对每个路段进行加权(例如,8 车道高速公路每单位距离的成本为 1,而未铺砌的土路的成本为 50,并且所有的东西都在之间...)将是一个可能的起点。尽管您随后需要对从地图提供商处获得的所有路段进行分类,但如果他们还没有与之关联的合适数据...
-
没有时间写一个完整的答案,但最先进的技术涉及找到小的分隔符。不要满足于近似结果——调试起来很烦人。
-
您对一对一路线或计算距离矩阵感兴趣吗?或许你可以在这里找到一些提示:stackoverflow.com/questions/430142
-
尝试使用“Arc-Flags”对图形进行预处理;这很简单,也应该给你一个很好的加速。
标签: algorithm openstreetmap graph-algorithm shortest-path a-star