繁体   English   中英

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

[英]Making 5 random changes to an adjacency list for a directed graph

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

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

我想要存档的内容:

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

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

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

然后从列表中选择 5 个随机边。 为此,请使用random.sample (需要 random 模块)。 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 的元组。 *告诉它实际上将元组中的条目视为函数的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM