Create matrix with same in and out degree for all nodes

邮差的信 提交于 2021-01-27 10:36:17

问题


I've stated this question in graph theory terms, but that conceptualization isn't necessary.

What I'm trying to do, using Python, is produce a matrix of zeros and ones, where every row has the same number of ones and every column has the same number of ones. The number for rows will not be the same as the number for columns when the number of rows (sending nodes) does not equal the number of columns (receiving nodes) -- which is something I'm allowing.

It makes sense to me to do this in numpy, but there may be other packages (like networkx?) that would help.

Here's the function I'm looking to write with the desired inputs and outputs:

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

The output would be, for example:

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

Notice, every column and every row has two ones in it. Aside from this constraint, the positions of the ones should be random (and vary from call to call of this function).

In graph theory terms, this means every node has an in-degree of 2 and an out-degree of 2 (50% of all possible connections, as specified with p = 0.5).


回答1:


For a square matrix, what you describe is the adjacency matrix of a random k-regular directed graph, and there are known algorithms to generate such graphs. igraph implements one:

# 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 has a function for random k-regular undirected graphs:

networkx.random_regular_graph(k, n)

For a non-square matrix, what you describe is isomorphic to a random biregular graph. I have found no convenient existing implementation for random biregular graphs, but the term should be a good starting point for searching for known algorithms.




回答2:


First, do the pre-work so that we have available the size of the square matrix and the population pop of each row and column. Now, initialize a matrix with pop ones on the diagonal. For n = 6 and pop = 3, you'd have

[[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]]

Now, apply your friendly neighborhood random shuffle operation to the columns, then the rows (or in the other order). There's your matrix. A shuffle of rows-only or columns-only does not change the population on either axis.



来源:https://stackoverflow.com/questions/51848913/create-matrix-with-same-in-and-out-degree-for-all-nodes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!