繁体   English   中英

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

[英]Visualize all short paths in graph using R

第一个简单的数据

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 ...如何在图表上只显示从一个点到另一个点的一条最短路径? 例如,从C到A为红线2.从C到A的最长路为蓝线

我将假设您需要从C到A的最长的简单路径。由于图形具有循环,因此如果重新访问节点,则存在任意大长度的路径。 让我先回答这个问题,但最后还是有一个警告。

您可以使用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)

最长和最短路径着色

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM