我需要生成一个包含n
列和m
行的矩阵,其中每个单元格可以是0
或1
,这样每列中的数字总和等于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我不太了解,但似乎也关注构建完美的解决方案
答案 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 . .
希望这有帮助!