我正在OpenStreetMap地图上编写快递/后勤仿真,并且已经意识到,如下图所示的基本A *算法对于大型地图(例如大伦敦)来说不够快。
绿色节点对应于放置在开放集/优先级队列中的节点,由于数量巨大(整个地图大约为1-2百万),因此需要5秒钟左右的时间才能找到所描绘的路线。不幸的是,每条路线100ms大约是我的绝对极限。
当前,节点既存储在邻接表中,又存储在空间100x100 2D数组中。
我正在寻找可以权衡预处理时间,空间以及必要时优化路线以加快查询速度的方法。根据探查器,用于启发式成本的直线Haversine公式是最昂贵的函数-我已尽我所能优化了基本A *。
例如,我在考虑,如果我从2D数组的每个象限中选择一个任意的节点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几乎使执行时间减少了一半,同时保持了相同的路线。