python 小世界网络

博客介绍了小世界网络的三个参数:节点数 N、初始节点度 d、断边重连率 α。先依据 N 和 d 构造规则网络,再进行断边重连,不同的断边重连率会使网络呈现不同状态,当重连率为 1 时与 ER 随机网络等价,还提及了网络可视化代码。
部署运行你感兴趣的模型镜像

小世界网络的参数有三个:节点数 NNN、初始节点度 ddd、断边重连率 α\alphaα

先根据节点数 NNN 和初始节点度 ddd 来构造一个规则网络,网络每个节点的度都是 ddd

A = np.zeros((N, N))
for i in range(N):                          
    t = 0
    while t < (d/2):
        A[i][i-(t+1)] = 1
        A[i-(t+1)][i] = 1
        t += 1

看看网络邻接矩阵 A 的结构,白色表示连边:(N=20,d=4N=20, d = 4N=20,d=4
在这里插入图片描述

然后来进行断边重连\color{red}断边重连

for i in range(N):                          
    t = 0
    while t < (N/2):
        if A[i][i-(t+1)] == 1:
            if random.random() < a:
            	# 断边
                A[i][i-(t+1)] = 0
                A[i-(t+1)][i] = 0
                # 重连
                target = random.randint(0,(N-1))
                while A[i][target] == 1 or target == i:
                    target = random.randint(0,(N-1))
                A[i][target] = 1
                A[target][i] = 1
        t += 1

α=0.2,20%\alpha=0.2, 20\%α=0.2,20%的边重新连接,总边数为:(N×d)/2=40(N\times d)/2 = 40(N×d)/2=40,断边重连数≃40×0.2=8\simeq 40\times 0.2 = 840×0.2=8

在这里插入图片描述

α=0.4,40%\alpha=0.4, 40\%α=0.4,40%的边重新连接
在这里插入图片描述

α=0.6,60%\alpha=0.6, 60\%α=0.6,60%的边重新连接
在这里插入图片描述

α=0.8,80%\alpha=0.8, 80\%α=0.8,80%的边重新连接

在这里插入图片描述

α=1\alpha= 1α=1100%100\%100%的边重新连接,此时的小世界网络和 ER随机网络等价。
在这里插入图片描述

网络可视化代码

def small_world(N, d, a):
    A = np.zeros((N, N))
    for i in range(N):                          
        t = 0
        while t < (d/2):
            A[i][i-(t+1)] = 1
            A[i-(t+1)][i] = 1
            t += 1

    for i in range(N):  
        t = 0
        while t < (N/2):
            if A[i][i-(t+1)] == 1:        
                if random.random() < a:         
                    A[i][i-(t+1)] = 0                   
                    A[i-(t+1)][i] = 0
                    target = random.randint(0,(N-1))
                    while A[i][target] == 1 or target == i: 
                        target = random.randint(0,(N-1))
                    A[i][target] = 1                    
                    A[target][i] = 1
            t += 1
    return A                                     

def plot_graph(A, axis=None):
    g = nx.from_numpy_matrix(A)
#     pos  = nx.kamada_kawai_layout(g)
    pos  = nx.circular_layout(g)
    nodesize = []
    maxsize = 100
    minsize = 10
    maxdegree = np.max(np.sum(A,axis=0))
    mindegree = np.min(np.sum(A,axis=0))
    if maxdegree == mindegree:
        nodesize = [maxsize for i in range(len(A))]
    else:
        for node in g:
            size = (np.sum(A[node]) - mindegree)/(maxdegree-mindegree)*(maxsize-minsize)+minsize               #节点大小(节点度数越大,节点越大)
            nodesize.append(size)

    nx.draw_networkx_nodes(g, pos=pos, with_labels=True, node_color='blue', node_size=nodesize, alpha=0.6, ax=axis)
    nx.draw_networkx_edges(g, pos=pos, with_labels=True, width=0.3, alpha=0.6, ax=axis)

for i in [0,0.2,0.4,0.6,0.8,1]:
    A = small_world(20,4, i)
    fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(6,3))
    ax[0].matshow(A, cmap='gray')
    plot_graph(A, axis=ax[1])
    plt.show()

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值