Algorithm 关于无向图的KSPA建议
KSPA有一个自定义实现,需要重新编写。当前的实现使用了一种改进的Dijkstra算法,其伪代码将在下面大致解释。它通常被称为使用边缘删除策略的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(最短路径树)。这可以通过检查所考虑组合
步骤:-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'路径
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