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

时间:2018-08-14 19:57:18

标签: python algorithm numpy matrix graph-theory

我已经用图论的术语提出了这个问题,但是概念化不是必需的。

我要使用Python进行的操作是产生一个零和一的矩阵,其中每一行具有相同的个数,而每一列具有相同的个数。当行数(发送节点)不等于列数(接收节点)时,行数将与列数不同-这是我允许的。

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(p = 0.5指定的所有可能连接的50%)。

2 个答案:

答案 0 :(得分:3)

对于平方矩阵,您描述的是随机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同构。我发现对于随机双正则图没有方便的现有实现,但是该术语应该是搜索已知算法的良好起点。

答案 1 :(得分:1)

首先,进行准备工作,以便我们可以使用方矩阵的大小以及每一行和每一列的总体 //Create canvas var svg = d3.select("svg"), margin = {top: 20, right: 20, bottom: 30, left: 50}, width = +svg.attr("width") - margin.left - margin.right, height = +svg.attr("height") - margin.top - margin.bottom, g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")"); //Parse date var parseDate = d3.timeParse("%Y-%m-%d"); //Set the ranges var x = d3.scaleTime() .range([0, width]); var y = d3.scaleLinear() .range([height, 0]); 。现在,用对角线上的pop初始化矩阵。对于n = 6和pop = 3,您将拥有

pop

现在,将友好的[[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]] 操作应用于列,然后是行(或以其他顺序)。有你的矩阵。仅排行或仅列的随机排列不会更改任一轴上的填充。