2013-12-19 3 views
1

Я создал случайную сеть (Erdos-Renyi), которая имеет 100 узлов. Я установил значение атрибута для всех 100 узлов как 0. Я нахожу узел с максимальной степенью (большинство соседей) и изменяю его значение атрибута от 0 до 1. Затем, используя узел в качестве корневого узла, я делаю первый поиск по ширине (BFS) в сети.Изменение значений атрибутов узлов в сети при первом поиске по ширине в R

Вот мой код, чтобы сделать это до сих пор:

# Loads the igraph package 
library(igraph) 

# Creates a random (Erdos-Renyi) network with 100 nodes and edges with p = 0.2 
graph <- erdos.renyi.game(100, 0.2, type = c("gnp", "gnm"), directed = FALSE, 
    loops = FALSE) 

# Sets the attributes of all the nodes to 0 
graph <- set.vertex.attribute(graph, "value", value = 0) 

# Determines the maximum degree 
max_deg <- max(degree(graph)) 

# The node with the maximum degree becomes the root node for the BFS, and changes 
# its value from 0 to 1 
root_node <- which(degree(graph) %in% c(max_deg)) 
V(graph)$value[root_node] = 1 - V(graph)$value[root_node] 

# BFS on the network 
bfs <- graph.bfs(graph, root = root_node, unreachable = FALSE, order = TRUE, 
    dist = TRUE) 

Как проходит через каждый узел сети, я хочу, чтобы изменить значение атрибута узла он смотрит на от 0 до 1. Я не уверен, как это сделать.

Любая помощь будет высоко оценена.

Заранее спасибо.

+0

Что вы подразумеваете под термином "it is looking at"? BFS «смотрит» на все вершины, доступные из корня. –

+0

@GaborCsardi - Я хочу изменить значение атрибута узла, на который он смотрит в данный момент, прежде чем он перейдет к следующему узлу. Должен ли я использовать обратный вызов для этого? Если он не может этого сделать, есть ли другой способ достичь этого без использования BFS? – LoneWolf

+0

Вы не можете изменить график во время работы BFS. igraph объекты неизменяемы, как и большинство объектов в R. –

ответ

1

Попробуйте это:

for (i in 1:100) { 
    if (is.nan(bfs$dist[i]) == FALSE) { 
     V(graph)$value[i] = 1 - V(graph)$value[i] 
    } 
} 

Это в основном просто проверяет, является ли узел подключен к корневому узлу. Если это так, его значение атрибута изменяется на 1, а если нет, то его значение атрибута остается неизменным.

+0

** Очень неэффективное решение. R имеет векторы, используйте их: 'V (graph) $ value <- ifelse (is.nan (bfs $ dist), V (graph) $ value, 1-V (graph) $ value)'. –

 Смежные вопросы

  • Нет связанных вопросов^_^