Networkx изменить взвешенный ориентированный граф на ненаправленный - PullRequest
0 голосов
/ 16 мая 2019

Может ли встроенная функция в networkx изменить взвешенный ориентированный граф на ненаправленный?Функциональность должна изменить два направленных ребра (n1, n2,5) и (n2, n1,7) на один (n1, n2,12).

Я долго искал и не нашел ни одного,

1 Ответ

0 голосов
/ 16 мая 2019

Networkx имеет функцию to_undirected , но он не суммирует веса, он просто обновляет вес с последним найденным весом ребра из исходного графика:

Если в графе существуют ребра в обоих направлениях (u, v) и (v, u), атрибуты для нового неориентированного ребра будут являться комбинацией атрибутов направленных ребер. Данные ребер обновляются в (произвольном) порядке, в котором встречаются ребра. Для более индивидуального управления атрибутами ребер используйте add_edge ().

Вы должны сделать это вручную следующим образом:

G = nx.DiGraph()
G.add_weighted_edges_from([
    (1,2,3),
    (1,3,4),
    (2,1,5),
    (2,3,1),
    (3,2,2)
])
UG = G.to_undirected()
for node in G:
    for ngbr in nx.neighbors(G, node):
        if node in nx.neighbors(G, ngbr):
            UG.edges[node, ngbr]['weight'] = (
                G.edges[node, ngbr]['weight'] + G.edges[ngbr, node]['weight']
            )
UG.edges.data('weight')

вернет суммированные веса:

EdgeDataView([(1, 2, 8), (1, 3, 4), (2, 3, 3)])

...