SI モデルを使用して、グラフ上の情報の拡散を測定したいと考えています。i 最初に感染したノードのセットを定義します。私はこのコードに基づいていました:ネットワーク拡散のための感染しやすいモデルが適切に開発されました。しかし、5000 ノードのグラフでコードを実行すると、数時間実行されます。これが私のコードです:
get_infected1 = function(g, transmission_rate, diffusers){
infected=list()
Susceptible<-setdiff(V(g)$name,diffusers)
toss = function(freq) {
tossing = NULL
coins = c(1, 0)
probabilities = c(transmission_rate, 1-transmission_rate )
for (i in 1:freq ) tossing[i] = sample(coins, 1, rep=TRUE, prob=probabilities)
tossing = sum(tossing)
return (tossing)
}
infected[[1]] = diffusers
update_diffusers = function(diffusers){
nearest_neighbors<-data.frame()
for (i in 1:length(diffusers)){
L<-as.character(diffusers[i])
Nei1 <- unique(neighbors(g,(V(g)$name == L),1))
Nei1<-intersect(Susceptible,Nei1)
nearest_neighbors1 = data.frame(table(unlist(Nei1)))
nearest_neighbors = unique(rbind(nearest_neighbors,nearest_neighbors1))
}
nearest_neighbors = subset(nearest_neighbors, !(nearest_neighbors[,1]%in%diffusers))
keep = unlist(lapply(nearest_neighbors[,2],toss))
new = as.numeric(as.character(nearest_neighbors[,1][keep >= 1]))
for (j in 1:length(new)){ #fill the vector
c<-new[j]
vec[j]<-V(g)$name[c]
}
new_infected = as.vector(vec)
diffusers = unique(c(diffusers, new_infected))
return(diffusers)
}
# get infected nodes
total_time = 1
node_number=vcount(g)
while(length(Susceptible) > 0){
infected[[total_time+1]] = sort(update_diffusers(infected[[total_time]]))
Susceptible<-setdiff(Susceptible, infected[[total_time+1]])
total_time = total_time + 1
}
# return the infected nodes list
return(infected)
}
最初に感染したノードの各ノードは、ある程度の確率で隣接ノードに感染するため、出力として、各ステップで感染したノードのリストを取得します。
このコードを RHadoop システムで実行できるように調整したいと考えています。しかし、私はRHadoopの初心者です。正確にどこを変更すればよいかわかりません。また、Hadoop でグラフを導入するにはどうすればよいですか?? 提案をお願いします。