代码之家  ›  专栏  ›  技术社区  ›  abcd Luidy

为所有节点创建具有相同进出度的矩阵

  •  4
  • abcd Luidy  · 技术社区  · 7 年前

    我试图使用Python生成一个由0和1组成的矩阵,其中每一行有相同数量的1,每一列有相同数量的1。当行数(发送节点)不等于列数(接收节点)时,行数将不等于列数,这是我允许的。

    numpy ,但可能还有其他包(如 networkx ?) 那会有帮助的。

    下面是我想用期望的输入和输出编写的函数:

    n_pre = 4  # number of nodes available to send a connection
    n_post = 4  # number of nodes available to receive a connection
    p = 0.5  # proportion of all possible connections that exist
    
    mat = generate_mat(n_pre, n_post, p)
    
    print mat
    

    输出将是,例如:

    [[0, 1, 0, 1],
     [1, 0, 1, 0],
     [1, 1, 0, 0],
     [0, 0, 1, 1]]
    

    在图论术语中,这意味着每个节点的In度为2,out度为2(所有可能连接的50%,如 p = 0.5 ).

    2 回复  |  直到 7 年前
        1
  •  3
  •   user2357112    7 年前

    对于平方矩阵,你描述的是随机数的邻接矩阵 k-regular directed graph igraph 实现一个:

    # I think this is how you call it - it's an instance method for some reason.
    igraph.Graph().K_Regular(n, k, directed=True)
    

    networkx有一个随机k-正则函数 图:

    networkx.random_regular_graph(k, n)
    

    对于非平方矩阵,你所描述的是同构于随机的 biregular graph

        2
  •  1
  •   Prune    7 年前

    首先,做前期工作,这样我们就可以得到平方矩阵的大小和总体 pop 每一行和每一列。现在,初始化一个矩阵 对角线上的那些。如果n=6和pop=3

    [[1, 1, 1, 0, 0, 0]
     [0, 1, 1, 1, 0, 0]
     [0, 0, 1, 1, 1, 0]
     [0, 0, 0, 1, 1, 1]
     [1, 0, 0, 0, 1, 1]
     [1, 1, 0, 0, 0, 1]]
    

    现在,申请你友好的邻居 random shuffle 对列执行操作,然后对行执行操作(或按其他顺序)。这是你的矩阵。仅行或列的洗牌不会改变任一轴上的总体。