недостающее звено после того, как узлы заключили контракт с networkx - PullRequest
0 голосов
/ 03 апреля 2020

Я заметил, что после объединения двух узлов происходит странное поведение с некоторыми ссылками. Я протестировал 2 сценария ios, 1) с 3 узлами; 2) с 4 узлами.

Сценарий1

G1 = nx.Graph()

G1.add_node(1,name='r1')
G1.add_node(2,name='r2')
G1.add_node(3,name='n1') 

G1.add_edges_from([(1,2),(2,3),(1,3)])

nx.write_graphml(G1,'G1.graphml')

Предыдущий производит эту сеть:

enter image description here

После этого я объединяю узлы r1 и r2. Я ожидал, что узел n1 будет иметь 2 ссылки на r1, но этого не происходит.

Примечание: чтобы создать файл graphml, мне пришлось удалить contration атрибут с узла r1.

G2 = nx.contracted_nodes(G1,1,2)

In [342]: G2.nodes(data=True)                                                                           
Out[342]: NodeDataView({1: {'name': 'r1', 'contraction': {2: {'name': 'r2'}}}, 3: {'name': 'n1'}})

del G2.nodes[1]['contraction']

In [345]: G2.nodes(data=True)                                                                           
Out[345]: NodeDataView({1: {'name': 'r1'}, 3: {'name': 'n1'}})

nx.write_graphml(G2,'G2.graphml')

enter image description here

Сценарий2

Но, если сеть имеет более 3 узлов, нет отсутствующих ссылок.

G3 = nx.Graph()

G3.add_node(1,name='r1')              
G3.add_node(2,name='r2')
G3.add_node(3,name='n1') 
G3.add_node(4,name='n2') 

G3.add_edges_from([(1,2),(2,3),(3,4),(4,1)])

nx.write_graphml(G3,'G3.graphml')

enter image description here

После этого снова объединяем узлы r1 и r2 .

G4 = nx.contracted_nodes(G3,1,2, self_loops=True)
G4.nodes(data=True)
del G4.nodes[1]['contraction']
nx.write_graphml(G4,'G4.graphml')

enter image description here

Эпилог

Моя идея состояла в том, чтобы объединить два узла, например как r1 и r2, но при этом сохраняются обе исходные ссылки, такие как:

enter image description here

Любая подсказка?

Спасибо !!

1 Ответ

1 голос
/ 03 апреля 2020

Вы используете сеть x Graph. Таким образом, граф имеет не более одного ребра на пару узлов. Он также не имеет направления к своим ребрам.

Если вам нужно несколько ребер для пары узлов, используйте MultiGraph. Если вы также хотите направление, используйте MultiDiGraph.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...