使用python來構造有向隨機網絡

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章