1から10までの名前のグラフがあります
library(igraph)
library(Cairo)
graphics.off()
g<- graph(c(0,1,0,4,0,9,1,7,1,9,2,9,2,3,2,5,3,6,3,9,4,5,4,8,5,8,6,7,6,8,7,8),n=10,dir=FALSE)
V(g)$name<-c(1:10)
V(g)$label<-V(g)$name
coords <- c(0,0,13.0000,0,5.9982,5.9991,7.9973,7.0009,-1.0008,11.9999,0.9993,11.0002,7.9989,13.0009,10.9989,14.0009,5.9989,14.0009,7.0000,4.0000)
coords <- matrix(coords, 10,2,byrow=T)
plot(g,layout=coords)
すべての頂点の隣人から、次のことを行います。
listMn<-neighborhood(g,1,0:9)
m1<-V(g)[listMn[[7]]]$name # here I'm trying to name this array to don't confuse me
g<-add.edges(g, c(listMn[[7]][2],listMn[[7]][3])) # with 6 3 7 8 I take ids 2 and 3 from this array to add between 3 and 7 an edge,
# but it's really 4 and 8 if i want to continue with the names id.... :s
plot(g , layout = coords[V(g)$name,])
ここで、次のステップ「同型を見つける」を行い、頂点名 (7) を削除し、名前「9」と「4」の間に辺を追加します。
vc<-c(0,1,1,2,2,3,3,0,0,2)
gp<-graph(vc,dir=FALSE);
listSub<-graph.get.subisomorphisms.vf2(g,gp)
m<-matrix(c(unlist(listSub)),length(listSub),length(unique(vc)),byrow=T)
m<-m[!duplicated(m[,1]),]
この場合、最初の行 i=1 を使用すると、m[1,] から 9 ~ 4 個の名前の間にエッジを追加したいので、非常に混乱しますが、この場合は ID が変更されています
i<-1
if(length(neighbors(g,c(m[i,1])))==3){
found<-1
g<-delete.vertices(g,c(m[i,1]))
if(are.connected(g, c(m[i,2]),c(m[i,4]))==TRUE){
}else{
g<-add.edges(g, c(m[i,2],m[i,4]))
}
}else if(length(neighbors(g,c(m[i,3])))==3){
found<-1
g<-delete.vertices(g,c(m[i,3]))
if(are.connected(g, c(m[i,2]),c(m[i,4]))==TRUE){
}else{
g<-add.edges(g, c(m[i,2],m[i,4]))
}
}
plot(g , layout = coords[V(g)$name,])
結論として、頂点を削除して新しいエッジを追加する必要があるこのアルゴリズムの ID を処理する最良の方法は何ですか?