对有向图的邻接表进行 5 次随机更改

问题描述

是否有一种自动方法可以从现有的邻接列表中删除 5 条边,同时添加 5 条新的随机边来将现有节点连接到列表?意味着删除的边将被随机边替换。

或者,我认为如果程序从列表中随机删除 5 个边并将其另存为新文件,它也可以工作。也许,然后,我可以使用图生成器来创建具有 5 个边的随机邻接列表,例如,这些边必须由 0-25 之间的节点组成。

我要存档的内容

我将因果循环图转换为有向网络,以便我可以分析它的一些属性,例如平均路径长度和其他中心性度量。该网络包括 26 个节点和 67 条边。现在我分析了网络的所有重要特征,我想创建 1000 个稍微改变的网络,以便我可以检查中心性度量对随机扰动的稳健性。

换句话说,我想创建 1000 个变异网络来分析网络中每个变量/节点的介数中心性 (BC) 和接近中心性 (CC) 的变化。

解决方法

方法是创建一个 G 边的列表(一个简单的方法是 L = list(G.edges())

然后从列表中选择 5 个随机边。为此,请使用 random.sample (需要随机模块)。 random.samplerandom.choice 更好,因为您可以控制它选择的数量(注意,它选择“无替换”)。所以edges_to_delete = random.sample(L,5)

然后选择 5 对随机边进行连接。如果您想注意它们尚不存在,请在 for 循环中执行此操作,选择 2 个随机节点,如果它们未连接,则将它们添加到图中。

据说它看起来像这样:

import networkx as nx
import random
G = nx.fast_gnp_random_graph(100,0.1)
L = list(G.edges())
edges_to_delete = random.sample(L,5)
G.remove_edges_from(edges_to_delete)

#it's probably better to create a copy of `G` rather than act on `G` directly.
node_list = list(G.nodes())
for counter in range(5):
    candidate_edge = tuple(random.sample(node_list,2))
    if not G.has_edge(*candidate_edge):
        G.add_edge(*candidate_edge)

注意最后两行中的 *。这是因为函数需要 2 个参数,但我传递的是一个长度为 2 的元组。* 告诉它实际上将元组中的条目视为函数的参数。