2017-05-16 74 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文件複製,忘記更正名稱,所以感謝修復),非常感謝您的答案。這工作非常好! –