前言
这次无话可说.……
一、题目
3. 随机图、小世界网络和真实网络的度分布
(1)ER图:生成n=5242个节点以及m=14484条边的随机图。可以自己写代码,也可以使用SNAP或Networkx函数。
(2)SW随机网络,从n=5242个节点的环形网络开始,加上节点连成圆圈,每个节点连接其直接的两个邻居(例,节点399连接398和400),此时共有5242条边。接下来,连接每个节点到其邻居的邻居(例,节点399连接397和401),这又会多出5242条边。最后随机选择未连接的4000对节点,在他们之间增加连边。此时一共有5242*2+4000=14484条边。可以自己写代码,可以调用SNAP或Networkx函数。
(3)科学家合作网络:下载无向网络http://snap.stanford.edu/data/ca-GrQc.txt.gz.
该数据集是arXiv库中广义相对论和量子宇宙方面的论文作者之间的关系。两个作者如果有共同合作论文,则二者之间有边向量。有些边在数据集中可能出现两次,去掉重边和自环后,共有5242个节点和14484条边。(注意,当使用SNAP的LoadEdgeList函数时,重边会自动忽略,但需删除自环的边)。
问题:在对数坐标系下,画出三个网络中节点的度分布。图中每个数据点(x,y),其中x是出度的大小,是正整数,y是出度为x的节点的数量。(最好将x的范围限定在最大和最小出度之间。)对于对数坐标系,x和y轴使用10的幂次做单位。
二、需要使用的函数的介绍
1.定义无向图
G = nx.Graph()
2.定义边
nx.path_graph(MaxNode) #MaxNode是节点的数量
3.把节点加入到图中
G.add_nodes_from(H)
4.把边加入到图中
G.add_edges_from(edge_list)
5.加入单独一条边
G2.add_edge(u,v) #u,v分别是边对应的两个节点的编号
6.从文件中读入一个图
CA_G = nx.read_edgelist(path,create_using=nx.Graph,nodetype=int,data = ()) #path是文件路径
7.移除一条边
CA_G.remove_edge(u,v) #u,v分别是边对应的两个节点的编号
三、代码
import random
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
MaxNode = 5242
MaxEdge = 14484
random_rate = 1/5242
def drawBar(x,y,min_x,max_y): #画柱形统计图
plt.axes(yscale="log")
plt.xlim(min_x, max_y)
plt.bar(x, y)
plt.xlabel("the number of out degree")
plt.ylabel("the number of point")
plt.show()
def drawStatisticBar(grah): #画统计图
out_edge = {}
for i in grah: #出度统计
l = len(grah[i])
if (l in out_edge):
out_edge[l] += 1
else:
out_edge[l] = 1
x_list = []
y_list = []
max_out = 0 #节点数量统计
min_out = MaxNode
for d in out_edge:
max_out = max(max_out, d) #更新最大最小值范围
min_out = min(min_out, d)
x_list.append(d)
y_list.append(out_edge[d])
drawBar(x_list,y_list,min_out,max_out) #画图
#(1)ER图:生成n=5242个节点以及m=14484条边的随机图。
G = nx.Graph()
H = nx.path_graph(MaxNode)
G.add_nodes_from(H)
edge_list = [(random.randint(0,MaxNode),random.randint(0,MaxNode)) for i in range(MaxEdge)]
G.add_edges_from(edge_list)
drawStatisticBar(G)
#(2)SW随机网络
H2 = nx.path_graph(MaxNode)
G2 = nx.Graph()
G2.add_nodes_from(H2)
edge_list = [(i,(i + 1)%MaxNode) for i in range(MaxNode)]
G2.add_edges_from(edge_list)
edge_list2 = [(i,(i + 2)%MaxNode) for i in range(MaxNode)]
G2.add_edges_from(edge_list2)
cnt_random_edge = 4000
while(cnt_random_edge > 0):
u = random.randint(0,MaxNode)
v = random.randint(0,MaxNode)
if(((u,v) not in edge_list) and (u,v) not in edge_list2
and((v,u) not in edge_list) and (v,u) not in edge_list2):
cnt_random_edge -= 1
G2.add_edge(u,v)
print("图中边的数量:",len(G2.edges))
drawStatisticBar(G2)
#科学家合作网络
path = r"CA-GrQc.txt"
CA_G = nx.read_edgelist(path,create_using=nx.Graph,nodetype=int,data = ())
CA_edge_list = CA_G.edges
for u,v in CA_edge_list:
if(u == v):
CA_G.remove_edge(u,v)
print("图中边的数量:",len(CA_G.edges))
drawStatisticBar(CA_G)
运行结果截图
ER图
SW随机网络
科学家合作网络
总结
如果我在哪里错了,希望大家及时指正。这个作业还要交呢…