2017-06-21 61 views
1

算子理論的一個分支研究移位算子S.基本上,給定一個圖的權重分配給圖的每個頂點,移位算子產生一個新圖,相同的圖(A)並用頂點鄰居的權重之和替換每個頂點的權重。例如,在圖3(A)所取代5 + 5 + 2 + 0使用NetworkX研究移位算子和其他數學創建

enter image description here

enter image description here

誰知道是否能networkx幫我自動化一個任意圖的過程,G?此外,我可能構建的圖的大小(頂點,邊等)有什麼限制?

+0

我相信networkx可用來做到這一點。它應該只需要通過網絡循環,併爲每個節點分配一個新的權重(在完成此操作之前注意不要覆蓋舊的權重)。你試過什麼了? – Joel

回答

0

首先,您需要創建一個圖並添加節點權重。 我以ah的字母命名節點。 對於較大的圖形,您需要一種不同的命名節點方式(因此每個節點都有唯一的名稱)。

在下面的代碼中,我還繪製了節點名稱。 請注意,我手動設置節點位置,所以我有和你一樣的例子。 查看更大的圖表graph layouts

import networkx as nx 
from matplotlib import pyplot as plt 

G = nx.Graph() 

nodes = [ 
    ['a', {'weight' : 5}], 
    ['b', {'weight' : 4}], 
    ['c', {'weight' : 2}], 
    ['d', {'weight' : 3}], 
    ['e', {'weight' : 5}], 
    ['f', {'weight' : 0}], 
    ['g', {'weight' : 0}], 
    ['h', {'weight' : 1}] 
] 
for node in nodes: 
    G.add_node(node[0], node[1]) # add node and node weight from list 

G.add_edges_from([ 
    ('a', 'd'), 
    ('b', 'e'), 
    ('c', 'd'), 
    ('d', 'e'), 
    ('d', 'g'), 
    ('e', 'h'), 
    ('e', 'f') 
]) 

pos = {'a' : (1, 2), 'b' : (2, 2), 'c' : (0, 1), 'd' : (1, 1), 'e' : (2, 1), 'f' : (3, 1), 'g' : (1, 0), 'h' : (2, 0)} # manual fixed positions 
plt.figure() 
nx.draw(G, pos=pos, with_labels=True, node_size=700, node_color='w') # draw node names 
plt.show() 

輸出:

enter image description here

這裏是繪製結點的權代碼:

plt.figure() 
nx.draw(G, pos=pos, labels=nx.get_node_attributes(G, 'weight'), node_size=700, node_color='w') # draw node weights 
plt.show() 

enter image description here

最後計算的移位運算符是代碼。 您可以通過G[node]獲得某個節點node的鄰居。 某些節點neighborweight屬性可以通過G.node[neighbor]['weight']訪問。

使用這個和列表理解我總結當前節點的所有鄰居節點的權重列表。請注意,新的權重設置爲nx.set_node_attributes(G, 'weight', new_weights)

new_weights = {} 
for node in G.nodes(): 
    new_weights[node] = sum([G.node[neighbor]['weight'] for neighbor in G[node]]) # sum weights of all neighbors of current node 

nx.set_node_attributes(G, 'weight', new_weights) # set new weights 
plt.figure() 
nx.draw(G, pos=pos, labels=nx.get_node_attributes(G, 'weight'), node_size=700, node_color='w') # draw new node weights 
plt.show() 

最終圖表:

enter image description here