关于IGraph最短路径计算,我缺少一些东西。
假设我生成一个网络(在stackoverflow中的某个地方找到)并执行简单的计算:
library(igraph);
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David", "David", "Esmeralda"), to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"));
g = simplify(graph_from_data_frame(d=relations, directed=T), remove.multiple = F, remove.loops = T);
#plotting the network in order to appreciate the directions of the edges
plot(g,edge.arrow.size=0.5);
#V(g)[5] is "Alice" which apparently should not be able to reach any node
print(all_shortest_paths(g,from=V(g)[5],to=V(g),mode="all")$res);
如您所见,找到的最短路径是:
> print(all_shortest_paths(g,from=V(g)[5],to=V(g),mode="all")$res);
[[1]]
+ 2/5 vertices, named, from 823c15d:
[1] Alice Bob
[[2]]
+ 2/5 vertices, named, from 823c15d:
[1] Alice Cecil
[[3]]
+ 2/5 vertices, named, from 823c15d:
[1] Alice David
[[4]]
+ 2/5 vertices, named, from 823c15d:
[1] Alice Esmeralda
[[5]]
+ 1/5 vertex, named, from 823c15d:
[1] Alice
我期望的是,不应该返回最短的路径,因为在有向图中,爱丽丝没有从其自身伸出的边缘。 这是由于以下事实:当我计算最短路径时,我正在使用以下选项:
mode="all"
这甚至可以用于有向图吗?
当然,如果我更改图形构造并设置:
directed=F
即
library(igraph);
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David", "David", "Esmeralda"), to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"));
g = simplify(graph_from_data_frame(d=relations, directed=F), remove.multiple = F, remove.loops = T);
#plottin the network in order to appreciate the directions of the edges
plot(g,edge.arrow.size=0.5);
#V(g)[5] is "Alice" which apparently should not be able to reach any node
print(all_shortest_paths(g,from=V(g)[5],to=V(g),mode="all")$res);
返回相同的结果。
这是怎么回事?我是否太累了,无法直截了当?
答案 0 :(得分:0)
这就是mode="all"
的含义-使用所有边缘而不管方向如何。
我将使用一个更简单的图形来轻松查看正在发生的情况。
rel2 <- data.frame(from=c("Bob", "Bob", "David"),
to=c("Alice", "Carol", "Carol"))
g = simplify(graph_from_data_frame(d=rel2, directed=T))
LO = layout_as_bipartite(g, types=c(F,F,T,T))
plot(g, layout=LO)
现在有了最短路径声明
print(all_shortest_paths(g,from=V(g)[3],to=V(g),mode="all")$res)
[[1]]
+ 2/4 vertices, named:
[1] Alice Bob
[[2]]
+ 4/4 vertices, named:
[1] Alice Bob Carol David
[[3]]
+ 1/4 vertex, named:
[1] Alice
[[4]]
+ 3/4 vertices, named:
[1] Alice Bob Carol
我们获得了将爱丽丝连接到另一个节点的所有路径,即使边缘的方向相反。
我认为您想要的是:
print(all_shortest_paths(g,from=V(g)[3],to=V(g),mode="out")$res)
[[1]]
+ 1/4 vertex, named:
仅给出从爱丽丝到其自身的零长度路径。
仅出于完整性考虑,
print(all_shortest_paths(g,from=V(g)[3],to=V(g),mode="in")$res)
[[1]]
+ 2/4 vertices, named:
[1] Alice Bob
[[2]]
+ 1/4 vertex, named:
[1] Alice
这仅使用进入的边沿路径,因此我们使用进入Alice的边将路径从“ Alice”到“ Bob”获得,但是我们没有得到任何其他东西,因为Bob没有边。