使用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)