Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 关于无向图的KSPA建议_Algorithm_Graph Theory_Shortest Path - Fatal编程技术网

Algorithm 关于无向图的KSPA建议

Algorithm 关于无向图的KSPA建议,algorithm,graph-theory,shortest-path,Algorithm,Graph Theory,Shortest Path,KSPA有一个自定义实现,需要重新编写。当前的实现使用了一种改进的Dijkstra算法,其伪代码将在下面大致解释。它通常被称为使用边缘删除策略的KSPA,我认为是这样。(我是图论的新手) 步骤:-1。使用Dijkstra算法计算任意给定节点对之间的最短路径。这里k=0。 步骤:-2。设置k=1 步骤:-3。从所有“k-1”最短路径树中提取所有边。将其添加到链接列表边缘列表中。 步骤:-4。从要立即删除的边列表中创建“k”条边的组合,使每条边属于不同的SPT(最短路径树)。这可以通过检查所考虑组合

KSPA有一个自定义实现,需要重新编写。当前的实现使用了一种改进的Dijkstra算法,其伪代码将在下面大致解释。它通常被称为使用边缘删除策略的KSPA,我认为是这样。(我是图论的新手)

步骤:-1。使用Dijkstra算法计算任意给定节点对之间的最短路径。这里k=0。
步骤:-2。设置k=1
步骤:-3。从所有“k-1”最短路径树中提取所有边。将其添加到链接列表边缘列表中。
步骤:-4。从要立即删除的边列表中创建“k”条边的组合,使每条边属于不同的SPT(最短路径树)。这可以通过检查所考虑组合的每个边的“k”值来实现。对于所选组合的每条边,“k”值必须不同。
步骤:-5。从内存中的图形中临时删除在上述步骤中选择的边的组合。
步骤-6。为步骤:-1中相同的一对节点重新运行Dijkstra。
步骤:-7。将结果路径添加到临时路径列表中。路径列表。
步骤:-8。将删除的边恢复回图形中。
步骤:-9。转到步骤:-4以获取另一个要删除的边组合,直到所有唯一的组合都用尽为止。这只是在“n”个边=>nCr中一次选择“r”个边。
步骤:-10。第k+1条最短路径=最小路径(路径列表)。
步骤:-11。k=k+1转到步骤:-3,直到k
根据我对算法的理解,为了获得第k条最短路径,在每个源-目的地对之间找到“k-1”SPT,并且对于每个组合,同时删除来自一个SPT的“k-1”边。 显然,该算法具有组合复杂性,并且会在大型图上阻塞服务器。人们建议我使用Eppstein的算法()。但这份白皮书引用了一个“有向图”,我没有看到有人提到它只适用于有向图。我只是想问问这里的人们,是否有人在无向图上使用过这种算法

如果没有,是否有好的算法(在时间复杂度方面)在无向图上实现KSPA

提前感谢,

时间复杂度:O(K*(E*log(K)+V*log(V)))

存储器复杂度为O(K*V)(+O(E)用于存储输入)

我们执行修改后的Djikstra,如下所示:

  • 对于每个节点,不保留从起始节点开始的当前已知路由成本。我们保持从起始节点开始的最佳K条路由
  • 当更新一个节点的邻居时,我们不检查它是否改善了当前已知的最佳路径(就像Djikstra那样),我们检查它是否改善了K'当前已知的最佳路径中最差的路径
  • 在我们已经处理了一个节点的K条最佳路由中的第一条之后,我们不需要找到K条最佳路由,只剩下K-1条,然后是另一条K-2条。这就是我所说的“K”
  • 对于每个节点,我们将保留两个优先级队列,用于K'当前最已知的路径长度。
    • 在一个优先级队列中,最短路径位于顶部。我们使用此优先级队列来确定K'中的哪一个是最好的,并将作为节点的代表在常规Djikstra的优先级队列中使用
    • 在另一个优先级队列中,最长路径位于顶部。我们用这个来比较候选路径和最差的K'路径

无向图基本上是每个边都加倍的有向图,对吗?你链接的算法应该没有问题。是的。但是有人在algo上工作过,他告诉我它使用了一种特殊的分布技术,这种技术可能对无向图不起作用。所以,我想看看是否有人真的把它应用到了无向图上。但我会退房的。实现正在进行中…Eppstein算法仅适用于非循环图。虽然无向图是一个在两个方向上都有边的有向图,但由于圈的存在,分布技术失败了。嗯,肯定比我在这里能想到的要好。对于大型图形,节省似乎是非常重要的。您能否通过重构公共逻辑并在一个答案中说明这两个优化来完成这个答案。我们将看看是否有人有更好的想法;我已经给你加了25分了@Abhay:前面算法的优化与这个算法无关,所以我不确定你所说的“在一个答案中陈述两个优化”是什么意思。只需将它们分别表述为优化方法1和2。我建议这样做的唯一原因是要有一个完整的答案,而不是两个都读。@Abhay:我想最好的办法是删除我以前的答案。此算法优于前一个算法,因此在描述更差的算法时没有太多用处
Step:-1.  Calculate the shortest path between any given pair of nodes using the Dijkstra algorithm. k = 0 here.
Step:-2.   Set k = 1
Step:-3.   Extract all the edges from all the ‘k-1’ shortest path trees. Add the same to a linked list Edge_List.
Step:-4.  Create a combination of ‘k’ edges from Edge_List to be deleted at once such that each edge belongs to a different SPT (Shortest Path Tree). This can be done by inspecting the ‘k’ value for each edge of the combination considered. The ‘k’ value has to be different for each of the edge of the chosen combination.
Step:-5.   Delete the combination of edges chosen in the above step temporarily from the graph in memory.
Step:-6.   Re-run Dijkstra for the same pair of nodes as in Step:-1.
Step:-7.   Add the resulting path into a temporary list of paths. Paths_List.
Step:-8.   Restore the deleted edges back into the graph.
Step:-9.   Go to Step:-4 to get another combination of edges for deletion until all unique combinations are exhausted. This is nothing but choosing ‘r’ edges at a time among ‘n’ edges => nCr.
Step:-10. The ‘k+1’ th shortest path is = Minimum(Paths_List).
Step:-11. k = k + 1 Go to Step:-3, until k < N.
Step:-12. STOP