为所有节点创建具有相同入度和出度的矩阵
Create matrix with same in and out degree for all nodes
我已经用图论术语说明了这个问题,但没有必要概念化。
我想做的是,使用 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]]
注意,每一列和每一行都有两个。除了这个限制,它们的位置应该是随机的(并且随着这个函数的调用而变化)。
在图论术语中,这意味着每个节点的入度为 2,出度为 2(所有可能连接的 50%,由 p = 0.5
指定)。
首先做前期工作,得到方阵的大小和每行每列的人口pop
。现在,用 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
操作应用于列,然后是行(或以其他顺序)。这是你的矩阵。仅行或仅列的洗牌不会改变任一轴上的人口。
对于方阵,你描述的是一个随机的邻接矩阵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。我发现随机双正则图没有方便的现有实现,但该术语应该是搜索已知算法的良好起点。
我已经用图论术语说明了这个问题,但没有必要概念化。
我想做的是,使用 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]]
注意,每一列和每一行都有两个。除了这个限制,它们的位置应该是随机的(并且随着这个函数的调用而变化)。
在图论术语中,这意味着每个节点的入度为 2,出度为 2(所有可能连接的 50%,由 p = 0.5
指定)。
首先做前期工作,得到方阵的大小和每行每列的人口pop
。现在,用 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
操作应用于列,然后是行(或以其他顺序)。这是你的矩阵。仅行或仅列的洗牌不会改变任一轴上的人口。
对于方阵,你描述的是一个随机的邻接矩阵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。我发现随机双正则图没有方便的现有实现,但该术语应该是搜索已知算法的良好起点。