Случайное удаление ребер в графе - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь удалить ребра в случайном процессе на графике как функцию p, где p равно от 0 до 1. На первой итерации 0,1 или 10% узлов удаляются случайным образом из графика.Во второй итерации удаляется 20% оставшихся ребер и так далее.Моя ошибка возникает, когда удаленные ребра снова появляются в случайной функции.

Моя попытка:

import networkx as nx
import random
import numpy as np
graph = nx.fast_gnp_random_graph(20,0.3)



p_values = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]


for i in p_values:
    print(i)

for i in p_values:

    array=[]    

    n=nx.number_of_edges(graph)
    edges = list(graph.edges)

    no_edges_del = int(n*i)
    print(no_edges_del)

    for j in range(no_edges_del):
        chosen_edge = random.choice(edges)
        print(chosen_edge)
        print(chosen_edge[0])
        graph.remove_edge(chosen_edge[0], chosen_edge[1])

        GC = nx.number_of_nodes(max(nx.connected_component_subgraphs(graph), key=len))

        array.append(GC/n)      

error-

Traceback (most recent call last):
  File "1.py", line 26, in <module>
    graph.remove_edge(chosen_edge[0], chosen_edge[1])
  File "D:\anaconda\lib\site-packages\networkx\classes\graph.py", line 1011, in remove_edge
    raise NetworkXError("The edge %s-%s is not in the graph" % (u, v))
networkx.exception.NetworkXError: The edge 14-15 is not in the graph

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Решением может быть следующее.
На каждой итерации вы учитываете текущий процент p и удаляете p*number_of_remaining_edges ребра.

import random
import networkx as nx

g = nx.fast_gnp_random_graph(20,0.3)
p_values = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]

for p in p_values:
    g.remove_edges_from(random.sample(g.edges(),k=int(p*g.number_of_edges())))
0 голосов
/ 06 июня 2019

Вы получаете набор ребер до начала цикла for. Вам нужно удалить ребра из этого набора, так как они удаляются с графика, чтобы они не выбирались снова во время последующей итерации.

Либо получите набор ребер из графа на каждой итерации непосредственно перед тем, как выбрать тот, который нужно удалить.

...