Python 在networkx中添加和删除随机边

Python 在networkx中添加和删除随机边,python,random,graph,networkx,Python,Random,Graph,Networkx,我正在python中使用NetworkX。给定任何无向和未加权的图,我希望遍历所有节点。对于每个节点,我希望以概率p为该节点添加随机边和/或删除现有随机边。有没有一个简单的方法可以做到这一点?非常感谢 给定一个节点i,要添加不重复的边,您需要知道(1)来自i的边已经存在,然后计算(2)来自i的不存在的候选边集。对于删除,您已经在注释中定义了一个方法,该方法仅基于(1)。 这是一个基于列表理解提供一轮随机添加和删除的函数 def添加和删除边(G、p\u新建连接、p\u删除连接): '''

我正在python中使用NetworkX。给定任何无向和未加权的图,我希望遍历所有节点。对于每个节点,我希望以概率p为该节点添加随机边和/或删除现有随机边。有没有一个简单的方法可以做到这一点?非常感谢

给定一个节点
i
,要添加不重复的边,您需要知道(1)来自
i
的边已经存在,然后计算(2)来自
i
的不存在的候选边集。对于删除,您已经在注释中定义了一个方法,该方法仅基于(1)。 这是一个基于列表理解提供一轮随机添加和删除的函数

def添加和删除边(G、p\u新建连接、p\u删除连接):
'''    
对于每个节点,
使用prob p_new_connection向随机其他节点添加新连接,
用prob p_移除连接,移除连接
在适当的位置对G进行操作
'''                
新的_边=[]
rem_边=[]
对于G.nodes()中的节点:
#查找此节点连接到的其他节点
已连接=[对于G.边(节点)中的(fr,to)]
#并找到剩余的节点,这些节点是新边的候选节点
未连接=[n表示G.nodes()中的n,如果未连接则为n]
#概率地添加一条随机边
如果len(未连接):#仅在可能使用新边缘时尝试
如果为random.random()
要查看此功能的运行情况,请执行以下操作:

将networkx导入为nx
随机输入
将matplotlib.pyplot作为plt导入
p_新_连接=0.1
p_移除_连接=0.1
G=nx.karate_club_graph()#示例图(无向、未加权)
#原版
plt.图(1);plt.clf()
图,ax=plt.子批次(2,1,num=1,sharex=True,sharey=True)
位置=nx.弹簧布置图(G)
nx.draw\u networkx(G,pos=pos,ax=ax[0])
#现在应用一轮更改
rem_边,new_边=添加_边和删除_边(G,p_新连接,p_删除连接)
#并绘制新版本并突出显示更改
nx.draw\u networkx(G,pos=pos,ax=ax[1])
nx.绘制网络x边(G,pos=pos,ax=ax[1],edgelist=新边,
边缘(颜色=b',宽度=4)
#注意:要高亮显示已删除的边,请将它们重新添加到中;
#这显然只是为了展示!
G.从(rem_边)添加_边
nx.绘制网络x_边(G,pos=pos,ax=ax[1],edgelist=rem_边,
边缘(颜色为r,样式为虚线,宽度为4)
G.从(rem_边)移除_边
plt.show()
你应该看到这样的东西。

请注意,您也可以对邻接矩阵执行类似的操作,
A=nx.adjacement_matrix(G).todense()
(这是一个numpy矩阵,所以像[i,:].nonzero()这样的操作是相关的)。如果您有非常大的网络,这可能会更有效。

给定一个节点
i
,要添加边而不重复,您需要知道(1)来自
i
的边已经存在,然后计算(2)来自
i
的候选边集。对于删除,您已经在注释中定义了一个方法,该方法仅基于(1)。 这是一个基于列表理解提供一轮随机添加和删除的函数

def添加和删除边(G、p\u新建连接、p\u删除连接):
'''    
对于每个节点,
使用prob p_new_connection向随机其他节点添加新连接,
用prob p_移除连接,移除连接
在适当的位置对G进行操作
'''                
新的_边=[]
rem_边=[]
对于G.nodes()中的节点:
#查找此节点连接到的其他节点
已连接=[对于G.边(节点)中的(fr,to)]
#并找到剩余的节点,这些节点是新边的候选节点
未连接=[n表示G.nodes()中的n,如果未连接则为n]
#概率地添加一条随机边
如果len(未连接):#仅在可能使用新边缘时尝试
如果为random.random()import networkx as nx
import random
import matplotlib.pyplot as plt

graph = nx.Graph()
graph.add_edges_from([(1,3), (3,5), (2,4)])
nx.draw(graph, with_labels=True)
plt.show()
def random_edge(graph, del_orig=True):
    '''
    Create a new random edge and delete one of its current edge if del_orig is True.
    :param graph: networkx graph
    :param del_orig: bool
    :return: networkx graph
    '''
    edges = list(graph.edges)
    nonedges = list(nx.non_edges(graph))

    # random edge choice
    chosen_edge = random.choice(edges)
    chosen_nonedge = random.choice([x for x in nonedges if chosen_edge[0] == x[0]])

    if del_orig:
        # delete chosen edge
        graph.remove_edge(chosen_edge[0], chosen_edge[1])
    # add new edge
    graph.add_edge(chosen_nonedge[0], chosen_nonedge[1])

    return graph
new_graph = random_edge(graph, del_orig=True)

nx.draw(new_graph, with_labels=True)
plt.show()