【发布时间】:2018-04-05 11:54:17
【问题描述】:
我需要生成一个包含n 列和m 行的矩阵,其中每个单元格可以是0 或1,这样每列中的数字之和等于c 和中的数字之和每行等于r。如果不可能(大部分时间可能),它应该有列总和到c+/-d 和行到r+/-d 以便 max(d over all rows and columns) 尽可能小。换句话说,每一行的总和都应该接近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,它谈到了回答是否可能,甚至在可能的情况下构建解决方案。如果不可能,这样的解决方案将有非常大的 ds。
还有这篇论文https://www.sciencedirect.com/science/article/pii/S0012365X06003980,我不是很懂,但似乎也与构建完美解决方案有关
【问题讨论】:
标签: javascript python r matrix random