我正在使用Dijkstra的算法来解决理想的路径。作为该计划的一部分,该算法被称为数千次。
超过一半的时间路径是不可能的,Dijkstra需要很长时间才能弄明白(在一个小测试中,可能的路径总共解决了2秒,而不可能的路径总共需要25个。)< / p>
因此,我想知道是否有一种方法可以非常有效地检查是否有可能在浪费时间与算法之前找到2个节点之间的路径。有没有非常有效的方法来做到这一点?
谢谢, 丹
答案 0 :(得分:1)
无约束,单次使用
在没有约束的图形上,程序以前从未见过(或者甚至是之前的部分),并且不会再看到。关于你唯一能做的就是广度优先搜索或深度优先搜索。
如果内存存在问题,您可以考虑使用增量深度优先搜索。
您可以考虑在图表上启动多个线程以查看不同的分支。您需要协调,以便他们不会通过拥有并发共享数据结构来重复工作,他们可以安全地检查和写入。使用并发性,您可以从头到尾搜索一些线程,从头到尾搜索其他线程。
在带有周期的图形上,您可能希望将节点标记为已访问,以便不执行无限循环。
限制,一次性使用
考虑一下您的图表和目标。
图表是密集的还是稀疏的?
是否有负边缘权重?负和周期?
是否遵循梯形规则?
是否存在最大距离,超出该最大距离,如果有路径,您不关心?
图表是非循环的吗?
图表是否“简单”?
通过一些工作,您可以找到比图表的dfs更好的方法。其他时候,您可能能够以不同的方式构建图形,使dfs更快。有时,优势可能来自于在搜索过程中不必存储尽可能多的数据。
约束,多用途
如果值得,你可以运行Floyd-Warshall来解决每对节点之间的最短路径。该算法需要一些时间,但是当您可以只查找关键部分中的最短路径时,这可能是有利的。
您可以通过在图表上执行初始dfs来预先解决连接的组件,而不是预先求解最短路径。
如果图表可以更改,但不能大幅改变,您可以简单地修改预先计算的结果,而不是每次都从头开始。
最后的想法
图表的大小和复杂性是重要的考虑因素。对于大型稀疏图或树,小密集连接图的最佳算法将会有所不同。
答案 1 :(得分:0)
您是否在同一图表上运行多个路径查找?如果是这样,您将需要在图表中维护一组不相交的连续空格。这可以通过以下方式完成:
(2)的精确最佳机制非常依赖于图表的性质,因此我将其留给另一个问题。