我已经用图论的术语提出了这个问题,但是概念化不是必需的。
我要使用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%)。
答案 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]]
操作应用于列,然后是行(或以其他顺序)。有你的矩阵。仅排行或仅列的随机排列不会更改任一轴上的填充。