Давайте воспользуемся примером графика, чтобы более легко увидеть, как это можно сделать:
l = [('maths', 'physics'), ('astronomy', 'physics'), ('history', 'archaeology'), ('environmental science', 'physics'), ('maths', 'astronomy'), ('history', 'literature'), ('astronomy', 'astrophysics'), ('literature', 'philosophy'), ('biology', 'physics')]
graph = nx.from_edgelist(l)
Итак, мы построили график, который выглядит следующим образом:
pos = nx.spring_layout(graph, scale=20, k=3/np.sqrt(graph.order()))
nx.draw(graph, pos=pos,
node_color='lightblue',
with_labels=True,
node_size=500)
Таким образом, на графике есть 2 связанных компонента, самый большой из которых - тот, который появляется слева на рисунке. Чтобы найти самый большой компонентный подграф, вы можете использовать connected_component_subgraphs
и найти максимум, используя len
в качестве функции key
.
S = max(nx.connected_component_subgraphs(graph), key=len)
Затем получите случайный выбор существующих ребер в этом подграфе, используя random.choices
, установив k
в значение интереса:
edges_to_remove = random.choices(list(S.edges()), k=2)
# [('physics', 'biology'), ('physics', 'environmental science')]
В этом случае, например, мы будем удалять ребра, соединяющие узлы ('physics', 'biology')
и ('physics', 'environmental science')
И затем, аналогично тому, что вы делаете, мы можем перебирать случайный выбор ребер edges_to_remove
и удалять их из графика используя remove_edge
:
for edge in edges_to_remove:
graph.remove_edge(*edge)
В результате на следующем графике: