使用python来构造有向随机网络
# -*- coding: utf-8 -*-
"""
@author: Administrator
"""
"""
随机网络是由一些节点通过随机连接而组成的一种复杂网络。
随机网络有两种等价方法
(1).ER模型:给定N个节点,最多可以存在N(N-1)/2条边,
从这些边中随机选择M条边就可以得到一个随机网络,
且每一种可能的概率相同
(2).二项式模型:给定N个节点,每一对节点以概率p进行连接,
这样,所有连线的数目是一个随机变量,其平均值为
M = pN(N-1)/2
(3).层间的节点总数为p*n*n,其中n为层内的节点总数,
p为层间的连接概率
"""
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
import random
def get_directe_ER_network(p,node):
#此方法的作用是让邻接矩阵显示完整
np.set_printoptions(suppress=True, threshold=1e10)
#产生的是一个有向图
G = nx.DiGraph()
G.add_nodes_from(list(range(node)))
#用来存储每一个图的边
edges_list = []
#要连接的边的总数
m = int(p*node*node)
if(m>node*(node-1)):
m = node * (node - 1)
values = list(range(1,m+1))
for value in values:
#去掉重边
while(True):
count = 0
#层间连接的第一个节点
first = random.randint(0,node-1)
# print("first:" + str(first))
#这个循环用来解决自环问题
while(True):
#层内连接的第二个节点
last = random.randint(0,node-1)
if(last != first):
# print("last:" + str(last))
break
for edges in edges_list:
if(first == edges[0] and last == edges[1]):
break
else :
count = count + 1
if(count == len(edges_list)):
break
edge = (first,last)
# print(edge)
edges_list.append(edge)
G.add_edges_from(edges_list)
print("有向随机图的邻接矩阵如下:")
matrix = nx.to_numpy_matrix(G)
print(matrix)
#由邻接矩阵得到其对应的特征值和特征向量
b = np.linalg.eig(matrix)
print("------邻接矩阵所对应的特征值-------------")
#得到特征值
print(b[0])
print("----------邻接矩阵对应的特征向量---------")
#得到特征向量
print(b[1])
ps=nx.shell_layout(G)
nx.draw(G,ps,with_labels=False,node_size=30)
plt.show()
#需要有两个参数,第一个为随机网络的连接概率
#第二个为随机网络的节点总数
get_directe_ER_network(0.4,4)