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

2024-04-19 00:08:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用图论的术语来说明这个问题,但是概念化不是必须的。

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

例如,输出将是:

^{pr2}$

注意,每列每行都有两个。除了这个约束之外,它们的位置应该是随机的(并且随着函数的调用而变化)。

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


Tags: ofto函数number数量节点connectionpost
2条回答

对于正方形矩阵,你所描述的是随机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-正则无向图的函数:

^{pr2}$

对于非方阵,你所描述的是同构的随机biregular graph。我发现对于随机双正则图,没有方便的现有实现,但是这个术语应该是搜索已知算法的良好起点。在

首先,做准备工作,这样我们就可以得到方阵的大小和每行和每列的总体数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操作应用于列,然后应用于行(或按其他顺序)。这是你的矩阵。仅行或列的无序排列不会改变任一轴上的填充。在

相关问题 更多 >