Следуя идее этого ответа , мы можем перебирать combinations
связанных компонентов и соединять случайные пары узлов. Преимущество использования combinations
состоит в том, что нам нужно выполнить итерацию по компонентам только один раз, и мы гарантируем, что на каждой итерации ранее просмотренные компоненты игнорируются, поскольку порядок combinations
не имеет значения, т.е. видели комбинацию (1,2)
, мы не увидим (2,1)
, что может привести к тому, что два компонента будут соединены через два разных узла и, возможно, изолированы от остальной части графа.
Итак, используя сокращенную версию вашего примера:
G = nx.fast_gnp_random_graph(100,0.02,seed=1)
plt.figure(figsize=(12,6))
nx.draw(G, node_size=100, node_color='lightgreen')
import random
from itertools import combinations, groupby
components = dict(enumerate(nx.connected_components(G)))
components_combs = combinations(components.keys(), r=2)
for _, node_edges in groupby(components_combs, key=lambda x: x[0]):
node_edges = list(node_edges)
random_comps = random.choice(node_edges)
source = random.choice(list(components[random_comps[0]]))
target = random.choice(list(components[random_comps[1]]))
G.add_edge(source, target)
plt.figure(figsize=(12,6))
nx.draw(G, node_size=100, node_color='lightgreen')
введите описание изображения здесь