引用参考博文:NW小世界网络模型python代码实现及平均路径聚类系数计算_Q造不出的人工智障的博客-CSDN博客
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()