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

在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值