2017-05-16 72 views
0

我有一个有向循环矩阵,需要提取任何i和j之间的所有简单路径。从igraph检索路径名列表all_simple_paths

以下是我的前任。矩阵:

>M2<-matrix(c(1,1,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,1), 5, byrow=T) 
>colnames(M2)<-c("A", "B", "C", "D", "E") 
>row.names(M2)=colnames(M2) 
>M2 
    A B C D E 
A 1 1 0 0 0 
B 1 1 1 1 0 
C 0 1 1 1 0 
D 0 1 0 1 1 
E 0 0 0 1 1 

我使用igraph到矩阵转换为使用graph_from_adjency_matrix函数的曲线图的对象。

>graph<-graph_from_adjacency_matrix(M2, mode=c("directed"), weighted=NULL, diag=F, add.colnames=NULL, add.rownames=NA) 
>graph 
IGRAPH DN-- 5 9 -- 
+ attr: name (v/c) 
+ edges (vertex names): 
[1] A->B B->A B->C B->D C->B C->D D->B D->E E->D 

从那里我使用all_simple_paths函数来获取i和j之间的所有简单路径。这里开始我的问题。

1)我可以指定j(参数toto=V(graph))是所有可能的结束顶点。但我无法指定from参数来计算查找所有顶点的路径有可能的起点。我必须一次性指定每个变量。任何解决方案

2)all_simple_path函数运行良好,给我所有简单的路径之间我和j,例如开始在A,在任何可能的Ĵ结束的简单路径:

>Simple_path_list<-all_simple_paths(graph, from ="A", to=V(graph), mode = c("out")) 
>Simple_path_list 
[[1]] 
+ 2/5 vertices, named: 
[1] A B 

[[2]] 
+ 3/5 vertices, named: 
[1] A B C 

[[3]] 
+ 4/5 vertices, named: 
[1] A B C D 

[[4]] 
+ 5/5 vertices, named: 
[1] A B C D E 

[[5]] 
+ 3/5 vertices, named: 
[1] A B D 

[[6]] 
+ 4/5 vertices, named: 
[1] A B D E 

我的问题是,我需要收集所有这些路径,并把名单上,如:

Paths 
A B 
A B C 
A B C D 
A B C D E 
A B D 
A B D E 

我试图创建一个列表并使用正常的list<-Simple_path_list[1]左右调用路径名称,但我总是会检索与路径相关的顶点数量信息(例如,+ 4/5 vertices, named)。关于如何仅检索路径名称而不检索其他信息的任何想法?

+0

确定,通过使用 '> lapply(V(图形),函数(X)all_simple_paths(图中,从= X)中发现的答案的点1) )' 它给出了每个开始变量的所有可能的简单路径的列表。 –

回答

0

all_simple_paths上的lapply函数列出了列表(即每个顶点的路径列表)。使用unlist(..., recursive = F)简化列表清单,然后使用namesigraphas_ids来提取顶点ID独奏。

library(igraph) 
M2<-matrix(c(1,1,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,1), 5, byrow=T) 
colnames(M2)<-c("A", "B", "C", "D", "E") 
row.names(M2)=colnames(M2) 
M2 
graph<-graph_from_adjacency_matrix(M2, mode=c("directed"), weighted=NULL, diag=F, add.colnames=NULL, add.rownames=NA) 
l <- unlist(lapply(V(graph) , function(x) all_simple_paths(graph, from=x)), recursive = F) 
paths <- lapply(1:length(l), function(x) as_ids(l[[x]])) 

这产生:

> paths 
[[1]] 
[1] "A" "B" 

[[2]] 
[1] "A" "B" "C" 

[[3]] 
[1] "A" "B" "C" "D" 

[[4]] 
[1] "A" "B" "C" "D" "E" 

[[5]] 
[1] "A" "B" "D" 

[[6]] 
[1] "A" "B" "D" "E" 

[[7]] 
[1] "B" "A" 

[[8]] 
[1] "B" "C" 

[[9]] 
[1] "B" "C" "D" 

[[10]] 
[1] "B" "C" "D" "E" 

[[11]] 
[1] "B" "D" 

[[12]] 
[1] "B" "D" "E" 

[[13]] 
[1] "C" "B" 

[[14]] 
[1] "C" "B" "A" 

[[15]] 
[1] "C" "B" "D" 

[[16]] 
[1] "C" "B" "D" "E" 

[[17]] 
[1] "C" "D" 

[[18]] 
[1] "C" "D" "B" 

[[19]] 
[1] "C" "D" "B" "A" 

[[20]] 
[1] "C" "D" "E" 

[[21]] 
[1] "D" "B" 

[[22]] 
[1] "D" "B" "A" 

[[23]] 
[1] "D" "B" "C" 

[[24]] 
[1] "D" "E" 

[[25]] 
[1] "E" "D" 

[[26]] 
[1] "E" "D" "B" 

[[27]] 
[1] "E" "D" "B" "A" 

[[28]] 
[1] "E" "D" "B" "C" 
+0

非常感谢@Paqmo这两个修正(我直接从我的txt文件复制,忘记更正名称,所以感谢修复),非常感谢您的答案。这工作非常好! –