矩阵中的最短路径与作弊路径的障碍

时间:2017-04-11 11:23:02

标签: algorithm path breadth-first-search shortest

首先,这是一个辅助,我不是在寻找直接的答案,而是寻找最佳解决方案的复杂性,因为你可能会想到它。

这是已知的问题,即矩阵中的2个点之间的最短路径(开始和结束),同时在路上有障碍物。移动接受是向上,向下,向左和向右。让我们说,当我搬运时,每次运动的成本是2。矩阵中有点(我们将它们命名为B点),我可以将它留在一个B点,然后从另一个B点中取出。在B点倾倒的成本是1,从B点采集的成本再次为1。每当我没有这个动作时,我现在的行动成本是1。 我对解决方案的看法是将矩阵转换为树并应用BFS。然而,这没有B点。

每当我考虑到B点复杂性时,最坏的情况就是N ^ 2。 这是一个例子:

S - - -
- - - -
B - - B
- - O E

S =开始,E =结束,B = B指向下降,O =障碍物 所以我从S开始向下移动到B点(2 * 2 = 4点)离开B点(1点)向右移动(2 * 1 = 2点),拿起它(1点),向下移动2分=总共10分。

我认为是每个B点都有节点构建树,但这会创建一个非常密集的几乎(V-1)*(V-1)边的循环图,它取N ^ 2边界中的算法只是为了创建图表。 这是上面最糟糕的情况:

S b b b
b b b b
b b b b 
b b b E

我认为的另一个选择是首先计算没有B点的最短路径。 然后在每次迭代时进行迭代: 首先在S上有bfs,在B上最近 E上有BFS,B最近 然后查看最接近S的B和最接近E的B之间是否存在路径。 如果有,那么我会看到路径是否小于带有障碍物的常规最短路径。 如果那个更大那么没有最短路径(没有贪心测试)。 如果2个B点之间没有路径,请尝试第二个最接近S的路径,然后重试。 如果没有路径,第二个最接近E并且最接近S。 但是,在最糟糕的情况下,我无法计算这个复杂度,加上没有贪婪的测试来评估它。 任何帮助计算复杂性甚至指出最佳复杂性解决方案(不是解决方案而只是复杂性)都将非常感激

2 个答案:

答案 0 :(得分:0)

您的矩阵是图表的表示。没有作弊路径,很容易实现一个不错的BFS。实施作弊路径并不是什么大问题。只需在第一个上添加与另一个“层”相同的矩阵。底层是'进位',顶层是'无进位'。对于给定的成本,您只能在B点移动到另一层。这是具有第三维度的相同BFS。

每层有n ^ 2个节点和(n-1)^ 2个边,另外最多有n ^ 2个边连接各层。那是O(n ^ 2)。

答案 1 :(得分:0)

您可以构建一个新图形,其节点标记为(N,w),其中N是原始图形中的节点(因此矩阵中的位置),w = 0或1表示您是否携带重量。然后在此图中添加所有可能的边缘非常容易

这个新图的大小为2 * V,而不是V ^ 2(边数约为4 * V +数字(B))。

然后你可以使用最短路径算法,例如Dijkstra算法:复杂度O(E + V log(V)),在你的情况下是O(V log(V))。