2016-12-24 37 views
2

我與mutipartite網絡的工作,特別是在這種情況下,與四方之一。首先,在NetworkX似乎只有是可能的完全多的網絡低谷nx.complete_multipartite_graph工作(),而不是與更普遍的多方者(糾正我,如果我錯了,請)。如果需要,我可以開始查看igraph或其他Python包。如何在NetworkX或igraph中使用多重圖形?

James A. Foster's question啓發,我創建一個類似於礦山網絡的平局,當然在規模較小,並與它的一些特性。我僅使用此代碼以圖形方式查看,並幫助解釋我想要執行的操作。

我使用了以下命名法: 第一和第二列形成「X二分網絡」, 第二和第三列形成「Y二分網絡」, 第三和第四列形成「Z二分網絡」, 並且我將所有這些網絡都放在單獨的文件中。我希望他們能在短短一個多部分網絡整合爲這場平局:

Quadripartite graph

(1)我應該如何着手呢?據我所知,我不能使用nx.compose()函數。

的一個問題,我覺得,至少在這段代碼繪製它,是由於這樣的事實,在我的實際網絡的第1和第4列有相同的元素!因此,如果我在兩列中使用相同的名稱,則NetworkX解釋對我無用,這就是爲什麼我在第4列中使用不同的數字。

(2)我應該怎麼做?儘管具有相同的元素,但我需要指定兩列在某種程度上是不同的。

該圖形的一個重要信息是「臨時有序的」,即相互作用按時間順序從左到右發生,因此第一列和第四列之間的自循環被禁止,並且這些列對我來說是特別感興趣的。

(3)我怎樣才能提取第一和第四列之間的網絡?例如,在這個小型網絡中,節點6與11和14連接,節點11與1,2和6連接。

import networkx as nx 
import matplotlib.pyplot as plt 

def position_QuadriPartiteGraph(Graph, Parts): 
uPos = {} 
vPos = {} 
for index1, agentType in enumerate(Parts): 
    uPos[agentType] = index1 

QG = nx.Graph() 
QG.add_nodes_from([1,2,3,4,5,6,7], agentType='alfa') 
QG.add_nodes_from(['a','b','c'], agentType='beta') 
QG.add_nodes_from(['A','B','C','D','E','F'], agentType='gamma') 
QG.add_nodes_from([8,9,10,11,12,13,14], agentType='delta') 

myEdges = [(1,'a'), # beginning of bipartite network X 
      (1,'b'), # X 
      (2,'b'), # X 
      (3,'a'), # X 
      (4,'a'), # X 
      (5,'a'), # X 
      (6,'c'), # X 
      (7,'a'), # end of bipartite network X 
      ('a','A'), # beginning of bipartite network Y 
      ('a','B'), # Y 
      ('a','E'), # Y 
      ('b','B'), # Y 
      ('b','C'), # Y 
      ('b','D'), # Y 
      ('c','F'), # end of bipartite network Y 
      ('A',8), # beginning of bipartite network Z 
      ('A',9), # Z 
      ('B',9), # Z 
      ('B',13), # Z 
      ('C',10), # Z 
      ('C',11), # Z 
      ('C',12), # Z 
      ('D',12), # Z 
      ('E',13), # Z 
      ('F', 11), # Z 
      ('F', 14)] # end of bipartite network Z 

[QG.add_edge(u, v) for u, v in myEdges] 

nx.draw(QG, pos=position_QuadriPartiteGraph(QG, ['alfa', 'beta', 'gamma', 'delta']), with_labels=True) 
plt.savefig("multipartite_graph.png") 
plt.show() 

非常感謝您的幫助提前,

豪爾赫

回答

0

我的第一個建議是分別保持三網爲g1g2g3。此外,請g3標籤不同g1標籤,比方說,讓他們負(此解決問題(2))。然後你就可以逐步看着G2 G1代理商,G3 G2劑,等:

edges14 = sum([sum([[(i,y) for y in g3.neighbors(x)] 
       for x in sum([g2.neighbors(x) for x in g1.neighbors(i) if x in g2], 
          []) if x in g3], 
        []) for i in g1], 
       []) 
set(edges14) 
# {(5, -9), (4, -8), (5, -13), (2, -12), (1, -11), (5, -8), (6, -14), 
# (4, -9), (2, -9), (4, -13), (2, -13), (1, -10), (3, -13), (6, -11), 
# (1, -13), (2, -10), (3, -9), (1, -9), (7, -9), (1, -12), (7, -13), 
# (2, -11), (3, -8), (1, -8), (7, -8)} 
+0

謝謝你的鄰居解決你的問題(3),這是相當聰明,它工作得很好。 – Jorge