Я работал над онлайн-примером, где вирус распространяется по графику. Примера достаточно для небольшого графа, то есть небольшого количества ребер и узлов. Но я попробовал это на очень большом графе, то есть 10000 узлов и 20000 ребер, но приведенной ниже функции недостаточно для большого графа, потому что он медленный.
Мой вопрос: как можно преобразовать приведенную ниже функцию в векторизованный код, который можно оптимизировать для больших графиков?
spreadVirus <- function(G,Vinitial,Activation_probability){
# Precompute all outgoing graph adjacencies
G$AdjList = get.adjlist(G,mode="out")
# Initialize various graph attributes
V(G)$color = "blue"
E(G)$color = "black"
V(G)[Vinitial]$color <- "yellow"
# List to store the incremental graphs (for plotting later)
Glist <- list(G)
count <- 1
# Spread the infection
active <- Vinitial
while(length(active)>0){
new_infected <- NULL
E(G)$color = "black"
for(v in active){
# spread through the daily contacts of vertex v
daily_contacts <- G$AdjList[[v]]
E(G)[v %->% daily_contacts]$color <- "red"
for(v1 in daily_contacts){
if(V(G)[v1]$color == "blue" & new_color=="red") {
V(G)[v1]$color <- "red"
new_infected <- c(new_infected,v1)
}
}
}
# the next active set
#this needed for updating
active <- new_infected
# Add graph to list
# optional dependening on if i want to graph
count <- count + 1
Glist[[count]] <- G
}
return(Glist)
}
Мой вопрос: как можно оптимизировать приведенную ниже функцию для больших графиков?
Спасибо Муна