Как исправить «RuntimeError: словарь изменил размер во время итерации», при редактировании некоторых данных графика - PullRequest
0 голосов
/ 22 декабря 2018

Объектив: у меня есть график, для каждого узла, имеющего степень два, я хотел бы удалить этот узел и добавить ребро между соседями этого узла (вес = a * b / a + b, где a и b равнывеса смежных ребер к рассматриваемому узлу). Я хочу выполнять эти операции каждый раз, когда изменяется граф, чтобы в конечном итоге получить граф без какого-либо узла с dgree 2.вот мой код прилагается.PS: я очень плохо знаком с Python (3.4.0), NetworkX 2.2 (Любое другое предложение, чтобы дать аналогичный результат приветствуется)

import networkx as nx
import matplotlib.pyplot as plt


G=nx.MultiGraph()
G.add_nodes_from([1,2,3,4,5,6,7])
G.add_edges_from([(1,2),(1,3),(2,4),(2,5),(3,6),(6,7)])



for u, v, d in G.edges(data=True):
    d['weight'] = 1



def fun(G) : 
    L= G.degree() # L=list of all nodes of a random graph G ,and their nodes [(node, degree),(node,degree)...]
    for x in L : 
        if x[1] == 2 : #if a certain node in L has a degree 2 
            adja=G.edges(x[0],data=True) #adjacent edges to the node of degree 2 
            weights = [d['weight'] for u,v,weight in adja] #weights=list of weights of the adjacent edges to the node x[0](the one having degree 2)

            numerator=weights[0]*weights[1]
            denominator=sum(weights)
            var=numerator/denominator #var is the weight i would like to assign to my new edge created,it is computed like : a*b /(a+b) with a and b are weights of the adjacent edges to the node in question

            tmp=list(G.neighbors(x[0])) #tmp = list of neighbors of the node to remove(neighbors in term of nodes)
            G.remove_node(x[0]) #remove the node of degree 2
            G.add_edge(tmp[0],tmp[1],weight=var) #add an edge between the neighbors of the node of degree 2 

nx.draw(G,with_labels=True)
plt.show()

print(fun(G)) 
...