使用igraph包计算带边权网络全节点距离矩阵的问题求助
正确实现步骤
核心错误原因
shortest.paths()第一个入参要求是igraph生成的网络对象,你传入了边数据框data,属于参数类型错误- 你未将边长度
km作为权重属性绑定到网络对象中,默认会计算无权跳数,无法得到实际距离结果 v和to参数设置错误,若需要所有节点对的距离矩阵,无需额外指定这两个参数,函数默认会计算全部节点两两之间的最短路径
正确实现代码(基于你已有的生成逻辑)
library(igraph) # 原有生成网络的代码 network <- graph_from_literal(1--2,2--3,3--4,4--5,3--6,6--7,3--8,8--9) # 原有边数据框 data <- data.frame(Origin=c(1,2,3,4,3,6,3,8), Destination=c(2,3,4,5,6,7,8,9), km=c(0.3,0.5,0.2,0.1,1,2,0.6,0.4)) # 给网络对象的边绑定权重(你用graph_from_literal生成的边顺序和data边顺序完全一致,可直接赋值) E(network)$km <- data$km # 计算带权重的全节点最短路径距离矩阵 distMatrix <- shortest.paths(network, weights = E(network)$km) # 打印验证结果 print(distMatrix)
更稳妥的实现方案(避免边顺序不匹配)
你可以直接用边数据框生成网络,无需手动拼接边和权重,避免顺序不一致导致的权重绑定错误:
library(igraph) data <- data.frame(Origin=c(1,2,3,4,3,6,3,8), Destination=c(2,3,4,5,6,7,8,9), km=c(0.3,0.5,0.2,0.1,1,2,0.6,0.4)) # 直接用边数据框生成无向网络,自动绑定km为边属性 network <- graph_from_data_frame(data, directed = FALSE) # 计算最短路径矩阵 distMatrix <- shortest.paths(network, weights = E(network)$km)
结果验证
比如节点1到节点7的最短路径为1-2-3-6-7,对应距离为0.3+0.5+1+2=3.8,查看distMatrix["1","7"]即可得到该数值,验证计算结果正确。
内容的提问来源于stack exchange,提问作者Tanya Valkanova
相关产品推荐
相关产品推荐

