这是一个适合你的数学大脑。我有一个矩阵,实际上是它的一半矩阵,对角切割。矩阵的每个元素可以是 1 或 0 。我需要为宽度 N 的任何矩阵找到 1 s和 0 的所有可能组合。
这很容易,对于这个例子,你可以得到宽度 N 和的矩阵的元素数量,其中 N = 7 这样会给我们 28 或元素数量。然后,您可以使用获得组合。
因此公式将为以获得所有可能的组合。
现在这里变得棘手。有一个条件必须适用于每个结果。矩阵上每组元素的总和(如下所示,每行表示)对于第一组(第一行中的一组)必须小于4,对于所有其他组,小于3(这些是常量,无论如何)的N值)。
以下是此示例的集合( N = 7 )的样子。如果您注意到每一行都有代表。因此,对于第一组,如果组合 0 1 0 1 0 1 0 ,这将是有效的,因为其总和是< 4(因为它的第一行)。对于第二组,如果组合是 1 0 0 0 0 1 0 ,则它是有效的,因为它需要< 3。
我需要为巨大的矩阵做这个,所以粗暴强迫所有可能的排列找到属于这种情况的那些将是不可行的。我需要找到一些算法,我可以使用它来自下而上自上而下生成有效矩阵。也许做一些单独的操作,可以在以后编写,以产生一组完整的结果。
欢迎任何和所有想法。
答案 0 :(得分:2)
递归生成每个解决方案的简单算法:
global File //A file where you will store your data
global N //Your matrix size
//matrix contains the matrix we build (int[][])
//set contains the number of 1 we can use on a set (int[])
//c is the column number (int)
//r is the row number (int)
function f ( matrix, set, c, r ) :
if ( c == N ):
r = r + 1
c = r
if ( r == N ):
write ( matrix in File )
// Implement your own way of storing the matrix
if ( set[r] > 0 AND (c+2 < N AND set[c+2] > 0) ):
matrix[c][r] = 1
set[c]--
set[r]--
f ( matrix, set, c+1, r )
matrix[c][r] = 0
f ( matrix, set, c+1, r)
end
//Calling our function with N = 5
N = 5
f([[0,0,0,0,0],[0,0,0,0,0],...], [3,2,2,2,2], 0, 0)
您可以将每个矩阵存储在除文件之外的其他内容中,但要注意内存消耗。
答案 1 :(得分:0)
这是一个入门的基本想法;但是,对于评论而言,它太大了,但不是一个完整的答案。
这个想法是从最大限度地填充&#39;开始。矩阵而不是空的,然后填充它。
从填充了最大行数1
的所有行填充的矩阵开始,即行0有4 1
s,其他行各有3 1
s。然后,开始检查条件。条件0(第0行)自动满足。对于其他条件,要么满意,要么条件集中1
太多:取走1
s直到条件满足为止。适用于所有条件。
这样做,最终得到满足所有条件的矩阵。现在,您可以将任何1
更改为0
,矩阵仍将满足所有条件。所以,一旦你有一个最大的&#39;解决方案,您可以轻松生成所有子解决方案。