我正面临一个优化问题:
我有一个包含大量节点(10 ^ 5)的图表,它代表平面上的点。
我需要在图表上找到最短路径,以便从“起始节点”开始到达“终端节点”。
任何一对节点都可以连接或不连接。检查它们是否连接是一项非常昂贵的操作。如果它们已连接,则与链接关联的权重是两个节点之间的欧氏距离。
目前我只检查从“当前节点”到每个其他节点的所有链接,以便填写A *的“打开列表”。我选择了A *,因为它似乎是寻路中最好的算法,而且我对节点J有一个快速,可接受和简单的启发式H(H =到达目标的距离),但我不确定它对我的问题有好处。 / p>
预先构建图表是无法管理的,需要检查N ^ 2个链接,它太慢了。目前(almst)只有在没有解决方案的情况下才会构建整个图形,从开始到结束都没有路径。
我想要一个更好的解决方案的提示......谢谢!
答案 0 :(得分:2)
这实际上是两个问题。我不熟悉Bresenham算法,因此我只建议您查看Wikipedia中给出的优化以及那里的链接。
对于A *:正如我之前所说,几乎整个图形的构建几乎是不可避免的。您可以尝试使用递归最佳优先搜索或IDA *(Russell & Norvig,第2版第4章)等变体来节省一些内存,如果您的内存很慢,可能还需要一些时间。
根据您的图形结构,实施双向搜索可能也是值得的。最简单的双向算法将在一个线程中从A到B进行A *搜索,在另一个线程中从B到A进行搜索,直到其中任何一个找到解决方案或发现它被卡住了。然后可以杀死另一个线程。 (这个问题的一个问题是,如果有一个解决方案,你浪费了很多时间,所以只有你有一个备用的处理器内核才会有用,否则它会闲置。)
更复杂的算法还会检查两者是否在图中找到相同的点,然后杀死线程并合并其结果。这可以通过交错两次搜索中的步骤来实现;并行版本可能非常复杂。
答案 1 :(得分:1)
除非您能够处理无法保证最佳解决方案的贪婪算法,否则这种A *方法可能与您将获得的方法一样好。如果路径不存在而没有允许修剪某些顶点的额外信息,则没有算法可以避免检查每个顶点。也许CheckLink操作可以优化?链接信息是否可以采用更快访问的格式进行缓存,或者每次运行时“类似图像”的数据是否会发生变化?