如何创建0和1的矩阵,使行和列总和为特定值?

时间:2018-04-05 11:54:18

标签: javascript python r matrix random

我需要生成一个包含n列和m行的矩阵,其中每个单元格可以是01,这样每列中的数字总和等于c和每行中的数字总和等于r。如果它不可能(大多数情况下可能),它的列总和应为c+/-d,行应为r+/-d,以便max(d在所有行和列上)与可能。换句话说,行的每个总和应该接近r,并且每列的总和应该接近c

为了说明当没有完美解决方案时我正在寻找什么,这个解决方案:

1.1.1.......
1.1.1.......
...1..1...1.
...1.1..1...
....1...1..1

比这个解决方案更好:

1.1.1.......
1.1.1.......
...1..1...1.
...1.1..1...
....11..1...

因为最后一行与前一个解决方案的总和为0(与1相比),所述解决方案远离所需的行总和为2.

创建一个仅适用于行的矩阵很容易 - 采用精确r 1s的矢量排列。 如何满足第二个条件呢?找到一个总和太高而另一个太低并且交换一些数字的列?这会有所帮助吗,需要多长时间,是否会终止,如果不可能获得完美的结果,我该什么时候停止?还有更好的方法吗?

您可以使用伪代码或您选择的语言,或者只使用随机模糊。

我发现Finding if binary matrix exists given the row and column sums谈到了回答它是否可能,甚至在可能的情况下构建解决方案。如果不可能,这样的解决方案会有很大的差异。

还有一篇文章https://www.sciencedirect.com/science/article/pii/S0012365X06003980我不太了解,但似乎也关注构建完美的解决方案

2 个答案:

答案 0 :(得分:2)

这可以通过整数线性编程来完成。

.et_pb_portfolio_item {
    overflow: hidden;
}

答案 1 :(得分:1)

您可以使用igraph包中的sample_degseq函数来创建具有给定顶点度数的图形。该图的邻接矩阵将具有您想要的属性。

library(igraph)
row_col_sum = 3 
dim = 8
g = sample_degseq(rep(row_col_sum,dim), method = "simple.no.multiple")
as_adj(g)

输出:

8 x 8 sparse Matrix of class "dgCMatrix"

[1,] . . . . . 1 1 1
[2,] . . 1 1 1 . . .
[3,] . 1 . . 1 . 1 .
[4,] . 1 . . . 1 . 1
[5,] . 1 1 . . . 1 .
[6,] 1 . . 1 . . . 1
[7,] 1 . 1 . 1 . . .
[8,] 1 . . 1 . 1 . .

希望这有帮助!