1

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 でグラフを導入するにはどうすればよいですか?? 提案をお願いします。

4

0 に答える 0