2013-12-08 42 views
1

我使用R(和igraph包)創建了一個具有100個節點的隨機(Erdos-Renyi)網絡。每個節點已被隨機分配了0或1的屬性。將簡單多數規則應用於隨機網絡中的節點使用R

我需要在這些節點上應用簡單多數規則,以便如果大多數節點的鄰居具有屬性0,那麼節點的屬性會發生變化也可以爲0(如果大多數爲1,則爲1)。它需要按照它們的編號(1-100)反覆遍歷網絡中的所有節點,並應用簡單多數法則。

此外,我不知道如何反覆遍歷每個節點,直到節點停止更新。

有人可以提出解決方案嗎?

非常感謝提前。

+4

SO並不是一羣可以根據(模糊)規範爲您編寫代碼的代碼寫作精靈。在請求解決方案之前,請演示您嘗試解決問題的方法。 –

+1

請閱讀一些指導原則:[** here **](http://stackoverflow.com/help/on-topic),[** here **](http://meta.stackoverflow.com/help/how-to-ask)和[** here **](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。 [「詢問代碼的問題必須包括嘗試的解決方案,爲什麼他們不工作,以及預期的結果」](http://stackoverflow.com/help/on-topic) – Henrik

回答

1

你可以嘗試這樣的事情對於一個圖G:

for (i in 1:100) { 
    ones <- 0 
    zeros <- 0 

    #look through the neighbors of the node and count how many ones and zeros it 
     #is connected to   

    modified = FALSE 

    if (ones > zeros) { 
     if (V(g)$value[which(V(g) == i)] == 0) { 
      modified = TRUE 
      V(g)$value[which(V(g) == i)] = 1 
     } 
    } else if (ones < zeros) { 
     if (V(g)$value[which(V(g) == i)] == 1) { 
      modified = TRUE 
      V(g)$value[which(V(g) == i)] = 0 
     } 
    } 
} 

我不會寫代碼通過鄰居看並計算它連接到的節點數量。你可以輕鬆地做到這一點。

但是我提供的代碼會遍歷所有您正在查看的節點的相鄰節點,並根據其相鄰節點的值將其屬性值更改爲0或1。

2

粗略看看你的代碼,告訴我你的代碼應該工作(但我不熟悉igraph包)。

一對夫婦的可能性我能想到的:

  1. set.vertex.attribute不工作,你期望的方式
  2. 所有節點都已經簡單多數他們的鄰居。

要評估這兩種情況,當您檢查條件one > zero時,還應該檢查結果是否確實正在更改節點。

這也將有助於你以後當你將此規則應用於網絡,直到沒有什麼變化:只需創建一個標誌,modified = FALSE,然後將其設置爲TRUE如果任何節點被更新。然後,您可以簡單地包裝現有的代碼在while循環:while(!modified)

+0

在最後的if語句裏,你想要來檢查節點的'get.vertex.attribute'是否與您現在設置的屬性相同。即如果一個節點的簡單大部分爲1,並且其'get.vertex.attribute'爲0,則可以將修改後的標誌設置爲'TRUE',反之亦然。 然後,在開始的while循環的每次迭代中,將標誌重置爲「FALSE」。這樣,每次獲得所有十個節點中的簡單多數時,您可以看到之後是否有更新。 –

+0

不,你需要檢查它是否被修改,而不僅僅是設置標誌。 –

+0

我會在第一個條件中描述它:'one> zero'。只需更改第二個條件的數字即可。 在將節點的屬性賦值爲1('V(graph)$ value [which(V(graph)== i)] = 1')之前,首先檢查節點*是否已經是* 1。如果不是,設置'modified'爲'TRUE':if(V(graph)$ value [which(V(graph)== i)] == 0){modified = TRUE} else {V(graph)$ value [which V(圖)== i)] = 1}' –

相關問題