复杂网络作业四:第三题——随机图、小世界网络和真实网络的度分布


前言

这次无话可说.……


一、题目

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随机网络
在这里插入图片描述
科学家合作网络
在这里插入图片描述
在这里插入图片描述

总结

如果我在哪里错了,希望大家及时指正。这个作业还要交呢…

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值