[英]Find total of second variable related to the distance of route from get.shortest.paths()
[英]Distance Matrix from second variable using get.shortest.paths()
我想进一步解决这个问题( 从get.shortest.paths()查找与路径距离有关的第二个变量的总和 )。 当使用newcost变量找到“最短”路径时,如何获得节点之间的距离矩阵?
(我对igraph的经验非常有限)。
df2 = rbind(c(234,235,21.6,75),
c(234,326,11.0,35),
c(235,241,14.5,78),
c(326,241,8.2,98),
c(241,245,15.3,75),
c(234,245,38.46,65))
df2 = as.data.frame(df2)
names(df2) = c("start_id","end_id","newcost","distance")
require(igraph)
g2 <- graph.data.frame(df2, directed=FALSE)
tmp2 = shortest.paths(g2,weights=E(g2)$newcost)
tmp2 #this gives the matrix of newcost-weighted shortest distances
我可以使用帮助的地方是如何找到所有路径,例如,使用optimal.path <- get.shortest.paths
,并使用sum(E(g2, path = optimal.path)$distance)
创建距离矩阵
我真正想要的是所有节点对的距离边缘列表,例如:
startid endid shortestdist
234 235 75
234 245 208
关于此问题的棘手问题是,使用newcost来查找最短路径,但是我想要的是另一个变量的总和-节点对之间每个最短路径上的距离变量。
好的,首先让我明确说明我自己不是igraph
用户。 不过,我认为这个问题很有趣,所以我想看看。 而且我也找不到解决您所遇到问题的简便方法。 最后,我做了一些辅助功能以使该过程成为可能。 我很有可能已经在igraph
重新编码了功能,但找不到。
让我首先定义get.shortest.paths.for.all
,它不仅会返回给定属性的最短路径长度,还将自己返回图中所有顶点的最短路径。 这是代码
get.shortest.paths.for.all<-function(graph, attr) {
paths<-lapply(1:(vcount(graph)-1), function(i) {
get.all.shortest.paths(
graph,
weights=get.edge.attribute(g2,attr),
from = V(graph)[i],
to = V(graph)[(i+1):vcount(graph)]
)$res
})
unsplit(paths, rep.int(seq_along(paths), sapply(paths, length)))
}
现在让我定义get.path.dist.matrix
将获取一个图形和一个路径列表(例如get.shortest.paths.for.all
返回的get.shortest.paths.for.all
),并计算每个路径之间给定属性的距离
get.path.dist.matrix<-function(graph, path, attr) {
dd<-get.adjacency(graph, attr=attr)
uniqs <- numeric(0)
if (is.list(path)) {
starts<-sapply(path, head, 1)
ends<-sapply(path, tail, 1)
uniqs <- unique(sort(c(starts,ends)))
} else {
uniqs <- c(head(path,1), tail(path,1))
}
m<-matrix(0, nrow=length(uniqs), ncol=length(uniqs),
dimnames=list(V(graph)$name[uniqs],V(graph)$name[uniqs]))
for(pp in path) {
m[pp[1], pp[length(pp)]]<-sum(dd[embed(pp,2)])
}
m+t(m)
}
使用您的样本数据,我像这样使用它们
paths <- get.shortest.paths.for.all(g2, "newcost")
get.path.dist.matrix(g2, paths,"distance")
# 234 235 326 241 245
# 234 0 75 35 133 208
# 235 75 0 176 78 153
# 326 35 176 0 98 173
# 241 133 78 98 0 75
# 245 208 153 173 75 0
这似乎是合理的,并且与shortest.paths(g2,weights=E(g2)$distance)
。 为了测试我的功能,我看到
all(tmp2==get.path.dist.matrix(g2, paths,"newcost"))
因此,请随时尝试这些,如果您发现任何问题或可能的改进,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.