2016-12-22 29 views
0

我正在我的網絡x上工作。問題是: 考慮圖19.27中描述的網絡;假設每個節點以行爲B開始,並且每個節點具有用於切換到行爲A的q = 1/2的閾值。(a):現在,令e和f形成初始採納者的雙節點集合S的行爲A.如果其他節點遵循閾值規則選擇行爲,哪個節點最終將切換到A?我沒有得到正確的節點與我的網絡x代碼

這是網絡的地方是所有關於:

network pic

現在,我知道這個問題的答案是{ 'C', 'E', 'F', '我' ,'k'} 但是從我的代碼中,我只能得到{'c','e','f','i'},怎麼了?

# Network, dit is de figuur 19.27 van chapter 19 voor vraag 19.8 
def create_network(): 
    H = nx.Graph() 
    H.add_edge('e', 'i') 
    H.add_edge('e', 'c') 
    H.add_edge('c', 'f') 
    H.add_edge('i', 'f') 
    H.add_edge('f', 'g') 
    H.add_edge('i', 'k') 
    H.add_edge('k', 'j') 
    H.add_edge('g', 'j') 
    H.add_edge('g', 'd') 
    H.add_edge('j', 'h') 
    # Voegt de edges toe zoals die in figuur 19.27 van Chapter 19 afgebeeld is. 
    H.add_edge('d', 'h') 

    for n in {'e', 'f'}: # Initial adaptors 
     # True betekent dat de node the nieuwe Behavior heeft geadopt 
     H.node[n]['new'] = True 
    for n in set(H.nodes()) - {'e', 'f'}: # initial adaptors 
     # False betekent dat de node de nieuwe Behavior Reject, dus de node 
     # blijft bij de oorspronkelijke behavior 
     H.node[n]['new'] = False 

    nx.draw(H, with_labels=True) # De output 

    return H 

H = create_network() 

# Het netwerk dat na een ronde adaption testen een update uitvoert of de 
# eventueel toegevoegde nodes na de adaption 
def adapted_network(G, a=1, b=1): 
    ts = b/(float(b) + a) # threshold formule van b/(a+b) 
    # https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.classes.function.get_node_attributes 
    getatt = nx.get_node_attributes(G, 'new') 
    nodes = [node for node in G.nodes(True) if node[1]['new'] == False] 

    for node, attribute in nodes: 
     readyforadopt = len([neighbor for neighbor in G.neighbors(
      node) if getatt[neighbor] == True])/float(len(G.neighbors(node))) 
     # Node zal een behavior adopten als de gegeven ts de ts van de node 
     # overstijgt of gelijk is 
     if readyforadopt >= ts: 
      G.node[node]['new'] = True 

    return [node for node in G.nodes(True) if node[1]['new'] == True] 

H = create_network() 
print [node for node in H.nodes(True) if node[1]['new'] == True] 
print adapted_network(H) 
+0

附註:使用'H.add_edges_from()'會使您的代碼更短,更具可讀性。 – DyZ

回答

0

您必須重複呼叫adapted_network(H),直到A的傳播停止。

adapted_network(H) 
# [('f', {'new': True}), 
# ('e', {'new': True}),  
# ('c', {'new': True}), 
# ('i', {'new': True})] 

adapted_network(H) 
# [('f', {'new': True}), 
# ('e', {'new': True}), 
# ('k', {'new': True}), 
# ('c', {'new': True}), 
# ('i', {'new': True})] 
相關問題