【问题标题】:Visualize all short paths in graph using R使用 R 可视化图中的所有短路径
【发布时间】:2019-03-27 15:39:06
【问题描述】:

第一个简单的数据

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最长路为蓝线

【问题讨论】:

  • "从 C 到 A 的最长路径为蓝线" - 你想要从 C 到 A 的最长 简单 路径吗?由于您的图表有循环,除非您限制为简单路径,否则路径是任意长的。

标签: r igraph


【解决方案1】:

我会假设您想要从 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 可能需要很长时间才能运行并产生非常大的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多