Функция R для удаления узлов из сети один за другим и вывода наибольшего подключенного компонента - PullRequest
0 голосов
/ 13 июня 2018

Мне нужно смоделировать влияние удаления узлов из сети в igraph в R на основе различных атрибутов узлов.Ниже я создал функцию, которая создает матрицу, основанную на узлах и их соответствующей центральности между ними, упорядочивает это и затем должна циклически проходить через каждый узел в матрице, удалять узел и вычислять размер наибольшего подключенного компонента, распечатывая этот вывод для анализа.,

testbet<- function(g){
  n<-length(V(g))
  mat<- matrix(ncol=2,nrow=n, 0) #betweenness attack
  mat[,1]<-1:n
  bet<-betweenness(g)
  mat[,2]<-bet
  matri<-mat[order(mat[,2]),]
  g2<-g
  for(i in 1:n){
    v=n+1-i
    g2<-delete.vertices(g2, matri[v,1])
    maxcsize2<-max(clusters(g2)$csize)
    print(maxcsize2)
  }
}

Когда он запускается, он начинает печатать вывод до определенной точки, а затем я получаю сообщение об ошибке:

Error in .Call("R_igraph_delete_vertices", graph, as.igraph.vs(graph,  : 
  At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id
Called from: .Call("R_igraph_delete_vertices", graph, as.igraph.vs(graph, 
    v) - 1, PACKAGE = "igraph")

Любая помощь по этому вопросу будет принята с благодарностью, поскольку я 'Я очень застрял.

1 Ответ

0 голосов
/ 13 июня 2018

Я думаю, что ваша ошибка возникает из-за того, что идентификаторы вершин в g2 динамически восстанавливаются, поэтому даже если вы удаляете вершину 41, идентификаторы сбрасываются до 1:99, а затем, когда вы идете, чтобы удалить вершину 100 вы получаете ошибку.Вы можете обойти это, дав вершинам своего графа уникальный атрибут имени и индексировав его вместо этого.

library(igraph)

g <- random.graph.game(100, 0.2)

V(g)$names <- paste0("v", 1:length(V(g))) #assign unique name


  testbet <- function(g){
  n <- length(V(g))
  mat <- matrix(ncol=2,nrow=n, 0)
  mat[,1] <- V(g)$names #add vertex name to matrix
  bet <- betweenness(g)
  mat[,2] <- bet
  matri <- mat[order(mat[,2], decreasing = TRUE),]
  g2 <- g
  clustersizes<-integer(n-1)
  for(i in 1:(n-1)){
    g2 <- delete.vertices(g2, v=which(V(g2)$names==matri[i,1])) #index by name
    maxcsize2 <- max(clusters(g2)$csize)
    clustersizes[i]<-maxcsize2
    }
  df<-as.data.frame(cbind(matri, c(clustersizes, NA)))
  names(df)<-c("vertex_removed", "betweenness", "maxcsize")
  return(df)
 }

df<-testbet(g)  
...