使用R可视化图中的所有短路径

时间:2019-03-27 15:39:07

标签: r igraph

第一个简单数据

m <- read.table(row.names = 1, header = TRUE, text = 
                  "  A   B   C   D   E   F
                A 0   1   1   1   1   5
                B 1   0   1   1e2 1e2 1
                C 1   1   0   1   1   1
                D 1   1e2 1   0   1e2 1
                E 1   1e2 1   1e2 0   1
                F 5   1   1   1   1   0")
m <- as.matrix(m)

使用igraph库

ig <- graph.adjacency(m, mode = "undirected", weighted = TRUE, diag = FALSE)
sp <- shortest.paths(ig, algorithm = "dijkstra")
plot(ig)

spaths <- lapply(V(ig),
                 function(v){
                     all_shortest_paths(ig, v,
                                        weight = 1 / E(ig)$weight
                     )
                 }
           )

现在让我们检查到所有顶点spaths $ C $ res或spaths $ B $ res的路径...如何在图形上仅显示从一个点到另一点的最短路径? 1.例如从C到A为红线2.从C到A为蓝线的最长路径

1 个答案:

答案 0 :(得分:3)

我将假设您想要从C到A的最长 simple 路径。由于图形具有循环,因此如果您重新访问节点,路径的长度将任意设置。首先让我回答这个问题,但最后有一个警告。

您可以使用all_simple_paths获取从C到A的所有简单路径。从这些中,很容易选择最短路径之一和最长路径之一。然后给它们上色。

Simple = all_simple_paths(ig, "C", "A")
SP = which.min(sapply(Simple, length))
LP = which.max(sapply(Simple, length))

EL1 = rep(Simple[[LP]], each=2)[-1]
EL1 = EL1[-length(EL1)]
EL2 = rep(Simple[[SP]], each=2)[-1]
EL2 = EL2[-length(EL2)]

ECol = rep("gray", ecount(ig))
ECol[get.edge.ids(ig, EL1)] = "blue"
ECol[get.edge.ids(ig, EL2)] = "red"

plot(ig, edge.color=ECol)

Longest and Shortest paths colored

但是要警告!如果您的图很大且连接良好,则两个节点之间可能有许多条路径。 all_simple_paths可能需要很长时间才能运行并产生非常大的结果。