寻路任务-如何以比O(n)更快的速度在从A到B的最短路径上找到下一个顶点?

时间:2018-07-06 15:03:13

标签: algorithm graph path-finding planar-graph

我有一个很棘手的任务要解决:

为您提供N * M板(1 <= N,M <= 256)。您可以从每个字段移动到它的相邻字段(不允许对角移动)。最初,有两种类型的字段:活动字段和阻止字段。您可以通过活动字段,但不能继续进行被阻止的字段。您有Q个查询(1 <= Q <= 200)。查询有两种类型:

1)找到位于从字段A到B的最短路径上的下一个字段(与A相邻)

2)将字段A从活动更改为阻止或相反。

第一个类型的查询可以用O(N * M)时间的简单BFS轻松解决。我们可以将活动字段和阻止字段表示为0或1,因此第二个查询可以在固定时间内完成。

该算法的总时间为O(Q(查询数)* N * M)。

那是什么问题?我有1/60秒的时间来解决所有查询。如果我们将1秒视为10 ^ 8计算,则剩下大约1.5 * 10 ^ 6计算。一个BFS最多需要N * M * 4的时间,大约是2.5 * 10 ^ 5。因此,如果Q为200,则所需的计算可能高达5 * 10 ^ 7,这太慢了。

据我所知,在这种情况下,没有比BFS更好的寻路算法了(嗯,我可以选择A *,但我不确定它是否比BFS快得多,但仍然是最坏的情况(| E |)-根据Wikipedia)。因此,在这方面没有太多要优化的地方。但是,我可以以某种方式更改图形,以减少算法必须处理的边数量(我不需要知道完整的最短路径,只需要下一步就可以了,所以剩下的最短路径路径可以非常简化)。我当时在考虑一些预处理-将顶点分组并制作图形图,但是我不确定如何以这种方式处理被阻塞的字段。

如何更好地对其进行优化?还是有可能?

编辑:实际问题:板上有一些单元。我想开始将它们移动到选定的目的地。单位不能共享同一字段,因此一个单位可以阻止他人的路径或为他们打开一条新的更好的路径。可能有很多单位,这就是为什么我需要更好的优化。

1 个答案:

答案 0 :(得分:0)

如果我对问题的理解正确,您是否想在网格上找到从A到B的最短路径,并且您的寻路器可以移除墙而增加移动能力呢?

您可以将其视为有向图问题,可以以2的成本移入任何墙节点,以1的成本移入任何正常节点,然后只需使用任何有向图寻路算法即可,例如Dijkstra或A * (通常的启发式距离,曼哈顿仍然有效)