使用Dijkstra算法在网格上寻路

时间:2014-09-30 16:51:54

标签: c++ algorithm dijkstra path-finding

这次Dijkstra的路径发现再次出现问题

我在不同的网站上阅读过Dijkstra及其应用程序。 它主要针对图形进行了解释,并找出了源节点中所有节点的最短路径。

我无法弄清楚如何使用Dijkstra在网格上寻找路径,如Wikipedia picture所述。

因为在网格上我们有一个目的地,我们必须从源头找出它的最短距离。我无法将它与Dijkstra的图表联系起来。 没有瓷砖被标记为INFINITY或将距离与其他路径/节点进行比较。

简而言之,我们如何使用Dijkstra来使用定义此算法的实际图算法在网格中查找路径。 我们是否像BFS一样继续称它为Dijkstra's网格,还是有区别?因为我无法弄明白:/

谢谢:)

1 个答案:

答案 0 :(得分:4)

为了在网格中应用dijkstra算法,不需要任何修改,因为网格是一个图形,其中节点(单元格)具有4/8个子节点(取决于您的连接性),它们是邻居。因此,您所要做的就是:选择您的根节点(从哪里开始),为其赋值0然后评估4/8个邻居,使用仅为1的成本(如果对于4个对等邻居,则使用sqrt(2)你正在使用8连接)。必须将此根节点标记为已访问,并将评估的邻居标记为打开。然后,您选择具有最小值的已评估节点(单元格)(在这种情况下,所有节点都具有值1),因此您可以选择其中任何一个。将邻居添加到打开列表时,会发生其中一些neigbors已经被访问过,所以你只需忽略它们。如果已经在打开列表中,则重新计算它们的值,如果它们未被访问,则计算它们的值并将它们添加到打开状态,并将当前节点标记为已关闭。

事实上,你会发现你用图表阅读的通用Dijkstra算法没有任何区别。

注意:为了在获得开放列表的最小值时有效,建议使用堆(通常是二进制堆),而不是在每次迭代时沿着所有开放节点运行min函数。