R语言igraph计算有向图顶点间最短路径距离结果异常
问题根因
出现反向无路径却返回距离值的问题,核心是distances()函数的默认参数未适配有向图计算逻辑:
distances()的mode参数默认值为all,该模式下计算路径时会完全忽略边的方向,将所有边视为双向可通行,因此从"ar"到"a"也会算出10的结果。你之前运行distances(g, "a", to="ar")返回10只是碰巧和预期一致,本质也是按无向规则计算的结果。- 有向图场景下,若要计算顺着边指向的最短路径,需要手动将
mode参数设置为out;若要计算逆着边指向、指向起点的路径,可将参数设置为in。
修正代码
基于你提供的测试样例,符合有向图逻辑的调用方式如下:
library(igraph) library(dplyr) # 构建测试有向图 v1 = c("a","b") v2 = c("ar","br") weight = c(10,10) test_df = data.frame(v1, v2, weight) g <- test_df %>% graph_from_data_frame(directed = TRUE) # 沿边方向计算a到ar的距离,返回结果10 distances(g, v = "a", to = "ar", mode = "out") # 沿边方向计算ar到a的距离,无有效连通路径,返回Inf,符合有向图预期 distances(g, v = "ar", to = "a", mode = "out")
便捷获取单条最短路径距离的方法
如果只需要计算单对节点的最短路径距离,不需要批量计算全图节点对的距离,可以直接用distance()函数,调用逻辑和distances()一致,返回值就是单对节点的标量距离,不需要从结果矩阵里取值。
如果你已经通过最短路径遍历拿到了路径的顶点序列,也可以直接对路径上的边权重求和得到距离,不需要重复跑路径算法。
提示:igraph中所有涉及路径遍历的函数(包括
shortest_paths()、bfs()、dfs()、ego()等)默认mode参数均为all,只要处理有向图,都需要手动指定mode参数,否则都会默认按无向图逻辑计算。
内容的提问来源于stack exchange,提问作者gabriel
相关产品推荐
相关产品推荐

