2016-12-24 18 views
2

Я работаю с сетями mutipartite, в частности в этом случае с четырехсторонним. Прежде всего, в NetworkX кажется, что можно работать с полными многопартийными сетями через nx.complete_multipartite_graph(), а не с более общими многочастными (поправьте меня, если я ошибаюсь, пожалуйста). Я могу начать смотреть на igraph или другой пакет Python, если это необходимо.Как работать с многочастными графами в NetworkX или igraph?

Вдохновленный в James A. Foster's question, я создаю ничью сети, подобной моей, в меньшем масштабе, конечно, и с некоторыми ее функциями. Я использую этот код только для того, чтобы увидеть его графически и как помочь объяснить, что я хочу делать.

Я использовал следующую номенклатуру: 1-й и 2-й колонна образует «двудольную сеть X», 2-й и 3-й колонна образует «двудольную сеть Y», 3 и 4 столбцов образуют «Z двудольной сеть», и у меня есть все эти сети в отдельных файлах. Я хотел бы, чтобы интегрировать их в только один многодольной сети, как это дро:

Quadripartite graph

(1) Как я должен продолжать это? Насколько я понимаю, я не могу использовать функцию nx.compose().

Одна из проблем, которые я нахожу, по крайней мере, в этом коде для ее рисования, объясняется тем, что в моей реальной сети 1-й и 4-й столбцы имеют одинаковые элементы! Поэтому, если я использую те же имена в обоих столбцах, интерпретация NetworkX мне не полезна, и поэтому я использую разные числа в 4-м столбце.

(2) Что мне делать? Мне нужно указать, что оба столбца чем-то отличаются друг от друга, несмотря на наличие одинаковых элементов.

Важная информация: этот график является «временным упорядоченным», т. Е. Взаимодействия происходят хронологически слева направо, поэтому запреты на автопилы между 1-м и 4-м столбцами запрещены, и эти столбцы представляют для меня особый интерес.

(3) Как я могу извлечь сеть между 1-м и 4-м столбцами? Например, в этой небольшой сети узел 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() 

Большое спасибо за вашу помощь заранее,

Jorge

ответ

0

Мое первое предложение сохранить три сети отдельно, как g1, g2 и g3. Кроме того, сделайте g3 ярлыки, отличные от g1 ярлыков, скажем, делая их отрицательными (это решает проблему (2)). После этого вы можете решить вашу проблему (3), постепенно, глядя на соседей g1 агентов в g2, g2 агентов в g3 и т.д .:

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

Спасибо вам, что это очень умный, и он работает хорошо. – Jorge