问题描述
是否有一种自动方法可以从现有的邻接列表中删除 5 条边,同时添加 5 条新的随机边来将现有节点连接到列表?意味着删除的边将被随机边替换。
或者,我认为如果程序从列表中随机删除 5 个边并将其另存为新文件,它也可以工作。也许,然后,我可以使用图生成器来创建具有 5 个边的随机邻接列表,例如,这些边必须由 0-25 之间的节点组成。
我要存档的内容:
我将因果循环图转换为有向网络,以便我可以分析它的一些属性,例如平均路径长度和其他中心性度量。该网络包括 26 个节点和 67 条边。现在我分析了网络的所有重要特征,我想创建 1000 个稍微改变的网络,以便我可以检查中心性度量对随机扰动的稳健性。
换句话说,我想创建 1000 个变异网络来分析网络中每个变量/节点的介数中心性 (BC) 和接近中心性 (CC) 的变化。
解决方法
方法是创建一个 G
边的列表(一个简单的方法是 L = list(G.edges())
。
然后从列表中选择 5 个随机边。为此,请使用 random.sample
(需要随机模块)。 random.sample
比 random.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 的元组。*
告诉它实际上将元组中的条目视为函数的参数。