簡體   English   中英

NetworkX:部分失敗的圖形/網絡的鄰接矩陣

[英]NetworkX: Adjacency Matrix of partially failed graphs/networks

回想一下,如果連接了兩個節點,鄰接矩陣給我們1否則給我們0 ,我想為所有節點都active的正則圖計算一個矩陣,為其中幾個節點發生failed 的同一圖計算一個矩陣。

讓我們考慮一個2x2節點的萊迪思網絡。 其鄰接矩陣(A)為:

0  1  1  0
1  0  0  1
1  0  0  1
0  1  1  0

產生此圖: 在此處輸入圖片說明

現在,讓我們刪除節點0

G.remove_node(0)

這就是新的鄰接矩陣(A1)的樣子:

0  0  1
0  0  1
1  1  0

返回此圖: 在此處輸入圖片說明

現在,兩個矩陣的大小明顯不同。

我的問題 :如何確定矩陣A1的大小與矩陣A相同? 這就是說,如果節點0因為失敗而不會出現,我希望將0 對應於第0-th行和0-th放入A1 ,以便矩陣的大小保持不變。 為了比較和計算,我需要這樣做。 但是要做到這一點,我假設我需要訪問創建鄰接矩陣的函數。 我可以用更簡單的方式做到嗎?

節點0失敗的示例:

0  0  0  0
0  0  0  1
0  0  0  1
0  1  1  0

這就是我創建2x2網絡並生成鄰接矩陣的方式:

import networkx as nx

N=2
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i,j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
inds=labels.keys()
vals=labels.values()
inds.sort()
vals.sort()
pos2=dict(zip(vals,inds))
nx.draw_networkx(G, pos=pos2, with_labels=True, node_size = 200)

A=nx.adjacency_matrix(G)
A.toarray()

#G.remove_node(i) to remove node i

嘗試使用G.remove_edges_from(G.edges(0)) ,它將刪除所有0的邊而不是整個節點。 然后生成鄰接矩陣。

根據一些研究和Joel的建議,我提出了這種方法。 我想在這里發布它,以便任何有意願的人都可以提出改進建議。

對於常規的3x3網絡,這是我們以公允的方式獲取鄰接矩陣的方式:

#Create the graph (see question above)
A=nx.adjacency_matrix(G, nodelist=range(N*N))
A=A.todense()

這將產生一個N^2xN^2矩陣,其中每個行/列對應一個特定節點(使用nodelist允許打印出要打印的行/列,排序為0K ,其中K是節點總數):

[[0 1 0 1 0 0 0 0 0]
 [1 0 1 0 1 0 0 0 0]
 [0 1 0 0 0 1 0 0 0]
 [1 0 0 0 1 0 1 0 0]
 [0 1 0 1 0 1 0 1 0]
 [0 0 1 0 1 0 0 0 1]
 [0 0 0 1 0 0 0 1 0]
 [0 0 0 0 1 0 1 0 1]
 [0 0 0 0 0 1 0 1 0]]

在此處輸入圖片說明

如果節點0發生故障,我們將不得不用不存在的連接( 0 )替換其連接( 1 ),同時保留鄰接矩陣的大小。 在這種情況下,行0和列0將填入0 然后,我的解決方案如下:

P=K #Total number of nodes before failures

def nodes_connected(i, j):
     try: 
        if i in G.neighbors(j):
            return 1
     except nx.NetworkXError:
        return False          

A1=numpy.zeros((P*P,P*P))

for i in range(0,P*P,1):
    for j in range(0,P*P,1):              
        if i not in G.nodes():
            A1[i][:]=0
            A1[:][i]=0
        elif i in G.nodes():
            A1[i][j]=nodes_connected(i,j)
                A1[j][i]=A1[i][j]
for i in range(0,P*P,1):
    for j in range(0,P*P,1):
            if math.isnan(A1[i][j]):
                A1[i][j]=0              
print(A1)

這將產生以下結果:

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  1.  0.  0.]
 [ 0.  1.  0.  1.  0.  1.  0.  1.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.  0.  1.  0.  1.]
 [ 0.  0.  0.  0.  0.  1.  0.  1.  0.]]

現在,矩陣A1告訴我們節點0沒有任何連接。 它還告訴我們,類似於矩陣A,節點1連接到節點24

如果有人有更正的建議,歡迎您提出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM