NW小世界网络模型python代码实现及平均路径聚类系数计算

NW小世界网络模型

 

WS 模型提出之后,人们自然希望进一步对该模型的性质做理论分析。不久之后 ,Newman Watts 提出了另一个在理论分析方面相对容易处理的小世界模型,现在称为 NW 小世界模型。
NW 模型是通过用“随机化加边”取代 WS 模型构造中的“随机化重连”而得到的。

NW小世界网络具体构造算法如下:

从规则图开始

给定一个含有N个节点的环状最近邻耦合网络,其中每个节点都与它左右相邻的各K/2个节点相连,K是偶数。

随机化加边

以概率p在随机选取的NK/2对节点之间添加边,其中规定不得有重边和自环。在p=0时,WS模型和NW模型都对应于原来的最近邻耦合网络;在p=1时,WS模型相当于随机图,而NW模型则相当于在规则最近邻耦合网络的基础上再叠加一个一定边数的随机图。当p足够小而N足够大时,可以认为WS模型和NW模型是等价的。

Python代码实现

import random
import networkx as nx
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题


def small_world(N, d, p):
    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() < p:
                    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,  node_color='yellow', node_size=nodesize, alpha=0.6, ax=axis)
    nx.draw_networkx_edges(g, pos=pos, width=0.3, alpha=0.6, ax=axis)

    print('平均最短路径长度',nx.average_shortest_path_length(g))  # 计算平均最短路径长度
    print('平均聚集系数',nx.average_clustering(g))  # 计算平均聚集系数


print('请输入网络节点总数N:')
N=int(input())
print('请输入规则网络要连的邻接个数k:')
k=int(input())
print('请输入随机化加边概率p:')
p=float(input())

A = small_world(N, k, p)




fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(6,3))
ax[0].matshow(A, cmap='gray')
plot_graph(A, axis=ax[1])
plt.title('NW小世界网络')
plt.show()

实验结果展示

 

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值